ベクトルDB構築講座
初心者向けガイド

🎯 本講座の目標

プログラミング経験が少ない方でも、ベクトルデータベースの基本概念から実際の構築まで理解できることを目指します。特にpgvectorを使った実践的な構築手順を、図解を中心に分かりやすく説明します。

1. ベクトルDBとは?基本概念の理解

1.1 従来のデータベースとの違い

従来のDB
テキスト検索
完全一致
キーワード検索
ベクトルDB
意味検索
類似度
意味理解検索
りんごで検索
→りんごだけヒット
りんごで検索
→apple果物もヒット

🔍 ベクトルDBの特徴

1.2 ベクトル化の仕組み

テキスト
犬は可愛い動物です
AI処理
埋め込みモデル
ベクトル:数値の配列
[0.2, -0.1, 0.8, 0.3, ...]
データベースに保存
高速検索可能

2. システム全体アーキテクチャ

2.1 RAGシステムの全体像

データ層
AI処理層
アプリケーション層
ユーザー層
ベクトルDB
pgvector
ドキュメント
PostgreSQL
埋め込みモデル
テキスト→ベクトル変換
大規模言語モデル
回答生成
Webアプリ
チャットUI
FastAPI
バックエンド
ユーザー

2.2 データフローの詳細

📄 データ投入フロー

ベクトルDB埋め込みモデル前処理元ドキュメントベクトルDB埋め込みモデル前処理元ドキュメントインデックス構築で高速検索準備完了1. テキスト分割2. ベクトル化依頼3. ベクトル生成4. DB保存

🔍 検索・回答フロー

LLMベクトルDB埋め込みモデルAPIユーザーLLMベクトルDB埋め込みモデルAPIユーザー1. 質問送信2. 質問をベクトル化3. 類似検索実行4. 関連文書取得5. 文書+質問でAI回答生成6. 回答テキスト7. 最終回答

3. pgvectorの特徴と選択理由

🐘 PostgreSQL拡張

既存のPostgreSQLに追加するだけで使用可能。学習コストが低い。

⚡ 高速検索

HNSWアルゴリズムによる近似最近傍検索で大量データも高速処理。

💰 コスト効率

専用ベクトルDBサービスと比べて運用コストを大幅削減。

🔧 運用性

PostgreSQLの豊富な運用ツールがそのまま利用可能。

3.1 他のベクトルDBソリューションとの比較

項目 pgvector Pinecone Chroma Weaviate
導入難易度 ★★☆☆☆ ★★★☆☆ ★★☆☆☆ ★★★★☆
運用コスト
スケーラビリティ
既存システム統合 容易 API連携 API連携 API連携

4. 構築ステップ(段階的実装)

⚠️ 構築前の準備

  1. 環境準備:PostgreSQL + pgvector

    Docker Desktop
    PostgreSQL
    コンテナ起動
    pgvector
    拡張インストール
    データベース
    準備完了

    実施内容:Docker Composeを使用してPostgreSQLサーバーを起動し、pgvector拡張を有効化します。

  2. テーブル設計:文書とベクトルの格納

    DOCUMENTSuuididPKtextcontenttextmetadatatimestampcreated_atDOC_EMBEDDINGSserialidPKuuiddoc_idFKvector-1536embeddingtextversion1対1関係

    実施内容:文書テーブルとベクトルテーブルを分離設計。将来の再埋め込みに対応した構造にします。

  3. 埋め込みモデル選択:用途別最適化

    学習・開発
    本番運用
    高速プロトタイプ
    埋め込みモデル選択
    使用目的
    ローカルモデル
    multilingual-e5-large
    AWS Bedrock
    Titan Embeddings
    OpenAI
    text-embedding-3-small
    コスト: 無料
    速度: 中
    精度: 高
    コスト: 低
    速度: 高
    精度: 高
    コスト: 中
    速度: 高
    精度: 高

    実施内容:環境変数一つで切り替え可能な設計。開発時は無料のローカルモデル、本番ではクラウドサービスを使用。

  4. データ投入:バッチ処理による効率化

    元データ
    CSV/JSON/PDF
    テキスト抽出
    前処理
    チャンク分割
    適切なサイズ
    バッチ処理
    100件ずつ
    ベクトル化
    埋め込みモデル
    DB保存
    トランザクション
    インデックス構築
    HNSW

    実施内容:大量データを効率的に処理するためのバッチシステム。エラー処理と進捗監視機能付き。

  5. 検索API実装:RESTful設計

    HTTP POST
    クライアント
    FastAPI
    /v1/rag/search
    クエリベクトル化
    類似度検索
    コサイン距離
    結果フィルタリング
    Top-K選択
    JSON応答
    スコア付き

    実施内容:標準的なREST APIとして実装。リクエスト検証、エラーハンドリング、ログ出力機能を含む。

  6. ユーザーインターフェース:チャット形式

    Webブラウザ
    チャットUI
    HTML/CSS/JS
    検索API呼び出し
    結果表示
    スコア・出典付き
    ユーザーフィードバック
    良い・悪い

    実施内容:直感的なチャットインターフェース。検索結果の信頼性を示すスコア表示機能付き。

  7. 品質評価:継続的改善

    評価データセット
    質問・正解ペア
    自動評価
    Recall/MRR算出
    品質レポート
    改善提案
    モデル調整
    パラメータ最適化
    再評価
    改善確認

    実施内容:定量的な品質指標による評価システム。週次での品質トレンド監視と改善提案。

