Re Reference AI

技術

ハイブリッド検索とは

Hybrid Search

セマンティック検索とキーワード検索を組み合わせ、双方の長所を活かす検索手法

検索RAG

ひとことで言うと

意味で探す検索とキーワードで探す検索を組み合わせた、精度の高い検索方法。

概要

ハイブリッド検索とは、埋め込みベクトルによる意味的な類似度検索(セマンティック検索)と、単語の出現に基づくキーワード検索(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)

利点

  • セマンティック検索とキーワード検索、双方の長所を活かせる
  • 固有名詞を含むクエリから曖昧な自然文のクエリまで、幅広い種類の検索ニーズに対応しやすい
  • 一方の手法が苦手なクエリでも、もう一方の手法が補うことで安定した検索精度を保ちやすい

欠点

  • 2つの検索手法を並行して使うため、単独の手法より計算コスト・レイテンシが増える
  • スコアの統合方法(重み付けやRRFのパラメータ等)の調整が必要で、チューニングの手間が増える
  • 実装・運用がセマンティック検索単体やキーワード検索単体より複雑になる

比較

  • セマンティック検索ハイブリッド検索は、セマンティック検索とキーワード検索を組み合わせる手法
  • BM25ハイブリッド検索では、キーワード検索側のアルゴリズムとしてBM25がよく使われる
  • リランカーハイブリッド検索で統合した候補群を、さらにリランカーで並べ替えることもある
  • RRFRRFは、ハイブリッド検索でセマンティック検索とキーワード検索のスコアを統合する代表的な手法

関連用語

セマンティック検索BM25リランカーRAGTF-IDFRRF

よくある質問

ハイブリッド検索は常にセマンティック検索単体より優れている?

幅広いクエリに対して安定した精度を示す傾向があるが、計算コストは増える。 データやクエリの性質によっては、単独の手法で十分な場合もある。

スコアの統合にRRF以外の方法もある?

各手法のスコアを正規化して重み付き和を取る方法もあるが、スコアのスケールは手法ごとに異なりやすい。 順位のみを使うRRFは、その点を気にせずシンプルに扱える利点がある。

参考文献

関連Zenn記事