コンテンツにスキップ

Plone向けベクトル検索製品 collective.vectorsearch を完成させました

数年前から取り組んでいた、Plone向けのベクトル(セマンティック)検索エンジンを、ついに collective.vectorsearch パッケージとしてリリースしました。

長らく構想段階や実験的な実装に留まっていましたが、いくつかの重要な要因が重なり、実用的なレベルまで作り込むことができました。

PyPIへのリリースはまだしていませんが、GitHubからソースコードを入手していただければ、すぐに利用を開始できます。

開発再開と完成への道のり

一度は停滞していたこのプロジェクトですが、以下の理由から「今ならできる」と確信し、開発を再スタートさせました。

  1. LSH-cascade方式によるスケーラビリティの確保 大規模なデータセットに対しても現実的な速度とリソース使用量で動作する見込みが立ちました。特に、Pythonのみで完結するライブラリ群を活用することで、Ploneの既存スタックとの親和性を保ちながら実装できました。

  2. 多様な選択肢の確立 検索方式やEmbeddingモデル(埋め込みモデル)において、複数のアルゴリズムやモデルを柔軟に選択・切り替えられるアーキテクチャが見えてきました。これにより、CPUのみの環境からGPUを搭載した高性能サーバーまで幅広く対応可能になりました。

  3. AIコーディングアシストによる開発加速 これが最も大きな要因の一つかもしれません。AIによる支援を受けることで、複雑なアルゴリズムの実装やテストコードの作成が飛躍的にスムーズになり、開発スピードが向上しました。

collective.vectorsearch の主な機能

今回完成した collective.vectorsearch は、以下の特徴を持っています。

ZCatalog 統合 (VectorIndex)

Ploneの標準的な検索機構である ZCatalog に、新しいインデックスタイプ VectorIndex を追加します。これにより、従来のテキスト検索や日付検索と組み合わせてベクトル検索を行うことが可能になります。

研究開発プロジェクト lsh-cascade-poc の成果を取り入れ、状況に応じて以下の検索方式を自動的に使い分けます。

  • Exhaustive Cosine (全探索): 最も高精度ですが、データ量が増えると遅くなります。
  • ITQ-LSH 2-Stage: ハミング距離による一次フィルタリングを行い、候補を絞り込んでからコサイン類似度を計算します。
  • ITQ-LSH 3-Stage: ピボット(基準点)を用いたフィルタリングを前段に追加し、さらに高速な絞り込みを行います。

柔軟なEmbeddingモデル

デフォルトでは FastEmbed を採用しており、CPU環境でも高速に動作する量子化モデル (All-MiniLM-L6-v2, E5-Base Multilingual) をすぐに利用できます。また、GPU環境がある場合は [gpu] オプションを追加することで、PyTorchベースのモデルも利用可能です。

その他の機能

  • アノテーションベースのデータ保存: コンテンツのアノテーション領域にベクトルデータを保存し、安全に管理します。
  • コントロールパネル: サイト設定からモデルの選択やパラメータの調整が可能です。
  • プラガブルなアーキテクチャ: 外部パッケージから独自のEmbeddingモデルプロバイダーを追加登録できる仕組みを備えています。

今後の展望

まずは基本的なベクトル検索機能を提供しましたが、今後はRAG(Retrieval-Augmented Generation)への応用や、リランキング機能の開発を続けていきます。リランキング機能は既存のキーワード検索との融合やコンテンツのライフサイクル管理なども考慮して開発しています。

ぜひ、GitHubリポジトリをチェックしてみてください。