meilisearchにベクトル検索追加してハイブリッド検索を検証
こんにちは。プログラマーのskkです。
今回は検索方法の紹介記事です。
全文検索とベクトル検索を組み合わせたハイブリッド検索について紹介します。
全文検索とベクトル検索とは
まずはハイブリッドする元となる全文検索とベクトル検索の説明から
———————————
▼全文検索:
・全文検索は、テキスト文書内の全ての単語を対象に検索を行います。
・検索クエリと文書内の単語を比較し、完全に一致する文書を見つけます。
・この方法は、単純で効率的ですが、検索結果の質がクエリの精度に依存します。
▼ベクトル検索:
・ベクトル検索は、文書やクエリをベクトル空間内の点として表現し、それらの間の距離や類似性を計算します。
・文書やクエリを高次元のベクトルとして表現するため、意味的な関連性や類似性を考慮することができます。
・この方法は、言語や文脈の意味を考慮したより高度な検索を可能にしますが、計算コストが高くなる可能性があります。
———————————
色々と説明を記述しましたが、
要するに
・全文検索は検索したキーワードそのものがデータベースに入っているか探すカッチリとした検索方法
・ベクトル検索は検索したキーワードに似たものを曖昧にデータベースから探すザックリとした検索方法
というものになります。
ハイブリッド検索とは
先程紹介した全文検索、ベクトル検索
それぞれの検索方法には、それぞれ長所と短所があります。
キーワードそのもので探したいモノもあれば、なんとなくニュアンスで探したいモノもある。
それぞれの良いとこ取りをするために
全文検索とベクトル検索の結果を混ぜて表示するハイブリッド検索という方法が使われています。
全文検索結果上位10件と、ベクトル検索結果上位10件を
組み合わせて新たな上位10件の検索結果を表示させるような形です。
前提としては
全文検索用エンジンとベクトル検索用エンジンはそれぞれ別のサービス、モジュールとなっていて
それぞれサーバー立てて検索結果を取得して表示アプリ側で混ぜて
表示させるハイブリッド検索が基本的な手法手段ではありますが、
今回は
全文検索用エンジン「meilisearch」にベクトル検索機能を追加出来て、
なおかつ全文検索結果とベクトル検索結果を
meilisearch側の検索機能で最初からハイブリッドしたものを検索取得する事ができたのでこちらを試すことにします。
公式の紹介ページ(英語)
準備
meilisearchサーバはローカル環境でdockerコンテナを用意します。用意手順は割愛。
検索用データは公式のクイックスタートガイドにある
映画データ(movies.json)をあらすじ情報の所を和訳したデータを用意、
meilisearchサーバに登録します。
検索用データを登録したらベクトル検索機能を付与していきます。
公式ドキュメントに追加方法があるのでここを参考に実行します。
今回はopenaiのモデルを使用してベクトルデータを付与します。
現状はcurlでのみ追加可能となっています。
検索デモ
ベクトルデータまで付与した検索用データを使って
実際にハイブリッド検索を行うデモページを作ってみました。
meilisearch側でハイブリッド検索結果の中から
全文検索結果を重視するのか、ベクトル検索結果を重視するのかというratio設定が出来るので
5段階に分けて検索結果を横に並べて表示しています。
例えば真ん中のratio0.5の場合、検索リクエストは下記のようにcurlで送っています。
curl -X POST http://192.168.1.129:7777/indexes/movies/search \
-H ‘content-type: application/json’ -H ‘Authorization: meili-master-key’ \
–data-binary ‘{
“q”: 【検索キーワード】,
“hitsPerPage”: 10,
“hybrid”: {
“semanticRatio”: 0.5,
“embedder”: “default”
}
}’
操作している動画もどうぞ。
雑感
今回はmeilisearchを使用してハイブリッド検索機能を試してみました。
全文検索エンジンとベクトル検索エンジンそれぞれで別サーバ立てて実装するよりも
meilisearch一つでハイブリッド検索出来るようにしておけば
用意するサーバは一つで良く、データセットもそれぞれで管理する必要も無いので管理面では扱いやすいですね。
公式リファレンスが英語だったり
紹介記事もまだまだ少ないですが今後要注目の機能かなと思います。
また、ハイブリッド検索結果に関しても
今回はmeilisearch内部に組み込まれたハイブリッド検索機能を使用しましたが、
全文検索とベクトル検索の結果がもっと混ざり合った結果を取得するなら
meilisearchにて全文検索とベクトル検索それぞれ取得してこちらのアプリ側で
独自にリランクを行い、いい感じのハイブリッド検索を表現する事も考えなければいけないかなとも思います。
お読みいただきありがとうございました。
Tweet