RAG の検索精度を上げようとして、ベクトル検索だけを磨き込んで頭打ちになることがあります。
意味の近い文書は拾えるのに、型番やエラーコードのようにその文字列そのものを探したい問い合わせで急に外す。
原因は精度ではなく、検索方式の得意分野が最初からずれていることにありました。
そこを埋めるのがハイブリッド検索、つまりキーワード検索とベクトル検索を同時に走らせて結果を混ぜるやり方です。
2つの検索は「外し方」が違う
まず、混ぜる前のそれぞれを整理しておきます。
キーワード検索(全文検索)は、問い合わせに含まれる語がどれだけ珍しく、どれだけ多く出てくるかで文書を並べる方式。
Azure AI Search のドキュメントによれば、フルテキスト検索のスコアリングには BM25 アルゴリズムが使われ、スコアに上限はありません。
一方のベクトル検索は、文章を数値の並びに変換してから近さで探します。
同じドキュメントでは、ベクトル検索は HNSW アルゴリズムで動き、コサイン類似度なら 0.333 から 1.00 の範囲にスコアが収まると説明されていました。
Azure AI Search「ハイブリッド検索スコアリング (RRF)」
この2つは、外すときの外し方が対照的なのですね。
キーワード検索は語が一致しないと届かないので、「PCが立ち上がらない」と「パソコンが起動しない」を別物として扱ってしまう。
ベクトル検索は逆に意味で寄せるため、固有名詞や型番のような「一致してほしい文字列」を近い別物とすり替える。
どちらか一方だけでは、この2種類の失敗を同時には潰せません。
文章を数値ベクトルに置き換える仕組みそのものは、こちらで整理しています。
ハイブリッド検索は「両方走らせて混ぜる」
ハイブリッド検索の考え方は単純で、2つのクエリを並列に実行し、出てきた2つのランキングを1つに統合するだけです。
Elastic のドキュメントも、全文検索とベクトル検索それぞれの強みを組み合わせて関連性を高める手法としてハイブリッド検索を説明していました。
Elastic Docs「Hybrid search」
ここで問題になるのが、統合の方法です。
さきほど見たとおり、BM25 のスコアは上限がなく、ベクトル検索のスコアは 0 から 1 に収まる。
桁も範囲も違うスコアを、そのまま足し算することはできないわけです。
かといって正規化しようとすると、その日の検索結果の分布に結果が引きずられてしまいますね。
定番の統合手法 RRF|スコアではなく順位を足す
この問題を回避するのが RRF(Reciprocal Rank Fusion)、日本語では逆順位融合と呼ばれる手法でした。
Azure AI Search のドキュメントは、RRF の計算を次のように説明しています。
各リストの文書に対して 1/(rank + k) というスコアを与え、そのスコアを全リストにわたって合計し、合計値の大きい順に並べ替える。
rank はそのリスト内での順位で、k はアルゴリズム側の定数にあたります。
実験上は 60 のような小さい値を設定したときに性能が最も高くなると、同じドキュメントに書かれていました。
肝は、元のスコアの絶対値を一切使わず、順位だけを使うところ。
順位なら BM25 でも HNSW でも同じ土俵に乗るので、正規化の悩みが丸ごと消えます。
もう一つの効果として、複数の方式で揃って上位に来た文書ほど合計値が伸びるという性質もありました。
片方の方式でだけ1位になった文書より、両方で3位に入った文書のほうが上に来る場合がある。
「複数の観点から支持された文書を優先する」という判断が、この式ひとつで表現できているわけです。
なお同ドキュメントには、セマンティックランク付け(リランカー)は RRF によるマージのあとに実行されると明記されていました。
検索の段取りとしては、候補を広く集める段階と、上位を並べ替える段階が分かれていると捉えると整理しやすいですね。
どこで効いて、どこで効かないのか
効きやすいのは、質問の書き方が読めない検索です。
社内文書の問い合わせのように、自然文で聞かれることもあれば製品コードで聞かれることもある、という状況。
このとき片方の方式に賭けると、賭けを外した問い合わせが丸ごと落ちます。
逆に、扱う問い合わせが最初から一方に寄っているなら、ハイブリッドにする利得は小さくなりますね。
たとえばログ検索のようにほぼ完全一致で探す用途では、キーワード検索だけで十分なことが多いはずです。
また、ハイブリッド検索はクエリ実行の回数がそのまま増える点にも注意が必要でした。
Azure のドキュメントは、フルテキスト1本とベクトル1本のシンプルなハイブリッドで2回、ベクトル側が5フィールドを対象とする2つのクエリなら合計11回のクエリ実行に相当すると具体的に示しています。
検索の質を買うために、レイテンシとコストを払う構図になる。
そしてもう一つ、検索方式をどれだけ工夫しても、文書の分け方が悪ければ上限は上がりません。
最後に
ハイブリッド検索は、キーワード検索とベクトル検索を並列に走らせ、結果を1つのランキングへ統合する手法でした。
統合の定番が RRF で、スコアの絶対値ではなく順位だけを足し合わせることで、範囲の違う指標を同じ土俵に乗せています。
効くのは質問の書かれ方が読めない場面で、逆に用途が一方へ寄っているならクエリ回数が増えるぶん損になることもある。
候補に答えは入っているのに順位が低い、という段階まで来たら次の一手は並べ替えです。
RAG 全体の中でどこに位置する工程なのかは、こちらの記事とあわせて読むと見通しがよくなるはずです。
以上です。















コメントを残す