TL

ハイブリッド検索(ベクトル×キーワード)

意味は分かるが型番に弱いベクトル検索と、語彙一致は強いが同義語に弱いキーワード検索を、RRFで安全に統合する設計原理が分かります。

応用ハイブリッド検索ベクトル検索全文検索RRFスコア統合検索エンジン最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.ベクトル検索とキーワード検索は失敗するクエリの種類が違う。意味的類似は捉えるが固有名詞・型番・略語に弱いベクトル、語彙一致は強いが同義語・言い換えに弱いBM25を、片方だけで運用すると必ず穴が残る。
  • 2.二つのスコアは尺度が異なり単純な足し算では統合できない。RRF(Reciprocal Rank Fusion)はスコアではなく順位だけを使い `1/(k+rank)` を各系列で足し合わせることで、正規化なしに頑健に統合する。
  • 3.統合方式にはRRFのほかクエリ側で埋め込みとBM25クエリを同時実行するタイプもあり、いつどちらの経路が支配的かを理解しておくとチューニングの勘所が分かる。

なぜ単体では足りないのか

HNSW/IVF-PQによるベクトル索引転置インデックス+BM25 は、それぞれ単独でも動く完結した仕組みです。しかし両者は失敗するクエリの種類が対称的に異なります

ベクトル検索は埋め込み空間上の距離で「意味の近さ」を捉えるため、言い換えや同義語(「解雇」と「クビ」)に強い一方、学習データで意味を持たない固有名詞・型番・エラーコード・略語ERR_502、製品型番XJ-4400)はベクトル空間上でうまく分離されず、埋め込みが潰れて無関係な結果を引きやすくなります。逆にBM25はトークン一致に基づくため型番や固有名詞の完全一致には滅法強い一方、クエリと文書が同じ語を共有しない言い換えには原理的にスコアが立ちません。

失敗パターンベクトル検索BM25キーワード検索
固有名詞・型番・エラーコード弱い(埋め込みが意味的に潰れる)強い(トークン完全一致)
同義語・言い換え・意図理解強い(意味空間で近接)弱い(語彙が一致しないとゼロ点)
新語・造語(学習データ外)弱い(埋め込みが未学習)強い(文字列として索引済みなら引ける)
この記事のスコープ

ベクトル索引そのものの内部(HNSWのグラフ探索、IVF-PQの量子化)は vector-index-hnsw-ivfpq を、BM25の数理と転置インデックスの構造は fulltext-inverted-index-bm25 を参照してください。本記事は両者を統合する層、すなわち二つの検索を実行してから一つの順位に合成するまでの原理に絞ります。

尺度が違う二つのスコアをどう混ぜるか

素朴には「ベクトル類似度スコアとBM25スコアを重み付き和で足せばよい」と考えたくなりますが、これは危険です。理由は二つのスコアがまったく異なる分布・尺度を持つからです。

  • コサイン類似度は基本的に0〜1(あるいは-1〜1)に収まるが、クエリによって上位群のスコア差がごく小さいこともあれば大きく開くこともある。
  • BM25スコアは上限がなく、クエリの語数・idf・文書長によって同じ「1位」でもスコアの絶対値が数倍変わる。

このため score = a * cos_sim + b * bm25 のような線形結合は、クエリごとに最適なa, bが変わってしまい、事前に固定した重みでは特定のクエリ分布に過学習します。スコアそのものを毎回min-max正規化して混ぜる手もありますが、母集団(そのクエリでヒットした集合)が変わるたびに正規化の基準が動くため、順位が不安定になりがちです。

RRF(Reciprocal Rank Fusion):順位だけを使う

この問題を回避する標準的な手法が RRF(Reciprocal Rank Fusion) です。核心のアイデアは「スコアの値を一切見ず、各検索結果内での**順位(rank)**だけを使う」ことにあります。

RRF(d) = Σ_i  1 / (k + rank_i(d))

  d       : 統合対象の文書
  i       : 各検索系列(例: ベクトル検索、BM25検索)
  rank_i(d): 系列 i における文書 d の順位(1位, 2位, ...)。系列 i に出現しなければ加算しない
  k       : 平滑化定数(原論文・実装の既定値は 60)

たとえば文書Aがベクトル検索で1位、BM25検索で圏外(未ヒット)、文書Bがベクトル検索で5位、BM25検索で2位だったとすると、k=60のとき次のように計算されます。

RRF(A) = 1/(60+1)                = 0.01639
RRF(B) = 1/(60+5) + 1/(60+2)     = 0.01538 + 0.01613 = 0.03151

両方の検索でそこそこ上位に来たBが、片方だけで1位のAを上回ります。これがRRFの本質的な性質で、「一つの系列で圧倒的だが他方で無視される文書」より「両系列である程度支持される文書」を優先します。

なぜ順位ベースが頑健なのか