5. データの流れ詳細フローチャート

5.1 データ投入プロセス

PDF
CSV
JSON
📄 原始データ
データ形式判定
PDF解析
テキスト抽出
構造化データ
読み込み
JSONパース
フィールド抽出
前処理
ノイズ除去
チャンク分割
512トークン単位
メタデータ付与
ID・日時・カテゴリ
埋め込み生成
ベクトル化
データベース保存
バッチ処理
インデックス更新
HNSW再構築
✅ 投入完了
検索準備OK

5.2 リアルタイム検索プロセス

Yes
No
🔍 ユーザー質問
入力検証
サニタイズ
クエリベクトル化
同一モデル使用
類似度検索実行
pgvector
検索結果あり?
Top-K選択
閾値フィルタ
デフォルト応答
検索範囲拡大提案
結果ランキング
スコア正規化
コンテキスト構築
関連文書統合
LLM呼び出し
回答生成
回答検証
ハルシネーション検出
📝 最終回答
出典付き

6. 実際の構成例:3つのパターン

6.1 開発・学習環境(完全ローカル)

ローカルマシン
Docker環境
PostgreSQL + pgvector
Webブラウザ
8000ポート
FastAPI アプリケーション
sentence-transformers
ローカル埋め込み

特徴:

6.2 本番環境(AWSクラウド)

AWS環境
ECS Fargate
RDS
Bedrock
CloudFront CDN
Route53 DNS
Titan Embeddings API
PostgreSQL + pgvector
FastAPI Container
インターネット
ユーザー

特徴:

6.3 ハイブリッド環境(段階的移行)

本番フェーズ
検証フェーズ
開発フェーズ
検証OK
品質OK
改善
本番環境
サービス提供
クラウド環境
負荷テスト
ローカル環境
プロトタイプ開発

移行戦略:

7. よくある質問(FAQ)

Q1. ベクトルDBは従来のRDBMSを置き換えるものですか?

A: いいえ。ベクトルDBは従来のRDBMSと併用するものです。構造化データの管理はRDBMS、意味検索や類似度検索はベクトルDBが担当するハイブリッド構成が一般的です。

Q2. どの程度のデータ量まで対応できますか?

A: pgvectorの場合、数百万件程度までは単一サーバーで対応可能です。それ以上の規模ではシャーディング専用ベクトルDBサービスの検討が必要です。

Q3. 埋め込みモデルを変更する場合はどうすればいいですか?

A: バージョン管理機能を使用して安全に変更できます。新しいモデルで別テーブルに埋め込みを生成し、検証後に無停止で切り替えが可能です。

Q4. 日本語以外の言語にも対応していますか?

A: はい。使用する埋め込みモデルによって対応言語が決まります。multilingual-e5-largeは100以上の言語に対応しており、多言語検索が可能です。

Q5. セキュリティ面での注意点はありますか?

A: 主な注意点は以下の通りです:

Q6. 運用監視で重要な指標は何ですか?

A: 以下の指標を継続的にモニタリングしてください:

