DockerのFessファイル検索で多言語ハイブリッド検索を試す

docker-filesearchで、Fess 15.9のキーワード検索とベクトル検索を組み合わせたハイブリッド検索を利用するようにしました。日本語の資料を英語で質問するなど、同じ単語を含まない検索でも関連する文書を探すためのデモ環境です。

検索エンジン側で順位を統合する

BM25によるキーワード検索と、多言語埋め込みモデルによるベクトル検索を1つのOpenSearchのhybridリクエストで実行します。順位はReciprocal Rank Fusionで統合します。テーマは従来どおり/api/v2/searchを利用するため、検索画面側で2つの結果を組み合わせる必要はありません。

埋め込みにはparaphrase-multilingual-MiniLM-L12-v2を使い、ベクトル次元数は384です。起動時のinit-semanticサービスがモデルを登録・デプロイし、生成されたモデルIDをFessへ渡します。クロール後にContent Chunk Vector Indexerを動かして文書のチャンクとベクトルを作成します。

デモ環境を起動する

docker-filesearchの作業ディレクトリで、READMEに沿って以下を実行します。

bash ./bin/setup.sh
docker compose up -d
bash ./bin/configure.sh

Docker Compose v2に加え、モデルを動かすためにおおむね8GBの空きメモリーを用意します。初回は約490MBのモデルなどをダウンロードするためネットワーク接続が必要です。初回の設定処理はサンプル環境で約9〜16分という測定があり、実際の時間はマシンに依存します。

キーワード検索はクロール完了後に使えますが、ベクトル検索へ反映するにはインデクサーの完了を待つ必要があります。

調整する項目

.envでは次の値を調整できます。

MODEL_DIMENSION=384
CHUNK_SIZE=500
SEMANTIC_MIN_SCORE=0.35
OPENSEARCH_HEAP=2g

チャンクを小さくすると細かな内容を拾いやすくなる一方、生成するベクトルと処理時間が増えます。類似度の下限を上げると関連の薄い結果を減らせますが、探したい言い換えも落とす場合があります。0.35はサンプルデータで選んだ値なので、実データでも最適とは限りません。

content_chunker.*はFessのシステムプロパティとして渡します。fess_config.properties用の設定と経路が異なる点にも注意してください。

検索と更新の注意点

すべての検索がハイブリッドになるわけではありません。明示的なソート、複数語の引用フレーズ、ワイルドカード、除外などではキーワード検索になる条件があります。まず通常の関連度順のクエリで比較すると動作を把握しやすくなります。

旧デモの768次元インデックスへ384次元のモデルをそのまま使うことはできません。モデル、次元、チャンクサイズを変更する場合は、新しいインデックスを用意する前提でREADMEの再構築手順を確認してください。

あわせて、同時セグメント検索による部分的な検索結果を避けるデモ設定と、ベクトル書き込みの競合を同じ実行中に再試行するFessの修正も入りました。再試行は本文と処理状態が同じ場合だけ既存のベクトルを再利用し、競合が続く文書は次回へ残します。ジョブの完了状態だけでなく、処理結果の件数も確認するとよいと思います。

関連PR

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です