キーワード検索(sparse retrieval)とベクトル検索(dense retrieval)を組み合わせる検索方法。実務のRAGでは定番の構成。
Dense retrievalの弱点¶
embeddingによるベクトル検索は、言い換えや同義語に強い(「車」と「自動車」がヒットする)一方で、
型番・製品名・人名などの固有名詞(「RTX 4090」と「RTX 4080」はベクトル上ほぼ同じ)
エラーコード、条文番号、IDなどの完全一致が必要な文字列
embeddingモデルの学習データにない専門用語・社内用語
に弱い。キーワード検索はちょうど逆の性質を持つので、両者を組み合わせると補い合える。
BM25¶
キーワード検索の標準的なスコアリング関数。TF-IDFの改良版で、クエリ に対する文書 のスコアは
:文書 中の単語 の出現回数
:文書の長さ、:平均文書長
:単語頻度の飽和の度合い(通常1.2〜2.0)。同じ単語が何度出ても、スコアは一定以上増えない
:文書長による正規化の強さ(通常0.75)。長い文書が有利になりすぎるのを防ぐ
日本語では単語が空白で区切られていないので、形態素解析(MeCab、Sudachiなど)やn-gramでトークン化してからインデックスする必要がある。トークナイザの選択が検索精度に効く。
Learned sparse retrieval¶
BM25の代わりに、ニューラルネットで各単語の重みを学習する手法もある。
SPLADE(Formal et al., 2021):BERTのMLMヘッドを使って語彙全体に対する重みを出力し、文書に出てこない関連語にも重みを付ける(query/document expansion)
BGE-M3(Chen et al., 2024):1つのモデルでdense・sparse・multi-vector(ColBERT型)の3種類の表現を同時に出力できる多言語モデル
転置インデックスが使えるのでBM25と同じ仕組みで高速に検索できる。
スコアの統合¶
sparseとdenseは別々に検索して、結果を統合する。両者のスコアはスケールが全く違う(BM25は上限なし、コサイン類似度は-1〜1)ので、そのまま足すことはできない。
Reciprocal Rank Fusion(RRF)¶
スコアを捨てて 順位だけ を使う。複数の検索結果 について
を計算し、この値で並べ直す。 は上位の順位を過度に重視しないための定数で、 がよく使われる。
スコアの正規化が不要でパラメータもほぼないので、とりあえず使うならこれ。多くのベクトルDB・検索エンジン(Elasticsearch、Weaviate、Qdrantなど)が標準でサポートしている。
Convex combination¶
スコアを min-max 正規化などで揃えてから重み付き和をとる。
Bruch et al. (2023). An Analysis of Fusion Functions for Hybrid Retrieval では、少量の評価データで を調整できるならRRFより良い場合があると報告されている。
構成例¶
BM25とベクトル検索でそれぞれtop-50程度を取得
RRFで統合
reranker で並べ直してtop-5〜20をLLMに渡す
Anthropicの Contextual Retrieval の実験でも、embeddingのみ → +BM25 → +reranking の順に検索失敗率が下がっている(Chunking 参照)。
- Cormack, G. V., Clarke, C. L. A., & Buettcher, S. (2009). Reciprocal rank fusion outperforms condorcet and individual rank learning methods. Proceedings of the 32nd International ACM SIGIR Conference on Research and Development in Information Retrieval, 758–759. 10.1145/1571941.1572114