Fessのセマンティックサーチ

semantic.codelibs.orgにデモサイトを作ってみた。この手のを作って、実験していかないと改善もできないですし。

仕組み的には、docker-semanticsearchにあるものを動かしている感じです。セットアップ手順とかはそこに書いてあるとおりで、Fessにfess-webapp-semantic-searchプラグインを入れて、動かしています。

インデクシングについては、検索対象は、英語のWikipediaのコンテンツ部分を抜き出して、単純なHTMLにして、それをインデックスしています。HTMLなので、普通にウェブクロールしている感じです。

検索については、通常の転置インデックスに対する検索とベクトル検索のハイブリットサーチになっています。ベクトル検索は、OpenSearchのNeural Queryを投げて、ANNで検索してます。なので、通常の検索の検索結果と、ANNで返ってくるTop Kの検索結果をReciprocal Rank Fusion(RRF)でマージして、検索結果を表示してます。RRF自体は、Fessで実装してます。通常のFessの検索画面だと、ベクトル検索の結果がどれなのかがわかりにくいので、ベクトル検索結果はロボットアイコンが表示されてます。人っぽいアイコンの方は通常の検索結果のものです。なので、ページングしていくと、通常の検索結果だけになるのがわかると思います。

RRFの実装自体はページングを考えなければ、シンプルなので、ベクトル検索に限らず、複数の検索結果をマージできるようにFessでは汎用的に実装してあります。現時点では、ファセット表示のところに、ベクトル検索の集計結果がカウントされないという、制限事項はありますが…。

ベクトル検索の結果については、embeddingの質とかもあるので、まだまだ改善の余地はある印象があります。このデモサイトを使ってみて、見つける課題とかもあるので、地道に改善していこうと思っています。

Amazon Linux 2023にDocker Composeを入れる

まずは、dnfでdockerを入れます。

$ sudo dnf -y install docker

インストールしたら、dockerのサービスを有効にします。

$ sudo systemctl enable --now docker

次に、ec2-userでdockerコマンドを利用できるようにします。

$ sudo usermod -aG docker ec2-user

一度、ログアウトして、ログインし直します。

docker composeのリリースサイトを確認して、アーキテクチャを確認して、インストールします。今回は、x86_64版をインストールします。

$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

あとは、docker composeが利用できるか確認します。

$ docker compose version

JSON形式のログを変換する

FessをDockerで動かすと、ECS形式のJSONとして、ログが出力されます。人がパッと見て理解はしにくいので、ただのログファイルのように変換するには、jqを利用して、変換すると見やすくなると思います。

cat fess-crawler.log | jq -r '."@timestamp" + " " + ."log.level" + " " + .message' 

OpenAI互換APIも使えるllama-cpp-python

OpenAIのAPIは有料なので気軽に使うにはちょっと厳しいので、気軽に使う方法がないかなと言うときに良さそうなのが、llama-cpp-pythonというのがあります。Llama2とか、いい感じのものも増えてきていますし、これと合わせて使うと、気軽に試したりすることができます。

llama.cppで、量子化してたりして、利用する環境に合わせたサイズのモデルを事前に準備しておくと良いです。事前に準備しておいたら、llama-cpp-pythonは

pip install llama-cpp-python

でインストールすることができます。GPU環境とかであれば、ドキュメントを参考にして、cuBlasなどを有効にして、インストールしてください。

あとは、

python3 -m llama_cpp.server --model models/7B/ggml-model.bin

みたいな感じで、モデルを指定すれば起動できます。–portとか、オプションもいろいろとあるので、指定すれば、一部の層をGPUに置いたりとか、できたりで便利です。

OpenAIのライブラリ経由とかで使う場合は、OPENAI_API_BASE環境変数とかで、http://localhost:8000/v1とか指定すれば、差し替えて使えることもできると思います。

補足:llama.cppにもserverコマンドでAPI化できるのですが、これはllama-cpp-pythonほど、実装されていなかったので、まだ使えなかった…。

Fess 14.10.0のリリース

Fess 14.10.0をリリースしました。Fessとしては、特に大きな変更はないのですが、OpenSearch 2.9でmapping char filterが辞書ファイルに#で始まるコメントを許可しないという破壊的な変更が入っているため、OpenSearchをアップグレードする際には注意が必要になります。Fessで利用しているmapping.txtで、#の行を削除しないと、fessインデックスがopenできない状態になります。

という感じですが、14.10の変更を見ていくと、

#2758はデータストアクロールで、インデクシングするURLに#を含めると、検索結果でリンクが機能しないという問題があるのを対応しました。

#2759はデータストアクロールでは設定パラメーターで指定するような値が利用できないので、パラメーターの入力されたものを利用できるようにしました。CSVリストクロールなどのときに、CrawlerClientが指定されたURLにアクセスするときのパラメーターとして渡せるようになりました。

#2760はAzureADを認証として利用して、AzureADを利用したファイルシステムのクロールするときに認証情報が異なるので、それに対応するようにしました。

#2762はFessのアップグレード処理関連の更新です。今回はmapping.txtの問題があるので、アップグレードを実行すると、mapping.txtから#〜を削除してくれる機能を追加してあります。なので、OpenSearch 2.9でfessインデックスが起動できないときには、アップグレードを実行すると、mapping.txtの問題を修正してくれます。

という感じで、OpenSearch 2.9のmapping char filterの処理が変更された問題はありますが、何かあれば、フォーラムをご利用ください。