PGVector は、複数のベクトルコンピューティングアルゴリズムとデータ型をサポートする効率的なベクトルデータベース拡張機能です。また、ベクトルとして表現される AI 埋め込みのための効率的なストレージとクエリも提供します。このトピックでは、PGVector の背景、仕組み、および使用方法について説明します。
背景情報
データサイエンスと機械学習の急速な発展により、ベクトルコンピューティングはビッグデータアプリケーションにおける共通タスクとなっています。PolarDB for PostgreSQL (Oracle 互換) は、広く使用されているリレーショナルデータベースです。PGVector 拡張機能と組み合わせることで、カスタムデータ型とストレージメソッドを使用して高次元ベクトルコンピューティングを高速化します。
PGVector 拡張機能は、最大 16,000 ディメンションのベクトルをサポートします。これは、主流のテキスト埋め込みモデルなど、入出力に高次元ストレージを使用するシナリオに最適です。
適用性
PolarDB for PostgreSQL (Oracle 互換) の以下のバージョンがサポートされています。
Oracle 構文互換性 2.0 (マイナーエンジンバージョン 2.0.14.7.9.0 以降)
Oracle 構文互換性 1.0 (マイナーエンジンバージョン 2.0.11.9.35.0 以降)
コンソールで、または SHOW polardb_version; 文を実行することで、マイナーエンジンバージョン番号を表示できます。ご利用のマイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
注意事項
ノード間並列実行 (PX) 機能は、`sort` を使用した高次元ベクトルの走査をサポートしています。
PX はインデックスクエリをサポートしていません。
仕組み
PGVector は、PASE 拡張機能で使用されているのと同じベクトルアルゴリズムである IVFFlat インデックスアルゴリズムを使用します。IVFFlat は、転置インデックスに基づく近似最近傍 (ANN) 検索アルゴリズムであり、ベクトル類似度を効率的にクエリします。このアルゴリズムは、ベクトル空間をパーティションに分割し、各パーティションにはベクトルのセットが含まれます。次に、転置インデックスが作成され、指定されたクエリベクトルに類似したベクトルを迅速に見つけます。
IVFFlat は、IVFADC (Inverted File System with Asymmetric Distance Computation) アルゴリズムの簡易版です。高い取得率を必要とし、100 ms 範囲のクエリ応答時間を許容できるシナリオに適しています。他のアルゴリズムと比較して、IVFFlat は、高い取得率、高い精度、シンプルなアルゴリズムとパラメーター、および低いストレージ使用量という利点を提供します。
PGVector 拡張機能は、PolarDB for PostgreSQL (Oracle 互換) の拡張メカニズムに基づいて構築されています。C 言語で書かれており、さまざまなベクトルコンピューティングアルゴリズムとデータ型を実装しています。アルゴリズムのフローは次のとおりです。
K-Means などのクラスタリングアルゴリズムは、高次元空間のベクトルをクラスターにグループ化します。次に、各クラスターの重心が計算されます。
ベクトルを取得するために、アルゴリズムはまずすべてのクラスター重心を走査して、ターゲットベクトルに最も近い `n` 個の重心を見つけます。
次に、アルゴリズムは `n` 個の重心に対応するクラスター内のすべての要素を走査します。グローバルソートが実行され、最も近い `k` 個のベクトルが見つかります。
利用ガイド
PGVector 拡張機能は、高次元ベクトルをシーケンシャルに、またはインデックスを使用して取得できます。例 のセクションでは、簡単なユースケースを提供します。
サポートされている拡張機能のバージョンは、データベースエンジンバージョンによって若干異なります。詳細については、サポートされている拡張機能をご参照ください。
再現率とパフォーマンス
0.5.0 より前の PGVector バージョンでは、IVFFlat インデックスが使用されていました。IVFFlat インデックスは迅速に構築でき、インデックスなしの検索と比較してクエリパフォーマンスを向上させます。ただし、取得率は中程度であり、ある程度のメモリを消費します。新しい HNSW インデックスは、より良い取得率とより高いパフォーマンスを提供しますが、構築に時間がかかり、より多くのメモリを使用します。ベクトルインデックスを使用してベクトルデータをクエリする場合、多くの場合、パフォーマンスと取得率のバランスを取る必要があります。このセクションでは、取得率を向上させるために両方のメソッドのインデックスパラメーターを設定する方法について説明します。
HNSW
m: 各インデックス要素間の双方向リンク (またはパス) の数です。デフォルト値は 16 です。有効値は 2 から 100 です。値を大きくすると取得率が向上しますが、インデックス構築時間も大幅に増加し、クエリパフォーマンスに悪影響を与える可能性があります。ef_construction: インデックスに要素を追加するときにチェックする最近傍の数です。デフォルト値は 64 です。有効値は 4 から 100 です。この値を大きくすると取得率が向上しますが、インデックス構築時間が増加します。この値は、mの値の少なくとも 2 倍でなければなりません。CREATE TABLE vecs (id int PRIMARY KEY, embedding vector(1536)); CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=64);HNSW インデックスのオペレータークラスを指定します。たとえば、HNSW インデックスにコサイン類似度を使用するには、次のコマンドを実行します。
CREATE INDEX ON vecs USING hnsw(embedding vector_cosine_ops);構築時間を最適化するには、デフォルトのインデックス構築設定項目から始めます。データセットの取得率が期待を満たさない場合は、まず
ef_constructionの値を増やし、次にmの値を調整します。より大きなhnsw.ef_search値を設定することで、クエリの取得率を向上させることができます。たとえば、100に設定できます。通常、値が大きいほど取得率が高くなります。IVFFlat
lists: PGVector サンプリングテーブル内のベクトルに対するクラスター重心の数です。CREATE INDEX ON vecs USING ivfflat(embedding) WITH (lists=100);
インデックスおよびその他のパラメーターの詳細については、オープンソースコードリポジトリの README ファイルをご参照ください。
例
拡張機能を作成します。
CREATE EXTENSION vector;テーブルを作成します。
CREATE TABLE t (val vector(3));データを挿入します。
INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL);ベクトルインデックスを作成します。
CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1);近似ベクトルを計算します。
SELECT * FROM t ORDER BY val <#> '[3,3,3]';次の結果が返されます。
val --------- [1,2,3] [1,1,1] [0,0,0] (3 rows)説明val vector_ip_opsは、`val` 列にインデックスが作成されることを示します。PolarDB for PostgreSQL (Oracle 互換) のvector_ip_opsベクトルオペレーターは、ベクトル間の類似度を計算します。このオペレーターは、ドット積、コサイン類似度、ユークリッド距離などの計算をサポートしています。WITH (lists = 1)は、パーティションの数が 1 であることを指定します。これは、すべてのベクトルが同じパーティションに割り当てられることを意味します。実際のアプリケーションでは、データ量とクエリパフォーマンス要件に基づいてパーティションの数を調整する必要があります。
関連ドキュメント
ベクトル埋め込みを取得するには、中国本土および国際リージョンで利用可能なテキスト埋め込みモデルを使用できます。