🎓 次のステップ

基本概念を理解したら、実際に手を動かして構築してみましょう。

  1. 環境構築:Docker環境での基本セットアップ
  2. サンプルデータ投入:小規模データでの動作確認
  3. 検索テスト:様々なクエリでの動作検証
  4. 品質改善:評価指標による継続的改善
  5. 本番展開:クラウド環境への移行

各ステップで困ったことがあれば、コミュニティやドキュメントを活用して解決していきましょう。

第二章:pgvectorベクトルDB構築の詳細手順

📚 本章の学習目標

第一章で学んだベクトルDBの基本概念を踏まえ、実際のpgvectorによる構築手順を段階的に理解します。特に現場で詰まりやすいポイント精度向上のコツを重点的に解説します。

1. 目的とゴール設定(なぜpgvectorなのか)

1.1 従来のDB検索との課題比較

課題 従来のDB検索 pgvectorベクトルDB
同義語検索 ❌ 辞書登録が必要 ✅ 自動で意味理解
表記ゆれ ❌ パターン登録必須 ✅ 埋め込みで吸収
多言語対応 ❌ 言語別索引必要 ✅ 統一モデルで対応
コンテキスト理解 ❌ キーワードのみ ✅ 文脈まで考慮

🎯 本講座での目標精度

1.2 pgvector選定の理由

既存PostgreSQL利用
超大規模
1億件以上
高度な機能
必要
ベクトルDB選定
要件チェック
pgvector
★推奨★
専用サービス
Pinecone/Weaviate
マネージド
Elasticsearch/OpenSearch
✅ 既存スキル活用
✅ 運用コスト低
✅ データ移行不要
✅ スケール性
❌ コスト高
❌ ベンダーロックイン
✅ 機能豊富
❌ 学習コスト
❌ 運用複雑

2. 構築準備:バージョンと環境選定

2.1 PostgreSQLバージョン選定

⚠️ バージョン選定の重要ポイント

PostgreSQL 13以上を推奨します。理由は以下の通り:

PostgreSQLバージョン pgvector対応 推奨度 備考
11以前 ⚠️ 限定的 ❌ 非推奨 パフォーマンス・機能制限
12 ✅ 対応 ⚠️ 可 並列処理が弱い
13-14 ✅ 完全対応 ✅ 推奨 安定性・性能良好
15+ ✅ 完全対応 ⭐ 最推奨 最新機能・最適化

2.2 環境選定:クラウド vs ローカル

学習・開発
検証・テスト
本番運用
環境選定
用途
ローカル環境
Docker
クラウド
RDS/CloudSQL
マネージドDB
Aurora/AlloyDB
メリット
💰無料
🔒セキュア
⚡即開始
メリット
📊本番に近い
🔄簡単切替
💾バックアップ自動
メリット
🚀高性能
🛡高可用性
📈自動スケール

💡 段階的な環境構築アプローチ

データ移行
検証OK後
Step1
ローカルDocker
Step2
クラウドRDS
開発用
Step3
本番環境
Aurora等

推奨戦略:ローカルで設計・開発を完了させ、クラウドで負荷テスト、最後に本番環境へ移行

2.3 権限・ユーザー設計

🔐 よくある権限設定の失敗例

✅ 推奨:最小権限の原則

DBユーザー設計
管理者ユーザー
アプリケーションユーザー
読み取り専用ユーザー
権限:
- 拡張インストール
- スキーマ変更
- ユーザー管理
権限:
- SELECT/INSERT/UPDATE
- インデックス作成
- 特定スキーマのみ
権限:
- SELECT のみ
- 分析・レポート用

3. pgvector拡張の導入

3.1 インストール方法(環境別)

Ubuntu/Debian
CentOS/RHEL
macOS
AWS RDS
Docker
pgvectorインストール
環境選択
apt-get install
yum/dnf install
Homebrew
拡張ライブラリ有効化
公式イメージ使用
✅ パッケージ管理
自動更新
✅ マネージド
バージョン管理不要
✅ 再現性
環境統一

⚠️ インストール時の注意点

3.2 拡張の有効化手順

📝 有効化の基本フロー

pgvector拡張PostgreSQL管理者pgvector拡張PostgreSQL管理者1. データベース接続2. CREATE EXTENSION vector3. 拡張ロード4. 新しい型・関数登録5. 完了通知6. バージョン確認7. vector 0.x.x

