デフォルトでは、pgvector は完全な再現率を提供する正確な近傍探索を実行します。検索速度を向上させるために、インデックスを追加することで近似近傍探索を実行できますが、再現率が低下する可能性があります。サポートされている近似インデックスの種類には、HNSW と IVFFlat があります。
HNSW
階層型ナビゲーション可能な小世界 (HNSW) インデックスは、多層グラフを作成し、速度と再現率のトレードオフの観点から、反転ファイルとフラット圧縮 (IVFFlat) インデックスよりも優れたクエリ パフォーマンスを提供します。ただし、HNSW インデックスは、構築時間が長く、メモリ使用量が多くなります。 IVFFlat とは異なり、HNSW はトレーニングを必要とせず、テーブルにデータが含まれていない場合でも作成できます。
HNSW インデックスの作成
使用する距離関数ごとに HNSW インデックスを作成します。
ユークリッド距離 (L2)
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);ベクトル型に基づいて距離関数を使用します。たとえば、halfvec ベクトル型には halfvec_l2_ops 関数を使用し、sparsevec ベクトル型には sparsevec_l2_ops 関数を使用します。
内積
CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);コサイン距離
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);マンハッタン距離 (L1)
CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);ハミング距離
CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);ジャカード距離
CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);サポートされているベクトル型:
Vector: 最大 2,000 次元のベクトル。Halfvec: 最大 4,000 次元の半精度ベクトル。Sparsevec: 最大 1,000 個の非ゼロ要素を持つスパースベクトル。Bit: 最大 64,000 次元のバイナリベクトル。
インデックス作成オプション
パラメーター | 説明 |
| レイヤーごとの最大接続数。デフォルト値: 16。 |
| グラフの構築に使用される動的候補リストのサイズ。デフォルト値: 64。値が大きいほど再現率は向上しますが、インデックス作成が遅くなります。 |
例
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);クエリ オプション
パラメーター | 説明 |
| 検索中に使用される動的候補リストのサイズ。デフォルト値: 40。値が大きいほど再現率は向上しますが、クエリが遅くなります。 |
例
現在のセッションの
hnsw.ef_searchパラメーターを指定します。SET hnsw.ef_search = 100;SET LOCALを使用して、単一のクエリのトランザクションでhnsw.ef_searchを指定します。BEGIN; SET LOCAL hnsw.ef_search = 100; SELECT ... COMMIT;
IVFFlat
IVFFlat インデックスは、転置インデックスとベクトル検索の利点を組み合わせたものです。 IVFFlat インデックスは、ベクトルをリストに分割し、クエリベクトルに最も近いリストのサブセットを検索します。 HNSW よりも構築が速く、メモリ使用量が少なくなりますが、速度と再現率のトレードオフの観点からは、クエリ パフォーマンスが低下します。
良好な再現率を実現するには、次のガイドラインに従ってください。
テーブルにデータを入力した後にインデックスを作成する
適切な数のリストを選択します。 100 万行までのデータセットの場合は
rows/1000から始め、100 万行を超えるデータセットの場合はsqrt(rows)を使用します。クエリ中に適切な数のプローブを指定します。プローブの数を増やすと再現率は向上しますが、クエリが遅くなる可能性があります。
sqrt(lists)を使用することをお勧めします。
IVFFlat インデックスの作成
使用する距離関数ごとに IVFFlat インデックスを作成します。
ユークリッド距離 (L2)
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);距離計算操作は、ベクトル型によって異なります。たとえば、halfvec ベクトル型には halfvec_l2_ops 操作を使用し、sparsevec ベクトル型には sparsevec_l2_ops 操作を使用します。
内積
CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);コサイン距離
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);ハミング距離
CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);サポートされているベクトル型:
Vector: 最大 2,000 次元のベクトル。Halfvec: 最大 4,000 次元の半精度ベクトル。Bit: 最大 64,000 次元のバイナリベクトル。
クエリ オプション
パラメーター | 説明 |
| プローブの数。デフォルト値: 1。値が大きいほど再現率は向上しますが、クエリが遅くなります。プローブの数をリストの数と同じに設定して、正確な近傍探索を有効にすることができますが、この場合、プランナーはインデックスを使用しません。 |
例
SET LOCAL を使用して、単一のクエリのトランザクションで ivfflat.probes パラメーターを指定します。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;インデックス構築の高速化
インデックス構築速度は、次のパラメーターによって異なります。
パラメーター | 説明 |
| インデックス構築に許可されるメモリの最大量。クラスターの仕様に基づいてパラメーターを調整します。グラフが 説明 サーバーのメモリ不足を防ぐために、適切な値を指定してください。 |
| 並列ワーカーの数。デフォルト値: 2。より多くの並列ワーカーを使用することで、インデックス作成を高速化できます。 説明 より多くのワーカーを使用するには、 |
他のインデックス タイプと同様に、初期データのロード後にインデックスを作成する方が高速です。 インデックス オプション も構築時間に大きく影響します。
インデックス構築の進捗状況の監視
pg_stat_progress_create_index ビューをクエリすることで、インデックス構築の進捗状況を監視できます。
HNSW インデックス構築フェーズ:
initializingloading tuples
IVFFlat インデックス構築フェーズ:
initializingperforming k-meansassigning tuplesloading tuples
--- HNSW
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
--- IVFFlat
SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;% フィールドは、loading tuples フェーズ中にのみ更新されます。