46.6kデモを予約するログイン無料で始める

ベクトル類似性検索にフィルタリングをベストフィットさせるには?

ベクトル類似性検索にフィルタリングをベストフィットさせるには?

***この記事はアンジェラ・ニーが転記したものです。

ベクトル検索における3種類の属性フィルタリングについて学び、類似検索の効率を改善し、無関係な結果を回避するために最適化されたソリューションの例を探ります。

属性フィルタリングは、単にフィルタリングと呼ばれ、ベクトルデータベースのユーザーが望む基本的な機能の一例です。しかし、このような単純な機能は非常に複雑である。

スティーブがソーシャルメディア上でファッションブロガーの写真を見たとする。彼は、画像類似検索をサポートするオンラインショッピングプラットフォームで、似たようなジーンズジャケットを検索したい。画像をプラットフォームにアップロードすると、スティーブは似たようなジーンズジャケットの検索結果を大量に表示された。しかし、彼はリーバイスしか着ない。そうなると、画像類似検索の結果をブランドでフィルタリングする必要がある。しかし問題は、いつフィルターをかけるかだ。それは近似最近傍検索(ANNS)の前に適用すべきか、後に適用すべきか?

この記事では、ベクトルデータベースにおける3つの一般的な属性フィルタリング機構の長所と短所を検証し、オープンソースのベクトルデータベースであるMilvusによって提供される統合フィルタリングソリューションを探ります。また、最適化入力ベクトルのフィルタリングに関するいくつかの提案も行う。

ベクターデータベースにおけるフィルタリングの課題

ベクトルデータベースにおける属性フィルタリングの問題を理解するために、実際の例を挙げてみましょう:

スティーブはファッショニスタで、ソーシャルメディアを見ている。あるファッションブロガーがクールなジーンズジャケットを着ているのを見て、同じようなジャケットが欲しいと思った。スティーブは画像類似性検索を持つeコマースプラットフォームに行く。彼がジャケットの画像をアップロードすると、プラットフォームは似たようなジーンズジャケットの結果を大量に返す。しかし、スティーブはリーバイスしか好まない。

これは類似検索における疑問を提起する:いつブランドフィルター(メタデータフィルター)を適用して、望ましい検索結果を得るのか?近似最近傍検索(ANNS)の前か後か?

このことから、ベクトル・データベースにおける属性フィルタリングには3つのタイプがあることがわかる。

一般的な属性フィルタリングの3つのタイプ

一般的に、属性フィルタリングには3つのタイプがある:ポストクエリ・フィルタリング、インクエリ・フィルタリング、プレクエリ・フィルタリングです。それぞれのタイプには長所と短所があります。クエリ文字列から最も適切な結果を得るためには、フィルタリングの仕組みを理解することが重要です。

ポストクエリー・フィルタリング

その名前が示すように、ポスト・クエリー・フィルタリングは、クエリー後に得られるTopKの結果にフィルター条件を適用します。例えば、冒頭で述べたケースでは、システムはまず、在庫の中から各色で最も類似したジーンズジャケットを検索します。そして、その結果をブランドメタデータによってフィルタリングする。

クエリー後のフィルタリングの例。

しかし、このような属性フィルタリング戦略の避けられない欠点は、メタデータが条件を満たす結果の数が非常に予測できないことである。場合によっては、思うような結果が得られないこともある。なぜなら、TopK (K=10)の結果が欲しいが、フィルタを適用した後、メタデータが条件を満たさないベクトルは排除されるからである。したがって、意図したよりも少ないヒット数しか得られません。最悪のシナリオでは、ポストクエリ・フィルタリングを適用しても結果がまったく得られないこともあります。

返されるクエリー結果の数を増やしたらどうなるでしょうか?フィルター条件を適用した後でも、十分な結果を得られることは確かです。とはいえ、過剰な量の結果に圧倒される危険性があり、膨大な類似ベクトルの集合にフィルタ条件を適用する必要があるため、システムに負担がかかる可能性があります。