🔍 正常に有効化されたか確認する方法

以下の内容が確認できればOKです:

4. テーブル設計:高精度を実現する構造

💡 テーブル設計の重要性

ベクトルDBの精度は70%がテーブル設計で決まると言われています。ここでの設計ミスは後から修正が困難なため、最も時間をかけるべきセクションです。

4.1 ベクトルカラムの型と次元数

⚠️ 次元数決定の重要ポイント

次元数は埋め込みモデルで決定され、後から変更不可

💡 モデル変更時はテーブル再作成または別カラム追加が必要

OpenAI
multilingual-e5
Titan
モデル変更予定
固定モデル
テーブル設計開始
埋め込みモデル選択
vector1536次元
vector1024次元
vector1536次元
テーブル作成
将来の拡張性
バージョンカラム追加
embedding_v1, v2...
単一カラムで運用

4.2 推奨テーブル構造

📋 基本構造(documents + embeddings分離)

DOCUMENTSuuididPK一意識別子textcontent元テキストjsonbmetadataメタデータtimestampcreated_at作成日時timestampupdated_at更新日時textsourceデータソースDOC_EMBEDDINGSserialidPK自動採番uuiddoc_idFKドキュメントIDvector_1536embeddingベクトルtextmodel_versionモデルバージョンtextembedding_version埋め込みバージョンtimestampcreated_at生成日時1対多

分離設計のメリット:

4.3 メタデータ設計の戦略

🎯 メタデータの活用場面

メタデータ
検索フィルタ
分析・集計
品質管理
権限制御
日付範囲
カテゴリ
言語
人気度
クリック率
精度指標
データソース
品質スコア
更新頻度
所有者
公開範囲
テナント
メタデータ項目 用途 検索での活用
category text カテゴリ分類 ✅ WHERE句でフィルタ
published_date timestamp 日付範囲検索 ✅ 期間指定検索
language text 多言語対応 ✅ 言語別結果
quality_score float 品質管理 ✅ 低品質除外
tags text[] タグ検索 ✅ タグマッチング

4.4 インデックス設計(検索速度の鍵)

⚠️ インデックス設計の失敗例

✅ 推奨インデックス戦略

インデックス設計
ベクトル用
メタデータ用
複合用
IVFFlat/HNSW
類似度検索用
B-tree
日付・カテゴリ用
複合インデックス
頻出WHERE条件
作成タイミング:
データ投入後
作成タイミング:
テーブル作成時
作成タイミング:
運用パターン確認後

5. データ投入と前処理

5.1 埋め込みモデルの選定

モデル 次元数 精度 速度 コスト 推奨用途
OpenAI text-embedding-3-small 1536 ⭐⭐⭐⭐ ⚡⚡⚡ 💰💰 バランス型・本番
multilingual-e5-large 1024 ⭐⭐⭐⭐⭐ ⚡⚡ 💰(無料) 多言語・開発
AWS Titan Embeddings 1536 ⭐⭐⭐⭐ ⚡⚡⚡⚡ 💰 AWS環境・本番
sentence-transformers(各種) 384-1024 ⭐⭐⭐ 💰(無料) カスタマイズ・実験

💡 モデル選定の判断フロー

無料で試したい
商用予算あり
日本語メイン
多言語
AWS
マルチクラウド
モデル選定開始
予算
言語
環境
multilingual-e5-large
Titan Embeddings
OpenAI
✅ ローカル実行
データ外部送信なし
✅ AWS統合
低レイテンシ
✅ 高精度
豊富な実績

5.2 ベクトル正規化の重要性

⚠️ 正規化を怠ると起こる問題

✅ L2正規化の効果

元ベクトル
[3, 4, 0]
長さ=5
L2正規化
正規化済
[0.6, 0.8, 0]
長さ=1
別ベクトル
[30, 40, 0]
長さ=50
L2正規化
正規化済
[0.6, 0.8, 0]
長さ=1
✅ 同じ方向なら
同じベクトルに

効果:テキスト長の影響を排除し、純粋な「意味の類似性」のみで比較可能

5.3 バッチ投入の設計

🔄 大量データ投入の戦略