順位は0からNまでの整数で、スコアの分布や尺度に依存しません。ベクトル検索のコサイン類似度がどんな分布であろうと、BM25のスコアがどれだけ暴れようと、「何位か」という情報だけを取り出せば両者は同じ土俵に乗ります。正規化パラメータのチューニングが不要になるのが、RRFが実務で広く採用される理由です。

k(平滑化定数)の役割にも注意が必要です。kを大きくすると1/(k+rank)の分母が支配的になり、上位と下位の差が緩やかになります(上位互恵の効果が弱まり、より多くの文書が横並びに近づく)。逆にkを小さくすると1位と2位の差が急峻になり、上位の系列一致がより強く効きます。k=60という既定値は、TRECのような大規模ベンチマークで経験的に安定した値として広まったもので、理論的な最適値の証明があるわけではありません。

RRFは再現率(recall)の穴を埋めない

RRFはあくまで二つの候補集合が出そろった後の順位統合です。ベクトル検索がそもそも真に関連する文書を候補にすら入れられなければ(recallの問題)、RRFはその文書を救えません。統合の前提として、各検索が候補集合(例えば上位100件ずつ)を十分な再現率で返していることが必要です。統合方式をいくら工夫しても、入力の候補集合が悪ければ結果も悪くなります。

実行経路:並列実行とクエリ側の設計

ハイブリッド検索の実行は典型的に次の流れを取ります。

1. クエリ文字列を受け取る
2. (a) クエリを埋め込みモデルでベクトル化 → ANN索引を検索 → 上位N件(ベクトル候補)
   (b) クエリをトークナイズ → 転置インデックスを検索 → 上位N件(BM25候補)
   ※ (a)と(b)は独立なので並列実行できる
3. 両候補集合の和集合に対しRRFでスコアを再計算
4. 統合スコア順に上位k件を返す

(a)と(b)は互いに独立したクエリなので並列実行でき、統合コストはRRFの単純な計算だけなのでレイテンシへの上乗せは小さく抑えられます。ただし、ベクトル検索側のefSearchやBM25側の候補数Nを絞りすぎると、統合前の時点で本来上位に来るべき文書が候補集合から漏れ、RRFがいくら頑健でも救えません。実務では両系列とも「最終的に返す件数より一桁多い候補」を取ってから統合するのが定石です。

設計要素選択肢A選択肢B
統合方式RRF(順位のみ、正規化不要)スコア線形結合(要正規化、クエリ依存の重み調整が必要)
候補集合の広さ各系列で広め(例:上位100)に取ってから統合各系列を最終件数と同数だけ取得(recallの穴が残りやすい)
重み付け系列ごとの重み `w_i / (k+rank_i(d))` で調整可能重みなし(等価に扱う)
試験・面接で問われる要点

ベクトル検索とBM25の弱点が非対称(ベクトルは固有名詞・型番に弱く、BM25は同義語・言い換えに弱い)であること。単純なスコア線形結合が尺度の違いにより破綻しやすいこと。RRFはスコアではなく順位だけを使い 1/(k+rank) の和で統合することで正規化不要かつ頑健になること、そして統合はあくまで候補集合が出そろった後の後処理であり、各検索自体のrecallが低ければ統合しても救えないこと。この対比を説明できるように。

まとめ

まとめ

ベクトル検索とキーワード検索(BM25)は失敗するクエリの種類が対称的に異なり、片方だけの運用には必ず穴が残ります。二つのスコアは尺度が異なるため単純な線形結合は不安定になりやすく、RRF(Reciprocal Rank Fusion) は各検索系列内の順位だけを使い 1/(k+rank) の和で統合することで、正規化なしに頑健なハイブリッド検索を実現します。ただし統合は候補集合が出そろった後の後処理にすぎず、入力側(各検索のrecall)が悪ければ救えない点には注意が必要です。索引そのものの内部動作は vector-index-hnsw-ivfpqfulltext-inverted-index-bm25 を、全文検索の全体像は full-text-search を参照してください。

データベース Article

ハイブリッド検索(ベクトル×キーワード)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ハイブリッド検索

比較で見る軸

難易度: advanced / カテゴリ: データベース / タグ数: 6

導入後に効く点

二つのスコアは尺度が異なり単純な足し算では統合できない。RRF(Reciprocal Rank Fusion)はスコアではなく順位だけを使い `1/(k+rank)` を各系列で足し合わせることで、正規化なしに頑健に統合する。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
データベース
タグ数
6

判断チェックリスト

  • 自社の用途が「ハイブリッド検索 / ベクトル検索」に近いか確認する。
  • 強みである「ベクトル検索とキーワード検索は失敗するクエリの種類が違う。意味的類似は捉えるが固有名詞・型番・略語に弱いベクトル、語彙一致は強いが同義語・言い換えに弱いBM25を、片方だけで運用すると必ず穴が残る。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ハイブリッド検索ベクトル検索全文検索RRFスコア統合ハイブリッド検索ベクトル検索全文検索