クエリ内フィルタリング**。

クエリ内フィルタリングは、ANNSとフィルタリングを同時に行う戦略である。例えば、オンラインショッピングの場合、在庫のジーンズジャケットの画像と寸法はベクトルに変換され、その間にブランド情報もベクトルと共にscalarフィールドとしてシステムに格納される。検索時には、ベクトルの類似度とメタデータ情報の両方を計算する必要があります。

クエリ内フィルタリングの例。

しかし、このような戦略の明らかな欠点は、システムに対する要求が法外に高いことである。クエリ内フィルタリングを行うには、ベクトルデータベースはベクトルデータと属性フィルタリング用のスカラーデータの両方をメモリにロードする必要がある。ベクトルフィールドの値とスカラーフィールドの両方を持つ各エンティティは、ベクトルデータベース内で属性フィルタリングと類似検索の2つの処理を同時に行う。しかし、条件によっては、属性フィルタリングのためのスカラー・フィールドが多すぎて、使用可能なメモリが限られている場合、システムOOM(メモリ不足)が発生する可能性があります。

OOM の解決策としては、セグメント数を増やしてピーク時のメモリ使用量を減らすことが考えられますが、セグメント数が多すぎると、ベクトルデータベースのパフォーマンス が低下します。また、セグメントを増やすことは、プログラムの実行中にランダムメモリアクセスを引き起こす可能性があるため、列ベースのインデックスでデータを格納するデータベースには適していません。

しかし、行ベースでデータを格納するデータベースには、クエリ内テキストフィルタリングが適しているかもしれません。

プレクエリ・フィルタリング

プレクエリ・フィルタリングとは、ANNSの前にフィルタ条件を適用することです。具体的には、事前クエリ・フィルタリングはベクトル・データにフィルタ条件を適用し、結果のリスト(メタデータがフィルタ条件を満たすベクトル)を返します。したがって、類似ベクトル検索は、ある特定の範囲、つまり、対象となるベクトルの範囲内でのみ行われます。例えば、すべてのジーンズジャケットの画像ベクトルは、まずブランドによってフィルタリングされます。これらの判読不可能な画像ベクトルだけが、次の段階であるベクトル類似性検索で処理されます。

事前フィルタリングの例。

プレクエリー・フィルタリングは、もっともらしいソリューションのように聞こえる。しかし、検索プロセスが遅くなるという欠点がある。ANNSクエリに進む前にすべてのデータをフィルタリングする必要があるため、事前クエリフィルタリング戦略はより多くの計算を必要とする。従って、その性能は前述の他の2つの戦略ほど良くないかもしれない。

統合された属性フィルタリングソリューション

オープンソースのベクトルデータベースであるMilvusは、統合された属性フィルタリングソリューションを提供している。

Milvusが採用しているフィルタリング戦略は、問い合わせ前のフィルタリング戦略とよく似た構文ですが、若干の違いがあります。Milvusはフィルタリング機構にビットマスクの概念を導入しています。

ビットマスクはビット番号("0 "と "1")の配列で、特定のデータ情報を表現するために使用できます。ビットマスクを使うことで、Intsやfloat、charsに格納するのとは対照的に、ある種のデータをコンパクトかつ効率的に格納することができる。ビットマスク・フォーマットはブーリアン・ロジックで動作します。ブーリアンロジックによると、出力の値は有効か無効かのどちらかで、通常はそれぞれ "1 "と "0 "で示されます。1 "は有効を表し、"0 "は無効を表す。ビットマスクは非常に効率的でストレージを節約できるため、属性フィルタリング、削除操作、タイムトラベルなど、多くの機能を実現するためにも使用できる。

