SPLADEを実装してみる

naverのSPLADEの実装は、GitHubのnaver/spladeにあるけど、これが商用不可だったりするので、ゼロから実装して、何かで使いたいときの際にベースとして利用できるものがほしいなーと思ってました。というわけで、シンプルなSPLADEの実装を作ろうということで、marevol/simple-spladeとして、作ってみました。ChatGPTと壁打ちしながら、作っていった感じではあるけど、たぶん、それっぽい感じにはなったかなと思います。

main.pyでAmazonのECSIデータを利用して、クエリー(query)と商品名(product_title)を学習する感じになってます。ExactのEをpositiveで、それ以外をnegativeとして扱ってます。コード量も多くないので、簡単に眺めることができるのではないかな…と思いますし、たぶん、手を加えやすいと思います。

マルチリンガルで、とChatGPTに言ったら、xlm-roberta-baseになったので、そのままですが、別なモデルでも良いような気もしてます…。

勢いで作った感じはありますが、何かあれば、修正してください。

マルチインスタンスでFessを動かす

1つのOpenSearchのクラスターを利用できるようようにしておいて、複数のFessがそれを利用できるようにしました。元々できるような設定を入れていたものの、Docker Composeでその環境を真面目に作り始めたら、いろいろと課題が出てきたので修正が必要だった…。

ここにある感じで、compose-fessXX.yamlのように追加すれば、Fessのインスタンスを追加していくことができます。OpenSearch側でアクセスコントロールとかしていないので、管理画面のダッシュボードからはすべてのインデックスが見える感じにはなっていますが…。

現状、Fessのデモをいくつか動かしているけど、そろそろ一箇所にまとめたいな…と思い始め、マルチインスタンスでの動作も整理し始めました。次のリリースから使えるようになると思います。

Fess 14.16のリリース

Fess 14.16をリリースしました。細々としたことをいろいろと対応しました。

#2837では、管理画面のデザインでセキュリティ面を考慮して、スクリプトレットを記述できないようにしておきました。

#2835 は、プラグインなどから、検索前にリクエストパラメーターを書き換えたりできるようなインターフェースの追加を行いました。セマンティックサーチのプラグインで必要だったので、機能を追加しました。

#2834 は管理APIで直接ドキュメントをインデクシングしたときに、言語判定を処理できるかを調整しました。通常は、langフィールドの値に基づいて処理しますが、言語判定をしたい場合は、lang=autoを指定することで、contentの内容を元にして、langの値などが設定されるようになります。

#2833 は、管理APIにバルクでドキュメントをインデクシングできるエンドポイントを用意しました。今までも1件ずつであれば、管理APIから直接インデクシングができましたが、複数件まとめて、ドキュメント群をインデクシングすることができるようになりました。クローラーを利用せずに、インデクシングをしたい場合などに効率的にインデックスを作成できます。

#2832 は複数の検索語を入れて検索して、ヒット件数が0件のときにOR検索として、再検索する機能になります。

#2831は検索APIのレスポンスにスコアが入ってなかったので含めるようにしました。

#2830は検索ログの登録時に、1分間あたりに大量にあると処理できない場合があるので、検索ログをバルクで処理するようにしました。

#2829はRank Fusion関連の設定値が定期的に反映されるようにしました。

#2828は、検索のクエリーに関して、内部的にboolクエリーを組み立てて処理していましたが、DisMaxでもクエリーを構築できるようにしました。将来的に、dismaxを利用するのかは、今後、定量的に評価して検討していく予定です。

#2827 は管理画面の検索ログ系インデックスからのデータをダウンロードする際に、CPU負荷を考慮するようにしました。

#2826は、ドキュメントのキャッシュ表示の有無など、各種設定を細かく設定できるようにしました。

という感じになりますが、今回は、セマンティックサーチの改善と検索品質評価ベンチマークの利用の観点で、必要な修正を入れた感じになります。

何かあれば、フォーラムをご利用ください。