~1000件
1000~10万件
10万件以上
データ投入計画
データ量
単純INSERT
バッチINSERT
100件ずつ
COPY コマンド
+ 並列処理
シンプル
エラー処理容易
バランス型
進捗管理可能
高速
専用ツール必要

⚠️ バッチ処理でよくある失敗

✅ 推奨バッチ処理フロー

ログDB埋め込み生成前処理データソースログDB埋め込み生成前処理データソースloop[100件ごと]エラー時は最終成功位置から再開1. データ読込2. バッチ埋め込み要求3. ベクトル返却4. 正規化処理5. トランザクション開始6. INSERT実行7. コミット8. 進捗記録(100件完了)

6. 検索クエリ設計

6.1 類似度演算子の選択

演算子 距離指標 特徴 推奨用途
<-> L2距離(ユークリッド) 直線距離を計算 正規化済みベクトル
<=> コサイン距離 方向の類似度 ★ 最推奨(テキスト検索)
<#> 内積 大きさ×方向 推薦システム

📐 距離指標の視覚的理解

ベクトル比較
L2距離
コサイン距離
内積
座標空間での
直線距離
★ ベクトル間の
角度を測定
方向と大きさの
積を計算
テキスト検索で
最も高精度

推奨:テキスト検索ではコサイン距離(<=>)を使用

6.2 WHERE句による絞り込み

🎯 精度向上のためのフィルタ戦略

検索クエリ設計
ベクトル類似検索
メタデータフィルタ
意味的類似性
期間指定
カテゴリ
言語
品質閾値
結果統合
✅ 高精度な
検索結果

⚠️ WHERE句使用時の注意点

6.3 実運用での検索パターン

📊 現場でよく使われる検索パターン

パターン1:基本的な類似検索

用途:シンプルな意味検索

ユーザー質問
ベクトル化
類似度計算
上位K件取得
パターン2:フィルタ付き検索

用途:特定期間・カテゴリ内検索

ユーザー質問
条件指定
期間・カテゴリ
WHERE句フィルタ
ベクトル類似検索
絞り込み結果
パターン3:ハイブリッド検索

用途:キーワード + 意味検索の組み合わせ

ユーザー質問
キーワード抽出
ベクトル化
全文検索
tsvector
ベクトル検索
スコア統合
最終ランキング

7. インデックス最適化

7.1 インデックスタイプの選択

タイプ 構築速度 検索速度 精度 メモリ使用量 推奨データ量
インデックスなし - ❌ 遅い ✅ 完全 ✅ 低 ~1000件
IVFFlat ⚡ 速い ⚡⚡ 速い ⭐⭐⭐⭐ 💾 中 1万~100万件 ★推奨
HNSW ⚡⚡ 中速 ⚡⚡⚡ 高速 ⭐⭐⭐⭐⭐ 💾💾 高 10万件以上

🔍 IVFFlatの仕組み(視覚的理解)

全ベクトルデータ
クラスタリング
クラスタ1
10,000件
クラスタ2
10,000件
クラスタ3
10,000件
...
検索クエリ
最も近い
クラスタを特定
そのクラスタ内のみ
詳細検索
✅ 検索対象が
1/10に削減

原理:全データを探さず、近いクラスタ内だけを探すことで高速化

7.2 パラメータ調整の実践

⚠️ パラメータ調整の失敗例

✅ データ量別の推奨パラメータ

データ量 lists(クラスタ数) probes(探索数) 期待効果
~1万件 100 10 基本的な高速化
1万~10万件 √(データ量) 10-20 ★ バランス良好
10万~100万件 1000-3000 20-50 大規模対応

調整のコツ:lists = √(データ量) を基準に、精度とのバランスでprobesを調整

7.3 インデックス運用のタイミング

10%以上変化
10%未満
インデックスライフサイクル
作成
運用
更新判断
データ変化率
REINDEX実行
継続運用
定期メンテナンス
ANALYZE実行
統計情報更新

📅 推奨メンテナンススケジュール

8. 精度評価と改善サイクル

📊 精度評価の重要性

「測定できないものは改善できない」
定量的な評価なしに「なんとなく良くなった」では、継続的な改善は不可能です。

8.1 評価指標の理解

📐 主要指標の定義

