AlloyDB のベクトル検索の機能強化の詳細
Tabatha Lewis-Simo
Product Manager
※この投稿は米国時間 2025 年 5 月 22 日に、Google Cloud blog に投稿されたものの抄訳です。
生成 AI アプリケーションや AI エージェントを構築する場合、構造化データと非構造化データを同時に検索しなければならないことがよくあります。たとえば、「過去 1 か月間に撮影した夕日の写真を表示して」というプロンプトには、構造化データ(撮影日が過去 1 か月以内)と非構造化データ(写真に夕日が写っていること)が含まれています。近年、AlloyDB for PostgreSQL などの最新のリレーショナル データベースには、非構造化データも対象にするベクトル検索機能が追加されています。
Google Cloud Next 2025 では、AlloyDB AI の ScaNN インデックスでの重要なイノベーションを発表しました。これにより、構造化データと非構造化データに対する検索のパフォーマンスと品質が改善します。ScaNN インデックスは AlloyDB のクエリ プランナーと緊密に統合されているため、ワークロードの特性に基づいてベクトル検索での SQL フィルタの順序を最適化できます。フィルタの選択性とはなにか、AlloyDB ScaNN のインデックスがフィルタの選択性を検索のパフォーマンスと品質の改善にどう役立てているかについて説明します。
フィルタ付きベクトル検索
AlloyDB のフィルタ付きベクトル検索の機能を説明するにあたって、AlloyDB 内で商品カタログを管理しているオンライン小売店業者を例にします。10 万点を超える商品が含まれるこの商品カタログには、products
テーブルに画像、テキストでの説明、在庫情報、カタログのメタデータへの参照が含まれています。


このデータを検索するために SQL フィルタ付きベクトル検索を利用することで、非構造化データと構造化データの両方を検索することが可能になり、ユーザーに質の高い検索結果を提供できます。メタデータには、色、性別、サイズ、価格などのフィールドがテーブルに保存されている場合があり、それらを検索フィルタとして活用できます。
ユーザーが「maroon puffer jacket」と検索した場合、たとえば「maroon」をフィルタとして使用し、「puffer jacket」の部分をベクトル検索の対象とします。この場合、次のような SQL ステートメントになります。
products
テーブルでは、「text_embedding」列にベクトル インデックスを、メタデータ列「color」に B-tree インデックスを設定しています。
データセットの「color」列に「maroon」が表示される頻度(データベースの用語では選択性)によって、AlloyDB クエリ プランナーはベクトル検索クエリの前、後、インラインのいずれでフィルタを適用するかを決定します。プランナーがこの 3 つのオプションから特定のオプションを選択する理由について詳しく見てみましょう。
選択性が高い場合
フィルタの選択性が高い場合、データのうち指定された条件を満たすものはごくわずかです。この例では、「maroon」は珍しい色で、カタログ内の 10 万点の商品のうち 0.2% のみが該当します。
選択性の高いフィルタの場合、AlloyDB クエリ プランナーは通常プレフィルタの適用を選択します。つまり、ベクトル検索の前にフィルタ条件を適用します。この例では、フィルタ条件の「WHERE color='maroon'」はベクトル検索の前に適用されます。「maroon」は珍しい色であるため、「color」列の B-tree インデックスは効率的に商品の小規模なサブセット(10 万点のうち 200 点など)を特定できます。その後、大幅に少なくなった候補に対してのみ、計算負荷の高いベクトル検索が実行されます。この戦略では、k 近傍(KNN)ベクトル検索を使用して、フィルタにより返された結果セット内で、100% の再現率(正確な最近傍)で結果を返します。
選択性が低い場合
この逆でフィルタの選択性が高くない場合(商品の 90% が「blue」の場合など)、プレフィルタでは検索空間を大幅に絞り込めないため、非効率的です。このようにデータの大部分がフィルタ条件を満たしている場合、フィルタは選択性が低いと見なされます。
たとえば、「blue puffer jackets」を検索したときに、カタログの 90% が青色の場合、最初にフィルタを適用しても、候補リストをそれほど絞り込めないため、あまり意味がありません。プレフィルタを適用した場合、データセットの大部分に対して KNN ベクトル検索を実行することになり、計算コストが高くなります。そのため、AlloyDB クエリ プランナーはポストフィルタの適用を選択します。


