💡

ハイブリッド検索について自分用メモ

2024/02/15に公開

ハイブリッド検索について

結構色々なサービスがサポートしているらしい

  • Pinecone
  • OpenSearch
  • ElasticSearch
  • AISearch
  • Qdrant
    などなど

ハイブリッド検索 = キーワード検索とベクトル検索の組み合わせ
各検索結果を使うのでキーワード検索とベクトル検索の精度を上げる必要がある。

キーワード検索

(AISearchだとフルテキスト検索という名称)

キーワード検索のステップ

  • キーワード解析・トークン化
  • 正規化
    • ステミング
    • 同義語変換
  • 集計・スコアリング

OpenSearchの全文検索について参考

キーワード解析・トークン化

日本語の場合、形態素解析と呼ばれるものを使って単語単位にトークン化する。(あとは品詞の情報も抽出)

形態素解析は

  • MeCab
  • kuromoji
  • sudachi
    などなど

AISearchだとja.Luceneとかja.Microsoftなどもあるみたい

あと辞書登録みたいなことが必要そう
標準で解析できない専門用語などを登録する

キーワードの正規化(標準化)

  • ステミング(品詞の変換)
  • 表記揺れの補正
    • 半角・全角文字や数字の補正
  • ストップワード削除
    • 「を」とか「の」みたいな検索上意味のない単語の削除
  • 同義語変換

辞書登録と同義語変換は重要そう

スコアリング

出現する単語をBM25という検索アルゴリズムでスコアリングする。

BM25を数式から説明する

ベクトル検索

検索クエリと検索文字列をそれぞれベクトル化し、k近傍法アルゴリズムによって類似度を算出する。
類似度の算出には以下2つがあるよう

  • ユークリッド距離
  • コサイン類似度

キーワードの検索でより使われるのはコサイン類似度

ハイブリッド検索

ハイブリッド検索 = キーワード検索とベクトル検索
OpenSearchとAISearchではそれぞれ以下のような形で実現する。

Open Searchでのハイブリッド検索

ハイブリッド検索を検索パイプライン + ハイブリッドクエリで実現

検索パイプラインは複数の検索の比率(一応正規化手法も)を決めてスコアリングする。
以下のようなJsonで検索パイプラインを設定する際に検索それぞれの重みを指定する。

{
  "description": "Post processor for hybrid search",
  "phase_results_processors": [
    {
      "normalization-processor": {
        "normalization": {
          "technique": "min_max"
        },
        "combination": {
          "technique": "arithmetic_mean",
          "parameters": {
            "weights": [
              0.3,
              0.7
            ]
          }
        }
      }
    }
  ]
}

AISearchのハイブリッド検索

AI Searchでは検索パイプラインみたいなものは不要
検索クエリに複数の検索を含めるとスコアリングされる。
スコアリングプロファイルでOpenSearch同様スコアリングの際の重み付は可能

スコアリングプロファイル

AISearchセマンティックランク付け

Azure AISearchだけにある機能。従量課金要素($1/1000リクエスト)
ハイブリッド検索の結果をリランクする。

Azure AI Search でのセマンティック ランク付け

キーワード検索 + ベクトル検索以外の組み合わせ検索も可能そう

(試してはないけど)
ベクトル検索 + ベクトル検索みたいなことも可能

最後に

やるべきことはキーワード検索とベクトル検索の精度向上

Discussion