Precision@K(適合率)
検索結果
上位K件
正解が
何件含まれるか
Precision@K =
正解数 / K
例: 上位5件中3件正解
Precision@5 = 3/5 = 60%
Recall@K(再現率)
全正解
10件
上位K件に
何件含まれるか
Recall@K =
ヒット数 / 全正解数
例: 全正解10件中7件ヒット
Recall@10 = 7/10 = 70%
MRR(Mean Reciprocal Rank)
各クエリの
最初の正解位置
逆数を計算
全クエリで平均
例1: 1位に正解
1/1 = 1.0
例2: 3位に正解
1/3 = 0.33
例3: 5位に正解
1/5 = 0.2
MRR = 平均
(1.0 + 0.33 + 0.2) / 3
= 0.51

8.2 評価データセットの作成

⚠️ 評価データ作成の落とし穴

✅ 推奨評価データ構成

カテゴリ 件数 内容例
基本クエリ 30件 頻出する典型的な質問
難易度高 20件 曖昧な表現・専門用語
エッジケース 10件 短文・長文・誤字含む
多言語 10件 英語・日本語混在等
合計 70件以上 統計的に信頼できる

8.3 継続的改善のサイクル

Yes
No
現状評価
課題分析
改善施策
実装・テスト
再評価
改善したか?
本番適用
別施策検討
モニタリング
定期レビュー
週次・月次

🔍 失敗パターン分析の実例

失敗パターン 原因 改善施策
短文クエリで精度低 情報量不足 クエリ拡張・同義語追加
専門用語で失敗 モデルが未学習 ドメイン特化モデル検討
古い情報が上位 日付考慮なし 日付重み付け・フィルタ追加
同じ内容の重複 重複排除なし 類似度閾値で重複除外

9. 運用とバックアップ

9.1 バックアップ戦略

バックアップ戦略
論理バックアップ
物理バックアップ
継続的バックアップ
pg_dump
スキーマ+データ
ファイルシステム
スナップショット
WALアーカイブ
ポイントインタイム復旧
復旧: 遅い
柔軟性: 高
復旧: 速い
柔軟性: 低
復旧: 精密
コスト: 高

✅ 推奨バックアップ構成

9.2 障害復旧手順

⚠️ 障害発生時の対応フロー

DBバックアップ管理者監視システムDBバックアップ管理者監視システムalt[軽微な障害][データ破損]1. 障害アラート2. 状態確認3. エラー詳細4. 復旧方法判断5a. サービス再起動5b. バックアップ取得6. 最新バックアップ7. リストア実行8. 動作確認9. 復旧完了報告

9.3 バージョンアップ戦略

🔄 安全なバージョンアップ手順

事前準備
検証環境
本番適用
監視強化
・互換性確認
・バックアップ
・ロールバック計画
・動作テスト
・性能測定
・問題点洗い出し
・メンテナンス時間
・段階的適用
・即時切り戻し準備
・エラー監視
・性能監視
・1週間継続

⚠️ バージョンアップ時の注意点

10. 全体フローのまとめ

10.1 構築から運用までの全体像

No
Yes
1. 計画・設計
2. 環境構築
3. テーブル設計
4. データ投入
5. インデックス作成
6. 検索API実装
7. 精度評価
目標達成?
改善施策
再投入 or 再設計
8. 本番リリース
9. 運用監視
継続的改善

10.2 チェックリスト

✅ 構築完了チェックリスト

設計フェーズ
構築フェーズ
評価フェーズ
運用フェーズ

10.3 よくあるトラブルシューティング

症状 原因 対処方法
検索が遅い(1秒以上) インデックス未作成 or 不適切 インデックス作成・パラメータ見直し
精度が低い(50%以下) モデル不適合 or 正規化なし モデル変更・正規化実装
メモリ不足エラー バッチサイズ大きすぎ バッチサイズ縮小(100件程度)
拡張有効化失敗 権限不足 or バージョン不適合 スーパーユーザー権限確認・バージョン確認
検索結果が0件 WHERE句が厳しすぎ フィルタ条件緩和・確認

🎓 第二章のまとめ

本章では、pgvectorを使った実践的なベクトルDB構築手順を学びました。

重要ポイントの復習

次のステップ:第三章では、Difyとの統合やLLMとの連携について学習します。