ポストフィルタとは、まずベクトル検索を実行し、「text_embedding」列で ScaNN などの近似最近傍(ANN)ベクトル インデックスを利用して、候補結果のセットをすばやく特定することです。このような最初の候補(ベクトル類似度に基づく上位 100 件)を取得した後で初めて、フィルタ条件の「WHERE color='blue'」が適用されます。
フィルタの選択性が高い場合、このアプローチではフィルタ条件を満たす候補がほとんど表示されないリスクがあります。しかし、「WHERE color='blue'」という条件の場合は選択性が低いため、上位 100 件ほどの結果を得られる可能性が高くなります。まれに 100 件の結果を得られなかった場合、ベクトル検索でベクトル インデックスに対して追加のスキャンを実行し、必要な数に達するまで候補を取得しなければならない可能性があります。ポストフィルタは選択性が低いフィルタに対しては効果的ですが、選択性が高いフィルタではベクトル インデックスが一致しない多数の候補をスキャンする必要があるため、効率的ではなくなります。
選択性が中程度の場合
フィルタの選択性が中程度の場合、AlloyDB クエリ プランナーはプレフィルタまたはポストフィルタのどちらかを選択することができます。ただし、0.5~10% の中程度の選択性の場合(色が「purple」の場合など)、AlloyDB はインライン フィルタリング、またはインフィルタリングと呼ばれる方法をサポートしています。インライン フィルタリングでは、フィルタ条件をベクトル検索と連動して適用します。AlloyDB は B-tree インデックスのビットマップを利用して、フィルタ条件に一致する候補をベクトル検索と同時に 1 回のパスで選択します。
この例では、クエリプランが紫色の候補を評価すると同時に、AlloyDB がデータカタログ内の商品に対して検索クエリの近似近傍を検索しています。これはプレフィルタのように検索空間を絞り込むメリットを持ちつつ、ポストフィルタで選択性が高いフィルタを使った場合に発生する可能性がある、わずかな結果しか返されないリスクを減らすという、バランスをとったアプローチです。
適応型フィルタリング
上述のケースでは、検索空間は 3 種類のフィルタの間ではっきり分かれているように見えますが、現実にはそれほどシンプルではありません。統計情報が古いためにクエリ プランナーがフィルタの選択性を誤って判断し、ベクトル検索とフィルタ条件が適切ではない順序で適用され、質の低い結果につながることがあります。このような場合に、AlloyDB ScaNN の最新イノベーションである適応型フィルタリングが役に立ちます。適応型フィルタリングを使って、AlloyDB は観測された実際の統計情報に基づいて、クエリ時にフィルタの選択性を学習し、実行プランをそれに応じて変更します。これにより、フィルタとベクトル検索を最適な順序で実行でき、プランナーの誤った評価により生じる問題を大幅に削減できます。
まとめると、実際のワークロードは複雑で、フィルタ条件の選択性はそれぞれの条件によって異なり、データとワークロードの増加に伴って今後選択性が変化する可能性もあります。そこでベクトル検索を強化するインテリジェントなデータベース エンジンが役に立ちます。フィルタリングをワークロードに合わせて最適化し適応することにより、データの進化に沿って、一貫して高品質でパフォーマンスに優れた検索結果を取得できるようにします。
使ってみる
ぜひ AlloyDB の ScaNN インデックスを利用したベクトル検索を使ってみてください。そして、AlloyDB AI の最新機能をマルチモーダル ベクトル検索に活用する方法についてご確認ください。適応型フィルタリングはプレビュー版でご利用いただけます。フィーチャー トグルをオンにしてご利用ください。
30 日間の AlloyDB の無料トライアルもお試しいただけます。
ー プロダクト マネージャー、Tabatha Lewis-Simo