コンテンツにスキップ

AI: ベクトル検索 は、テーブルのベクトル列がクエリベクトルにどれだけ近いかで行を順位付けし、最も近い行を、順位付けの根拠となった距離とともにターゲットテーブルに書き込みます。複数のクエリベクトルを指定すると、それぞれに専用の一致結果が得られ、ソーステーブルに対する 1 回の走査で、すべての結果が 1 つの出力テーブルに書き込まれます。

検索は 完全一致 です。ステップのフィルターを通過したすべての行がすべてのクエリベクトルと比較されるため、一致結果は近似ではなく真の最近傍の行です。作業量は、走査する行数にクエリベクトルの数を掛けた分だけ増えます。構築・調整したり、代わりに利用したりするベクトルインデックスはありません。

フィルター後の全行を比較 — インデックスなし、近似なしクエリベクトル検索するテーブル先にフィルター距離小さいほど近いターゲットテーブルクエリごとの上位一致距離を測定できない行は、先頭に順位付けされるのではなく除外されます
行はまずフィルターされ、残ったすべての行が各クエリベクトルに対してスコア付けされて、最も近い行が保持されます。フォールバックできるインデックスがないため、フィルターを絞り込むことで大きなテーブルでも高速になります。
  • 検索するテーブル — 格納されているベクトルを検索するテーブルです。
  • ターゲットテーブル — 一致結果を書き込むテーブルです。
  • ベクトル列 — 検索するテーブルで、距離の測定対象となるベクトル列です。 他のデータ型は、列名と実際に保持している型を示して拒否されます。
  • 距離メトリック — コサイン または ユークリッド(L2) です。コサインは 2 つのベクトル間の角度を測定し、大きさは無視します。これはテキスト埋め込みに適しています。ユークリッドは直線距離を測定し、大きさを考慮します。どちらも、距離が小さいほど近い行です。デフォルトはコサインです。
  • クエリあたりの一致数 — 各クエリベクトルについて保持する最近傍の行数です。デフォルトは 10 です。

クエリベクトル タブには、クエリごとに 1 つのエントリを持つ JSON 配列を指定します。各エントリには id と vector を含めます。

[
{"id": "q1", "vector": [0.1, 0.2, 0.3]},
{"id": "q2", "vector": [0.4, 0.5, 0.6]}
]

各クエリはそれぞれ専用の一致結果を返し、出力では id によって識別されます。ID は一意である必要があり、すべての値は有限の数値で、すべてのクエリベクトルは格納されているベクトルと同じ数の値を持つ必要があります。距離は、幅が等しいベクトル間でのみ定義されるためです。不一致の場合は、クエリ、保持している値の数、列が保持または宣言している幅を示して拒否されます。

フィルターは、対象となる行を制限します。行は順位付けの 前に フィルターされるため、一致結果は、全体で最も近い行を後でフィルターしたものではなく、フィルターを通過した行の中で最も近い行です。これは、ステップの作業量を制御する主な手段です。検索サイズの見積もりを参照してください。

各一致結果は、テーブルデータの選択 タブで選択した列に加えて、名前を指定できる 2 つの計算列を持つ 1 行として書き込まれます。

  • クエリ名の列 — この行が応答するクエリベクトルの ID です。デフォルトは query_id です。
  • 距離列 — 一致結果とそのクエリベクトルとの間で測定された距離です。デフォルトは distance です。これは順位付けのキーでもあります。

出力では、クエリ名が最初に、選択した列がその次に、距離が最後に配置されます。出力列の名前は一意である必要があります。

距離を測定できない行は、最も近い行であるかのように返されるのではなく、一致結果から 除外 されます。実際に遭遇するのは、大きさが 32 ビット浮動小数点数の範囲を超えるベクトルのケースです。そのベクトルについては測定可能な距離が返されず、測定できない距離を最後に並べる手段がないため、そのような行を含めると、検索にとって最も情報の少ない行がすべての結果の先頭に表示されてしまいます。

件数を確認するには、診断モード をオンにしてワークフローを実行します。ワークフローログには、各クエリで除外された行数、またはステップが検索したすべての行を測定したことが報告されます。この件数の取得にはテーブルの 2 回目の走査が必要になるため、コストが発生するのは要求した場合のみです。診断モードがオフの場合、ログには、測定できない行は設計上除外されることが示され、件数については診断モードを参照するよう案内されます。

配列の中に 欠損値 を含む格納済みベクトルは別の問題です。欠損値を含む配列に対しては距離を測定できないため、部分的な結果を黙って返すのではなく、列名を示して検索が完全に拒否されます。該当する行を修正または削除してから、もう一度実行してください。

実行のコストは、候補となる行数にクエリベクトルの数を掛けたものです。合計が 100 億回の距離測定を超える検索は、完了できない作業を開始するのではなく、行数、クエリ数、上限を報告して拒否されます。検索をこの上限の十分内側に収めるには、次の 2 つの方法があります。

  • 重要な部分に絞り込む。 コーパス全体を走査して一部についての質問に答えるのではなく、候補を 1 つのエンティティ、1 つの期間、1 つのドキュメントセットに絞り込みます。
  • 常にフィルターするディメンションでテーブルを分割し、該当するテーブルを検索します。候補数を減らすことは、ここで利用できる他のどの方法よりもはるかに効果的です。

列に ベクトル幅 を宣言することも役立ちます。宣言されていれば、ステップは行をサンプリングして調べる代わりに、宣言から幅を取得します。ベクトルデータ型を参照してください。

ベクトル列を使用できない用途

Section titled “ベクトル列を使用できない用途”

ベクトル列は、結合キー、グループ化列、集計の対象として拒否されます。これはこのステップでも他のすべてのステップでも同じです。メッセージには、ステップを保存するとき、および以前に保存したステップを実行するときの両方で、列名と使用された用途が示されます。代わりに、ベクトルの横にあるビジネスキーで結合やグループ化を行ってください。ベクトルを通常の出力列としてステップに引き継ぐことや、行数や重複を除いた値の数をカウントすることは問題ありません。