ハイブリッド検索とは
Hybrid Search
セマンティック検索とキーワード検索を組み合わせ、双方の長所を活かす検索手法
ひとことで言うと
意味で探す検索とキーワードで探す検索を組み合わせた、精度の高い検索方法。
概要
ハイブリッド検索とは、埋め込みベクトルによる意味的な類似度検索(セマンティック検索)と、単語の出現に基づくキーワード検索(BM25等)を組み合わせて実行し、両者のスコアを統合して最終的な検索結果を決める手法。 セマンティック検索は同義語や言い換えに強い一方で固有名詞や型番等の完全一致が苦手であり、キーワード検索はその逆の特性を持つ。 ハイブリッド検索は、この相補的な特性を組み合わせることで、単独の手法よりも幅広いクエリに対して安定した検索精度を実現する。 スコアの統合には、単純な重み付き和のほか、複数のランキングを統合するReciprocal Rank Fusion(RRF)といった手法もよく用いられる。
背景
セマンティック検索とキーワード検索は、それぞれ異なる種類のクエリに強みを持つため、どちらか一方だけでは対応しきれない検索ニーズが存在する。 ハイブリッド検索は、両方の検索を並行して実行しスコアを統合することで、単独の手法の弱点を補うために採用されている。
アーキテクチャ
クエリに対してセマンティック検索とキーワード検索(BM25等)をそれぞれ実行し、2つの検索結果のスコアをRRF(Reciprocal Rank Fusion)等の手法で統合して最終的なランキングを算出する。 多くのベクトルデータベースやサーチエンジンが、この2種類の検索を組み合わせる機能を標準で提供している。
ワークフロー
クエリを受け取る → セマンティック検索(埋め込みベクトルの類似度)とキーワード検索(BM25等)をそれぞれ実行 → 各手法のスコアや順位をRRF等の手法で統合 → 統合後のランキング上位を検索結果として返す。
コード例
RRFでセマンティック検索とキーワード検索の順位を統合する
def reciprocal_rank_fusion(rank_lists, k=60):
scores = {}
for ranks in rank_lists:
for rank, doc_id in enumerate(ranks):
scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
return sorted(scores.items(), key=lambda x: x[1], reverse=True)
semantic_ranking = ["doc3", "doc1", "doc2"]
keyword_ranking = ["doc1", "doc3", "doc4"]
result = reciprocal_rank_fusion([semantic_ranking, keyword_ranking])
print(result)利点
- セマンティック検索とキーワード検索、双方の長所を活かせる
- 固有名詞を含むクエリから曖昧な自然文のクエリまで、幅広い種類の検索ニーズに対応しやすい
- 一方の手法が苦手なクエリでも、もう一方の手法が補うことで安定した検索精度を保ちやすい
欠点
比較
関連用語
よくある質問
ハイブリッド検索は常にセマンティック検索単体より優れている?
幅広いクエリに対して安定した精度を示す傾向があるが、計算コストは増える。 データやクエリの性質によっては、単独の手法で十分な場合もある。
スコアの統合にRRF以外の方法もある?
各手法のスコアを正規化して重み付き和を取る方法もあるが、スコアのスケールは手法ごとに異なりやすい。 順位のみを使うRRFは、その点を気にせずシンプルに扱える利点がある。
参考文献
- DocumentationElastic: Hybrid search