AnalyticDB for PostgreSQLは、すべてのベクトル間の距離または類似度を比較する正確な検索方法と、階層的ナビゲート可能スモールワールド (HNSW) インデックスを使用する近似インデックス検索方法を提供します。 近似インデックス検索方法は、正確な検索方法よりも高速に結果を返します。
正確な検索
厳密検索法は、すべてのベクトル間の距離または類似性を比較する総当たり検索法である。 この方法は、低い応答速度をもたらすが、100% 再現率を達成することができる。
ユークリッド距離、内積距離、またはコサイン類似度に基づいて正確な検索を実行できます。
ユークリッド距離
SELECT ID, l2_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY l2_squared_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) LIMIT <TOPK>;
内部プロダクト間隔
SELECT ID, inner_product_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY negative_inner_product_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) LIMIT <TOPK>;
コサイン類似性
SELECT ID, cosine_similarity(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY cosine_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) LIMIT <TOPK>;
パラメーター:
スコア: ユークリッド距離、内積距離、またはコサイン類似度。 ベクトルは、昇順のユークリッド距離によって、または降順の内積距離またはコサイン類似度によってソートされます。
<VECTOR_COLUMN_NAME>: ベクトル列の名前。
<TABLE_NAME>: ベクトルテーブルの名前。
<TOPK>: トップ結果セットの数。
おおよそのインデックス検索
近似インデックス検索方法は、HNSWインデックスを使用してデータを検索します。 このメソッドは高速に動作しますが、99% を超えるリコール率でおおよその結果を返します。
構文
ユークリッド距離、内積距離、またはコサイン類似度に基づいて、近似インデックス検索を実行できます。
V6.3.10.18以降のAnalyticDB for PostgreSQLインスタンスのみが、内積距離またはコサイン類似度に基づく近似インデックス検索をサポートしています。 AnalyticDB for PostgreSQLインスタンスのマイナーバージョンがV6.3.10.18以降であることを確認してください。 マイナーバージョンを表示および更新する方法については、「マイナーエンジンバージョンの更新」をご参照ください。
ユークリッド距離
SELECT ID, l2_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY <VECTOR_COLUMN_NAME> <-> array[1,2,3...N]::float4[] LIMIT <TOPK>;
内部プロダクト間隔
SELECT ID, inner_product_distance(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY <VECTOR_COLUMN_NAME> <#> array[1,2,3...N]::float4[] LIMIT <TOPK>;
コサイン類似性
SELECT ID, cosine_similarity(<VECTOR_COLUMN_NAME>, array[1,2,3...N]::float4[]) as score FROM <TABLE_NAME> ORDER BY <VECTOR_COLUMN_NAME> <=> array[1,2,3...N]::float4[] LIMIT <TOPK>;
近似インデックス検索のパラメーターの説明は、厳密検索のパラメーターの説明と同じです。
インデックスが作成されていない場合、またはFastANNベクトル検索エンジンにパラメーターが設定されていない場合、近似インデックス検索は完全検索にダウングレードされます。
ベクトルインデックスを使用する場合は、ORDER BY句でASCを指定または省略する必要があります。 ベクトルを降順で並べ替える場合、または別の列を使用してベクトルインデックス検索の結果を並べ替える場合は、ベクトルインデックス検索をサブクエリとして指定し、親クエリにorder by句を追加します。
ベクトルインデックスを使用する場合は、ORDER BY句で
<->
、<#>
、<=>
などの演算子を指定する必要があります。 さらに、<->
、<#>
、または<=>
演算子は、対応する距離測定を使用して作成されたベクトルインデックスを使用する必要があります。 これにより、ベクトルインデックスを使用してクエリを高速化できます。 サポートされている演算子とその使用方法については、「ベクトルインデックスの作成」をご参照ください。
例
この例では、テキスト知識ベースが使用されます。 ベクトルインデックス検索方法を使用して、テキストのソース記事を検索できます。 例:
SELECT id, chunk, intime, url FROM chunks
ORDER BY
feature <=> array[10,2.0,..., 1536.0]::real[]
LIMIT 100;
EXPLAINステートメントを実行して、クエリの実行計画を確認できます。
次のサンプル実行プランでは、Ann Index Scan
はベクトルインデックスが使用されていることを示しています。
QUERY PLAN
-------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: ((feature <=> $0))
-> Limit
-> Ann Index Scan using feature_idx on chunks
Order By: (feature <=> $0)
Optimizer: Postgres query optimizer
先月のテキストのソース記事を検索する場合は、統合検索方法を使用できます。 例:
SELECT id, chunk, intime, url FROM chunks WHERE
intime > '2023-04-01' AND intime <= '2023-05-01'
ORDER BY
feature <=> array[10,2.0,..., 1536.0]::real[]
LIMIT 100;
関連ドキュメント
ベクトル検索のSQL最适化
このセクションでは、ベクトル検索のSQL最適化について説明します。 ベクトルテーブルを作成した後、ビジネス要件に基づいてベクトル列に複数のベクトルインデックスを作成できます。 SQL文と関連するインデックスは一致する必要があります。 たとえば、<->
演算子はユークリッド距離を使用して作成されたインデックスのみを処理でき、<#>
演算子は内積距離を使用して作成されたインデックスのみを処理でき、<=>
演算子はコサイン類似度を使用して作成されたインデックスのみを処理できます。
CREATE TABLE test_table (
id serial primary key,
feature real[]
) distributed by (id);
CREATE INDEX idx_test_table_feature_l2 ON test_table USING ann(feature) WITH (dim=768, distancemeasure=l2, hnsw_m=64, pq_enable=1);
CREATE INDEX idx_test_table_feature_ip ON test_table USING ann(feature) WITH (dim=768, distancemeasure=ip, hnsw_m=64, pq_enable=1);
CREATE INDEX idx_test_table_feature_cosine ON test_table USING ann(feature) WITH (dim=768, distancemeasure=cosine, hnsw_m=64, pq_enable=1);
ベクトル距離のスコア値を返さない場合は、次のSQL文を実行してベクトルデータを照会できます。
-- Search vector data based on the Euclidean distance. SELECT id FROM test_table ORDER BY feature <-> array[1,2,3 ... 768]::real[] LIMIT topk; -- Search vector data based on the inner product distance. SELECT id FROM test_table ORDER BY feature <#> array[1,2,3 ... 768]::real[] LIMIT topk; -- Search vector data based on the cosine similarity. SELECT id FROM test_table ORDER BY feature <=> array[1,2,3 ... 768]::real[] LIMIT topk;
ベクトル距離のスコア値を返す場合は、ベクトルインデックスのソート結果を使用して、ベクトル距離の実際のスコア値を計算できます。 これは、完全なベクトル距離計算プロセスを回避し、計算に必要な時間量を削減する。 サンプル文:
-- Search vector data based on the Euclidean distance. SELECT t.id as id, sqrt(t.score) as score FROM (SELECT id, feature <-> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t; -- Search vector data based on the inner product distance. SELECT t.id as id, (-1 * t.score) as score FROM (SELECT id, feature <#> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t; -- Search vector data based on the cosine similarity. SELECT t.id as id, (1.0 - t.score) as score FROM (SELECT id, feature <=> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t;
スコア範囲に基づいてフィルタリングされた結果を返す場合は、次のSQL文を実行してベクトルデータを照会できます。 ステートメントは、ベクトルインデックスのソート結果を使用して、ベクトル距離の最終スコア値を計算します。 これにより、計算に要する時間が短縮される。
-- Search vector data based on the Euclidean distance. SELECT t.id as id, sqrt(t.score) as score FROM (SELECT id, feature <-> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t WHERE score < 100; -- Search vector data based on the inner product distance. SELECT t.id as id, (-1 * t.score) as score FROM (SELECT id, feature <#> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t WHERE score > 10; -- Search vector data based on the cosine similarity. SELECT t.id as id, (1.0 - t.score) as score FROM (SELECT id, feature <=> array[1,2,3 ... 768]::real[] as score FROM test_table ORDER BY score LIMIT topk) t WHERE score > 0.5;
エンジンパラメータ関連ベクトル検索
エンジンパラメータ | 説明 | デフォルト値 | 有効値 |
fastann.build_parallel_processes | ベクトルインデックスを使用して並列に構築されるプロセスの数。 このパラメーターの値は、データベースの仕様によって異なります。 | 4 | [1, 64] |
fastann.pq_amp | 積量子化 (PQ) が高次元ベクトルの次元数を減らすために使用されるときのベクトル検索結果の増幅率セット。 このパラメーターを使用して、リコール率をテストできます。 | 10 | [1, 1000] |
fastann.hnsw_max_scan_points | ベクトル検索にHNSWインデックスを使用する場合のスキャンポイントの最大数。 このパラメーターを使用して、検索をすばやく終了し、リコール率をテストできます。 | 6000 | [1, 6000000] |
fastann.hnsw_ef_search | ベクトル検索にHNSWインデックスを使用する場合の検索候補セットのサイズ。 このパラメーターを使用して、リコール率をテストできます。 | 400 | [10, 10000] |
上記のパラメーターをセッションに設定できます。