コンテンツにスキップ

Blog

CMScomLabの活動記録や技術記事などのブログです。

Voronoi分割によるテキストEmbeddingの事前枝刈り実験とPlone実装への展開

2026-02-14の記事 では、collective.vectorsearch の初期リリースと、LSH Cascade PoC から取り込んだ近似検索の仕組みを紹介しました。 その後、2026-03-14の記事 で、顔画像の embedding に対して Voronoi 分割による事前枝刈りが有効であることを確認しています。

今回はこの流れを受けて、同じアプローチを テキスト embedding に適用できるかを検証しました。 結論から言うと、テキスト側でも Voronoi 分割を前段フィルタとして使える見込みが見えてきました。

Image Vector PoC: Voronoi分割によるFirestoreのベクトル検索最適化

本日は Image Vector PoC プロジェクトにおける技術的なブレイクスルーについて報告します。 Firestore を利用したベクトル検索において、Voronoi(ボロノイ)分割を用いた事前フィルタリングを導入し、検索コストとパフォーマンスを劇的に改善することに成功しました。

軽量Embeddingモデルの可能性と現実:Gemma-300M vs CPU推論

lsh-cascade-poc プロジェクトでは、これまでスケーラブルな検索システムの構築を目指して様々な実験を行ってきました。 今回は、GitHubリポジトリの Notebooks 91番以降 で実施した、最新の 軽量Embeddingモデル に関する実験結果と、そこから得られた知見を共有します。

2026年に入り、Embeddingモデルのトレンドは大きく変化しています。

Graph RAG と Temporal Knowledge Graph の実験:点から線へ

これまでの実験では、テキストや画像の「ベクトル検索」によって、類似情報を高速に見つける技術を検証してきました。 しかし、ベクトル検索だけでは「AとBの関係は?」「前回の会議から何が変わった?」といった、構造や時間を伴う質問には弱いという課題がありました。

そこで新たに Graph RAG (Retrieval-Augmented Generation) の実験プロジェクトを立ち上げ、特に「時系列情報(Time)」をグラフに組み込むアプローチを検証しました。

画像からテキスト生成(キャプション生成)の実験報告

前回までの記事で、画像のベクトル検索の実験を進めてきましたが、今回は「画像からテキスト(キャプション)」を生成するモデルの実験を行いました。 画像の内容を言語化することで、検索のキーワードマッチングや、画像の内容説明(アクセシビリティ向上)などへの応用が期待できます。

実験の詳細な結果は以下のノートブックにまとめてあります。

cmscom/image-vector-poc - 78-captioning-summary.ipynb

Image Vector プロジェクト進捗: 顔認識、ブラウザ実行、そして SigLIP 2

前回 2026-02-13 での報告以降、Image Vector プロジェクトでは新たな可能性を探るためにいくつかの重要な実験を行いました。今回はその進捗と成果について共有します。

1. 顔認識機能の到達点

まず、顔認識(Face Recognition)の実装について検証を行いました。

結論として、現在のOSSモデルを利用した顔認識機能は 非常に高いレベル に達していることが確認できました。 CMSにおいて「誰が写っているか」を自動でタグ付けしたり、特定の人物の写真を瞬時に検索したりする機能の実装において、現在のモデルは十分実用的な性能を持っています。これにより、単なる「類似画像検索」だけでなく、「人物検索」という強力な軸をシステムに組み込む準備が整いました。

2. Python と JavaScript の架け橋: Transformers.js

次に、アーキテクチャ面での大きな収穫です。ONNX Runtime と Transformers.js を用いた検証を行いました。

重要な発見は、Transformers.jsを使ったJSでの実装も十分に可能である という点です。具体的には、Python (PyTorch) で生成した画像ベクトルと、JavaScript (Transformers.js) で生成したテキスト検索クエリの埋め込みベクトルが完全な互換性を持つ ことが確認されました。

これは、重い画像処理やインデックス作成はサーバーサイド(Python)でバッチ処理しておき、ユーザーが検索窓に入力したキーワードのベクトル化は、サーバーを介さずにユーザーのブラウザ上(JavaScript)で完結させるという構成が可能であることを意味します。サーバー負荷を抑えつつ、高速な検索体験を提供できる可能性があります。

3. モデルの再考: SigLIP 2

最後に、より高性能なモデルとして SigLIP 2 の検証を行いました。