Milvusのフィルタリング](https://zilliz.com/blog/json-metadata-filtering-in-milvus)ソリューションでは、ビットマスクは追加データフィールドと見なすことができる。ベクターのメタデータがフィルタリング条件を満たす場合、そのベクターはビットマスクフィールドで "0 "とマークされます。メタデータが条件を満たさないベクトルは、そのビットマスクに "1 "とマークされる。データセットのすべてのメタデータがフィルタ条件に照らして評価されると、"1 "と "0 "のみからなるビットマスクが生成される。Milvusでは、このフィルタリング後のビットマスクは、削除ビットマスクやタイムトラベルビットマスクなどの他のビットマスクと結合され、最終的に基礎となる計算エンジンに渡される。ANNSの間、最終的なビットマスクで "1 "とマークされたベクターデータは無視される。

Milvusのフィルタリングメカニズム。

Milvusのフィルタリングソリューションには以下の利点がある:

  • 結果の数をコントロールできる。期待通りの結果を得ることができる。

  • ピーク時のメモリ使用量が比較的少ない。

  • 属性フィルタリングのコードや、削除操作のような他の機能を再利用することで、複雑さと開発コストを削減できます。

フィルタリングの最適化

前述の解決策にもかかわらず、属性フィルタリングのメカニズムをさらに最適化するために、もっと多くの作業を行うことができます。

  • 二相演算は、より明確なコードロジックにつながります。並列コンピューティングを採用することで、2つのフェーズを高速化することも容易である。

  • スカラー・フィールド、特に文字列のインデックスを構築し、文字列比較の効率を大幅に向上させることで、フィルタリング処理を高速化する。

  • フィルタリング条件を満たさないセグメント内のデータ全体を迅速に除去するために、各セグメントに対して統計情報を作成する。

  • ブール式のオプティマイザを構築。オプティマイザは、SQL式を、基礎となるエンジンで実行可能な最適な実行プランに変換することができます。例えば、a/4 > 100 という条件式を入力すると、オプティマイザは a > 400 に変換し、フィールド a の各値を 4 で割って結果を 100 と比較する手間を省きます。

  • Milvusでは、属性フィルタリングはANNSの前に行われるため、データの各行をフィルタリングして計算する必要があり、システムのパフォーマンスが低下する可能性があります。IVFインデックス](https://zilliz.com/learn/vector-index)では、nprobeバケットのみが計算対象として選択される。したがって、どのバケットを計算するかがわかれば、そのバケット内のベクトルをフィルタリングするだけで、計算負荷を大幅に軽減することができる。しかし、この最適化戦略はIVFインデックスに限定されており、HNSWのような他のタイプのインデックスにこの種の最適化を適用することは推奨されない。

結論

類似検索の属性フィルタリングは厄介ですが、Milvusの組み込みフィルタリングのようなソリューションは効率的なフィルタリングに役立ちます。様々なフィルタリング方法の長所と短所を理解し、最適化することで、より効果的でパフォーマンスの高いベクトル検索アプリケーションを構築することができます。

ベクトルデータベースが進化するにつれて、属性フィルタリングのメカニズムがさらに進化し、より効率的で柔軟な検索が可能になるでしょう。この分野の将来は、電子商取引のレコメンデーション、画像・動画検索、その他効率的な類似検索に依存する多くのアプリケーションに新たな可能性をもたらすだろう。

他のリソースをお探しですか?

  • ベクトルデータベースの概念について学ぶ

    • ベクターデータベースとは](https://zilliz.com/learn/what-is-vector-database)
  • 他のAIアルゴリズムについて学ぶ:

  • ベクトル類似検索の他のアプリケーションについてはこちらをご覧ください:

    • 画像類似性検索でオンラインショッピングをよりインテリジェントにする方法](https://zilliz.com/learn/online-shopping-image-similarity-search)

    • ベクトル類似性検索であなたのワードローブを持続可能にする方法](https://zilliz.com/learn/vector-similarity-search-and-fashion)

    • 画像ベースの商標類似検索システム:知的財産権保護のよりスマートなソリューション](https://zilliz.com/learn/image-based-trademark-similarity-search-system)

    • グラフィックデザイナーのための知的類似検索システム](https://zilliz.com/learn/vector-similarity-search-graphical-design)