ハイブリッド検索
ハイブリッド検索は、キーワード検索(BM25のようなスパースベクトル手法)とセマンティックベクトル(埋め込み)検索を並列で実行し、その後、2つの結果セットを1つのランキングに統合します。完全一致する用語のマッチと文脈的な意味を同時に捉えられるため、RAGやAI検索における検索精度の向上によく用いられます。
ハイブリッド検索は、キーワード検索(BM25)とベクトル(意味)検索を並列に実行し、2つの結果セットを1つのランキングに統合します。
キーワード検索は、製品コード、固有名詞、専門用語などの完全一致に強く、一方でベクトル検索は同義語、文脈、言い換えクエリに強いため、両者を組み合わせることで互いの弱点を補えます。
2つの結果セットを統合する標準的な融合アルゴリズムはRRF(Reciprocal Rank Fusion)で、スコアではなく順位のみを使用するため、異なるスケールにあるスコアを正規化する問題を回避できます。
Elasticsearch と AzureAI SearchではRRFの定数kがデフォルトで60に設定されている一方、Weaviateではalphaパラメータ(0 = キーワード、1 = ベクトル、デフォルト 0.75)によって重み付けを調整します。
これはRAGやAI検索パイプラインにおける検索品質向上の中核技術であり、融合後の結果の上に通常リランキングのステップを重ねることで、精度をさらに高めます。
ハイブリッド検索とは
ハイブリッド検索は、特性の大きく異なる2つの検索手法、キーワード検索とベクトル検索を同時に実行し、それぞれが生成した結果リストを1つのランキングに融合する手法です。Weaviateでは、複数の検索アルゴリズムを組み合わせて検索結果の精度と関連性を高める技術と定義しており、具体的にはキーワードベースの疎ベクトルと意味ベースの密ベクトルを1つのランキングリストに統合します。
このアプローチが必要なのは、各手法に明確に異なる強みと弱みがあるためです。BM25のようなキーワード(疎)方式は、BM25、用語頻度と文書長に基づいて文書をスコアリングするため、製品コード、固有名詞、稀な専門用語など、「まさにその単語」を探すクエリに強い一方で、意味が同じでも表現が変わると一致を取りこぼします。これに対して、埋め込みベースのベクトル(密)検索は、言い換え、同義語、文脈をうまく扱えますが、出現頻度の低いキーワードの完全一致を過小評価しがちです。ハイブリッド検索は2つの結果セットを統合し、それぞれが相手の欠点を補います。そのため、ChatGPT、Perplexity、GoogleAI Overviewsなどの生成型検索エンジンを支えるRAGパイプラインにおいて、検索段階の品質を高める中核技術となっています。
キーワード検索 vs. ベクトル検索 vs. ハイブリッド検索
項目 | キーワード検索(BM25) | ベクトル検索(Embeddings) | ハイブリッド検索 |
|---|---|---|---|
マッチング基準 | 完全一致一致、用語頻度 | 意味的・文脈的な類似性 | 両方を並列で実行し、その後に統合 |
得意分野 | 製品コード、固有名詞、技術用語 | 同義語、言い換え、自然言語の質問 | 完全一致と意味の両方 |
弱点 | 意味が同じでも言い換えを見逃す | 希少なキーワードの完全一致を過小評価する | 実装とチューニングの複雑さが増す |
データ表現 | 転置インデックス | ベクトルインデックス(ANN) | 疎ベクトルと密ベクトルを併用 |
結果の結合 | 単独スコア | 単独スコア(cosine など) | RRF または凸結合で統合 |
2つの結果セットを統合する方法: RRF(Reciprocal Rank Fusion)
中核的な難しさは、2つの手法が異なるスコアリングシステムを使うことにあります。BM25 のスコアとベクトルのコサイン類似度(通常 -1 から 1)はスケールが異なるため、単純に加算または平均すると、どちらか一方が結果を支配してしまいます。最も広く使われている解決策はRRF(Reciprocal Rank Fusion)で、これは生のスコアを完全に無視し、各文書のrank各リスト内で。最終スコアは、各リストでドキュメントが受け取った順位の逆数を合計して算出されます。
Azure の公式AI Searchドキュメントでは、ドキュメントの RRF スコアは1 / (rank + k)の合計として計算されるとされており、実験的には k を 60 前後の小さな値にすると最もよい結果が得られると説明しています。Elasticsearch も同じ式を使用し、rank 定数rank_constantの既定値を 60 に設定し、融合を適用するには少なくとも 2 つの retriever が必要です。Elasticsearch が示す疑似コードは次のとおりです:
score = 0.0
for q in queries:
if d in result(q):
score += 1.0 / ( k + rank( result(q), d ) )
return scoreここでkは rank 定数であり、rank()は 1 から始まるドキュメントの順位です。このようにして、2 つの手法のスコア単位を正規化する必要なく、両方で上位にランクされるドキュメントは自然により高い結合スコアを獲得します。Weaviate も既定の融合として RRF を使用しており、式を ∑d∈D 1/(k + r(d)) と表しています。
重みの調整とその他の融合手法
Weaviate では、alphaパラメータが各手法にどれだけ重みを与えるかを制御します。alpha が 0 なら純粋なキーワード検索、1 なら純粋なベクトル検索、0.5 なら両者を同等に重み付けします。既定値は 0.75 で、ベクトル側にやや寄せた設定です。
RRF だけが解ではありません。Pinecone の研究「An Analysis of Fusion Functions for Hybrid Retrieval」では、レキシカルスコアとセマンティックスコアの加重和を取るconvex combinationが、ドメイン内・ドメイン外の両方で RRF を上回ったと報告しています。また、従来の通説に反して RRF はパラメータに敏感である一方、convex combination はスコア正規化の方法に対して比較的影響を受けにくく、サンプル効率にも優れていることが分かっています。つまり、その単一パラメータは少数の学習例だけで対象ドメインに合わせて調整できます。言い換えれば、RRF はチューニング不要の優れたデフォルト設定として有効であり、加重スコア融合はデータに合わせて調整すればより良い結果をもたらす可能性があります。
実装チェックリスト
クエリの種類を見極めてください。製品コード、固有名詞、完全一致が重要ならキーワードの重みを上げ、自然言語の質問や言い換えが中心ならベクトルの重みを上げます。
同じコーパスに対して転置インデックス(キーワード)とベクトルインデックスを構築し、両方の検索を並列で実行します。
デフォルトの融合方式としてはRRFを採用し、定数kは60前後(ElasticsearchおよびAzureのデフォルト)に保ってください。
Weaviateを使用する場合は、実際のクエリログを使ったA/Bテストで、alphaを0.5〜0.75の範囲に調整してください。
最終的な精度をさらに高めるために、上位N件の融合結果の上にrerankingモデルを重ねることを検討してください。
加重スコア融合(convex combination)を使用する場合は、検証セットを使って2つのスコアの正規化と重み付けを調整してください。