ハイブリッド検索について自分用メモ
ハイブリッド検索について
結構色々なサービスがサポートしているらしい
- Pinecone
- OpenSearch
- ElasticSearch
- AISearch
- Qdrant
などなど
ハイブリッド検索 = キーワード検索とベクトル検索の組み合わせ
各検索結果を使うのでキーワード検索とベクトル検索の精度を上げる必要がある。
キーワード検索
(AISearchだとフルテキスト検索という名称)
キーワード検索のステップ
- キーワード解析・トークン化
- 正規化
- ステミング
- 同義語変換
- 集計・スコアリング
キーワード解析・トークン化
日本語の場合、形態素解析と呼ばれるものを使って単語単位にトークン化する。(あとは品詞の情報も抽出)
形態素解析は
- MeCab
- kuromoji
- sudachi
などなど
AISearchだとja.Luceneとかja.Microsoftなどもあるみたい
あと辞書登録みたいなことが必要そう
標準で解析できない専門用語などを登録する
キーワードの正規化(標準化)
- ステミング(品詞の変換)
- 表記揺れの補正
- 半角・全角文字や数字の補正
- ストップワード削除
- 「を」とか「の」みたいな検索上意味のない単語の削除
- 同義語変換
辞書登録と同義語変換は重要そう
スコアリング
出現する単語を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