ストーリー
ベクトル検索とキーワード検索の比較
| 観点 | ベクトル検索(Dense Retrieval) | キーワード検索(Sparse Retrieval / BM25) |
|---|---|---|
| 原理 | テキストのEmbedding間の類似度 | 単語の出現頻度(TF-IDF / BM25) |
| 強み | 意味的な類似度を捉える | 正確なキーワードマッチ |
| 弱み | 固有名詞や型番に弱い | 言い換えや同義語に弱い |
| 例(得意) | 「デプロイ手順」→「リリースプロセス」 | 「ECS-2847」→チケット番号の完全一致 |
| 例(不得意) | 「ECS-2847」→意味的に関係ない結果 | 「デプロイ手順」→「リリースプロセス」は不一致 |
検索精度の補完関係:
ベクトル検索が得意 キーワード検索が得意
┌──────────────┐ ┌──────────────┐
│ 意味的な類似度 │ │ 完全一致 │
│ 言い換え対応 │ ←→ │ 固有名詞 │
│ 曖昧な質問 │ │ 型番・コード │
└──────────────┘ └──────────────┘
↓
ハイブリッド検索
(両方の強みを活用)
BM25の仕組み
BM25スコアリング
BM25(Best Matching 25)はキーワード検索の標準的なスコアリングアルゴリズムです。
BM25スコアの要素:
1. TF(Term Frequency): 検索語がドキュメント内に何回出現するか
→ 多く出現するほどスコアが高い(ただし飽和する)
2. IDF(Inverse Document Frequency): 検索語がどれだけ珍しいか
→ 珍しい語ほどスコアが高い(「の」「は」等の一般語は低スコア)
3. 文書長の正規化: ドキュメントの長さを考慮
→ 短いドキュメントで出現する方がスコアが高い
BM25(q, d) = Σ IDF(qi) × (TF(qi, d) × (k1 + 1)) / (TF(qi, d) + k1 × (1 - b + b × |d|/avgdl))
k1 = 1.2〜2.0(TFの飽和速度)
b = 0.75(文書長の正規化度合い)
Sparse Embeddingによる実装
一部のベクトルDBはBM25をSparse Embeddingとして実装しています。
| 手法 | 概要 |
|---|---|
| SPLADE | 学習済みSparse Embedding。BM25より高精度 |
| BM25 Sparse Vector | BM25のスコアをベクトル形式で格納 |
| Qdrant Sparse Vectors | Qdrantネイティブのスパースベクトルサポート |
ハイブリッド検索の実装パターン
パターン1: 並列検索 + 結果統合
ハイブリッド検索(並列パターン):
ユーザーのクエリ
├── [ベクトル検索] → Embedding → Top-K1
└── [キーワード検索] → BM25 → Top-K2
↓
[結果の統合(Fusion)]
↓
統合されたTop-K結果
パターン2: 段階的検索(Two-Stage)
ハイブリッド検索(段階的パターン):
ユーザーのクエリ
↓
[Stage 1: キーワード検索(BM25)]
→ 広く候補を取得(Top-100)
↓
[Stage 2: ベクトル検索(Reranking的に活用)]
→ 候補をEmbeddingで再スコアリング(Top-10)
Reciprocal Rank Fusion(RRF)
複数の検索結果を統合する最も一般的な手法です。
RRFの計算:
RRF_score(d) = Σ 1 / (k + rank_i(d))
k = 60(定数、一般的に60が使われる)
rank_i(d) = 検索手法iにおけるドキュメントdの順位
例:
ドキュメントA: ベクトル検索で1位、BM25で5位
RRF(A) = 1/(60+1) + 1/(60+5) = 0.0164 + 0.0154 = 0.0318
ドキュメントB: ベクトル検索で3位、BM25で2位
RRF(B) = 1/(60+3) + 1/(60+2) = 0.0159 + 0.0161 = 0.0320
→ ドキュメントBの方がRRFスコアが高い(両方で上位)
RRFの利点
| 利点 | 説明 |
|---|---|
| スコアの正規化が不要 | 順位ベースのため、異なるスコア体系の統合が容易 |
| パラメータが少ない | k=60のみ。チューニングが簡単 |
| 堅牢性 | 外れ値のスコアに影響されにくい |
| 実績 | 多くのRAGシステムで採用されている |
重み付きハイブリッド検索
ベクトル検索とキーワード検索の重みを調整するアプローチです。
| パラメータ | 設定例 | 用途 |
|---|---|---|
| alpha = 0.7 | ベクトル70%、キーワード30% | 一般的なナレッジ検索(意味重視) |
| alpha = 0.5 | ベクトル50%、キーワード50% | バランス型 |
| alpha = 0.3 | ベクトル30%、キーワード70% | 固有名詞・コードが多いドキュメント |
重みの調整ガイドライン:
クエリの特性を分析:
├── 「RAGの精度を上げるには?」→ 意味的なクエリ → alpha高め(0.7)
├── 「ECS-2847の対応状況」→ キーワード的なクエリ → alpha低め(0.3)
└── 自動判定: LLMでクエリの種類を分類し、alphaを動的に調整
「ハイブリッド検索の重みはデータとクエリの特性で決まる。A/Bテストで最適値を見つけるのが正道だ」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|---|
| ベクトル検索の限界 | 固有名詞や型番に弱い。キーワード検索で補完 |
| BM25 | キーワード検索の標準アルゴリズム。TF-IDFベース |
| ハイブリッド検索 | ベクトル検索 + キーワード検索の組み合わせ |
| RRF | 順位ベースの結果統合手法。シンプルで効果的 |
| 重み調整 | クエリの特性に応じてベクトル/キーワードの比率を調整 |
チェックリスト
- ベクトル検索とキーワード検索の強み・弱みを理解した
- BM25の基本的な仕組みを理解した
- RRFによる結果統合の計算方法を理解した
- 重み付きハイブリッド検索の調整方法を理解した
次のステップへ
次は「メタデータフィルタリング」を学びます。メタデータを活用したプリフィルタ/ポストフィルタで、検索結果の精度をさらに向上させましょう。
推定読了時間: 30分