検証の結果、SigLIP 2 は前モデルと比較しても明確に良くなっている ことが確認できました。特に画像のニュアンスを捉える能力や、多言語での検索精度において期待が持てます。これを ONNX 化して利用することで、推論速度とモデルサイズのバランスを取りながら、より高精度な検索システムを構築できる見込みです。

今後の展望

今回の実験を通じて、顔認識の実用性、クライアントサイドでの推論の可能性、そして最新モデルによる性能向上が確認できました。今後はこれらの要素を統合し、より高度な画像検索システムの構築を目指していきます。

AIが変える「検索」の未来:ベクトル検索の世界へようこそ

前回の記事ではベクトル検索の基本構成を整理しました。本稿では、言語と画像が同じ空間で検索できるマルチモーダルの話題、近似近傍探索やベクトルDBの選択肢、さらにレガシー環境での工夫やインフラの現実的な論点まで、少し広い視点でまとめます。

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リポジトリをチェックしてみてください。

Image Vector PoC: Gradioによるデモアプリの構築と実験結果

Image Vector PoC プロジェクトの一環として、Gradioを使用したデモアプリを作成し、実際のデータを用いた検証を行っています。

デモアプリの概要

今回作成したデモアプリでは、以下の主要な機能を実装しました。

  • テキスト検索機能: 自然言語で画像を検索
  • 類似画像検索機能: アップロードした画像に似た画像を検索
  • フィルタリング機能: イベントごとの絞り込み

モデルには、事前の実験で多言語対応において良好な結果を示した Google SigLIP を採用しています。

検証データ

検証には、PyCon JP がFlickrで公開している3万枚を超える写真データを使用しました。

実験結果

できたこと

  • テキスト検索: 「おやつ」や「ビール」といった日本語のキーワードを入力すると、多くの関連画像が高い精度でヒットすることを確認しました。
  • 類似画像検索: 画像を入力すると、構図や色合いなど「雰囲気」が似ている写真が検索結果として表示されました。

以下が、デモアプリのスクリーンショットです。

デモアプリのスクリーンショット(ステージを検索) デモアプリのスクリーンショット(類似画像検索)

できていないこと・課題

  • 人物検索: 特定の人の顔画像を入れても、まったくの別人が検索結果に出ることがあります。これは本システムが顔認識(Face Recognition)ではなく、画像全体のベクトル化を行っているためであり、想定される挙動ではありますが、利用時には注意が必要です。

考察

実際に触ってみて感じた点は以下の通りです。

  • 大量のデータからの絞り込み: さまざまなキーワードを使って検索すると、3万枚という膨大な写真の中からある程度絞り込まれた画像が瞬時に出てくるのは非常に便利だと感じました。
  • 雰囲気や構図の一致: 画像から画像を検索する場合、同じような構図や、服装を含めた「雰囲気」まで似た写真が出てくることが確認できました。
  • クロップ検索の有用性: さらに、画像の一部をクロップしてその部分を指定して検索すると、同じようなカットの写真をピンポイントで取得できることがわかりました。これは素材探しなどで便利に使えそうです。

また、過去のイベント写真を眺めていると、個人的に懐かしい写真にも予期せず出会うことがあり、技術的な検証以上の感慨深さがありました。

データの利用に関する注記

本検証で使用した写真データについて、以下の通り付記します。 - 使用した写真は CC-BY PyCon JP のライセンス下で公開されているものです。 - 筆者(寺田)は一般社団法人PyCon JP Associationの理事を務めておりますが、写真の取得にあたっては他の理事の許可を得た上でAPIキーを取得し、実施しました。

新プロジェクト「Image Vector PoC」を開始しました

新しいプロジェクトとして、画像のベクトル検索を検証する Image Vector PoC を開始しました。

プロジェクトの目的

この実験的なプロジェクトでは、昨今のマルチモーダルモデルの進化を受けて、画像のベクトル化による検索システムがどこまで実用的かを検証します。特に、自然言語(日本語)で「どのような画像か」を説明することで、意図した画像を見つけ出せるかどうかに焦点を当てています。

取り組みの現状

現在、いくつかのモデルを比較検討していますが、日本語での検索においては Google SigLIP が比較的意図に近い結果を返す傾向が見られています。

まずはこの SigLIP を使用したシンプルな画像検索システムをサンプルとして構築し、実際の検索精度や使い勝手を確認していく予定です。

リポジトリはこちら: https://github.com/cmscom/image-vector-poc