AlloyDB のフィルタ付きベクトル検索の概要

このページでは、AlloyDB for PostgreSQL のフィルタ付きベクトル検索の概要について説明します。

フィルタ付きベクトル検索は、クエリベクトルと特定のフィールドのフィルタで構成されます。AlloyDB は PostgreSQL の豊富なクエリ機能を使用しているため、ベクトル検索を実行し、単一の SQL インターフェースから構造化データと非構造化データの両方をクエリできます。

フィルタ オプション

AlloyDB クエリ オプティマイザーは、ベクトル検索に最も効率的なフィルタリング戦略を決定するうえで重要な役割を果たします。

さまざまな実行プランの費用を見積もるために、クエリ オプティマイザーはクエリを分析し、フィルタの選択性、データ分散、インデックスの可用性などの要素を考慮します。

費用の見積もりに基づいて、オプティマイザーは次の中から最適なフィルタリング戦略を選択します。

事前フィルタリング

事前フィルタリングは、AlloyDB がフィルタを使用して、データセット全体を検索するのではなく、条件に一致するアイテムの小さなグループを見つけるクエリ最適化戦略です。次に、AlloyDB はその小さいグループに対してベクトル検索を実行します。

たとえば、類似する青いシャツを検索する場合、AlloyDB はまずすべての青いシャツを見つけ、そのグループ内で類似するアイテムを検索します。

この戦略では、計算集約型のベクトル類似性検索を削減されたデータセットで実行するため、パフォーマンスが向上します。

ポスト フィルタリング

ポスト フィルタリングは、フィルタで結果が大幅に絞り込まれない場合に AlloyDB が使用する戦略です。AlloyDB では、最初にフィルタリングを行うのではなく、ベクトル検索に基づいて類似アイテムの幅広いリストを最初に見つけます。次に、結果をフィルタ条件と照らし合わせて、最終的なリストを生成します。

たとえば、類似の映画を検索していて、genre = drama のような非常に広範なフィルタを使用している場合、AlloyDB はまず、検索内容に類似する大量の映画を見つけ、その後、ほとんどの映画がドラマである可能性があるため、ジャンル別にフィルタします。

この方法は、フィルタに一致する結果が多数ある場合に効率的です。

インライン フィルタリング

インライン フィルタリングは、AlloyDB がベクトルと他のセカンダリ インデックスの両方を使用して、ベクトル検索とフィルタ評価を同時に実行するクエリ最適化戦略です。AlloyDB はベクトル インデックスを検索して類似ベクトルを検出し、各ベクトルがメタデータのフィルタ条件に一致するかどうかを確認します。B-tree、GIN、GiST などのインデックスを活用して、これらの条件をすばやく評価します。

たとえば、類似の靴を検索して color = black でフィルタリングする場合、インライン フィルタリングにより、AlloyDB は既存の黒い靴の類似性のみを確認します。これは、すべての靴の類似性をチェックしてから色でフィルタする方法や、すべての靴を色でフィルタしてから類似性をチェックする方法よりも効率的です。

インライン フィルタリングは、フィルタで結果を適度に絞り込む場合に適しています。

クエリプランについて

クエリプランは、クエリ実行プロセスの包括的なビューを提供し、[実行戦略] フィールドに、AlloyDB がベクトル スキャン オペレーションに選択したフィルタリング戦略が表示されます。

インライン フィルタリングのクエリプラン

インライン フィルタリングの場合、AlloyDB はカスタム スキャン プランノード(ベクトル スキャンとも呼ばれます)を使用します。このノードは、ビットマップ インデックス スキャン プランノードを使用して、フィルタ句のビットマップを提供します。

ベクトル スキャンでは、フィルタ条件を満たす行の距離のみが計算されます。

次のクエリは、color = black でフィルタされた shoes 検索のインライン フィルタリングを示しています。

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

次のクエリプランの例は、インライン フィルタリングを使用した最適化されたベクトル検索を示しています。

Limit (actual rows=10)
  ->  Custom Scan (vector scan) on products
      Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
      Order By: (embedding <=> '[...]')::vector)
      Limit: 10
      ->  Bitmap Index Scan on products (color_index)
          Index Cond: (color = 'black')

クエリプランの例では、Limit (actual rows=10) は、クエリが SQL の LIMIT 10; 句を使用して出力を制限したことを示しています。actual rows=10 は、このノードがクエリの実行中に 10 行を返したことを意味します。

-> Custom Scan (vector scan) on products ノードはベクトル検索オペレーションを表します。これはベクトルデータ用の特別なスキャンであり、products テーブルで動作するため、カスタム スキャンです。インライン フィルタリングのサンプル クエリプランの例では、[実行戦略] フィールドに Bitmap assisted vector Scan on products_embedding_index と表示されます。これは、ベクトル スキャンがビットマップを使用して、類似検索を実行する必要がある行の候補リストを作成することを示します。ビットマップ インデックス スキャンは、color = 'black' 条件に基づいてデータをフィルタするために使用されます。

Order By: (embedding <=> '[...]')::vector 属性は、式 (embedding <=> '[...]')::vector を使用して計算されたベクトルの類似性に基づいて結果が並べ替えられることを示します。ここで、embedding はベクトル列、<=> は最近傍演算子、[...] はクエリベクトル、::vector はベクトル データタイプへのタイプ変換を実行します。

-> Bitmap Index Scan on products (color_index) ノードは colors_index のビットマップ インデックス スキャンを表します。ビットマップ インデックス スキャンは、ビットマップを使用してフィルタ条件に一致する行を選択し、color_index を使用してフィルタリングします。

Index Cond: (color = 'black') 属性は、クエリの WHERE 句の color = 'black' インデックス スキャンで使用されるフィルタ条件を指定します。

次のステップ