PGVector は、ベクトル類似検索用の高性能データベース拡張機能であり、複数のアルゴリズムとデータ型をサポートしています。この拡張機能を使用すると、ベクトル埋め込みを効率的に保存およびクエリできます。このトピックでは、PGVector の背景情報、実装原則、使用方法、およびリファレンスについて説明します。
背景情報
データサイエンスと機械学習が急速に発展するにつれて、ベクトル計算はビッグデータ分野で最も一般的な計算タスクの 1 つになっています。 PolarDB for PostgreSQL データベースは、PGVector 拡張機能と組み合わせることができ、カスタムデータ型とストレージメソッドを使用して、高次元ベクトル計算のパフォーマンスを向上させることができます。
主要なテキスト埋め込みモデルを含む高次元ストレージは、データの入出力に使用されます。 PGVector を使用すると、最大 16000 次元のベクターを作成できます。
前提条件
この拡張機能は、次のエンジンを実行する PolarDB for PostgreSQL クラスタでサポートされています。
PostgreSQL 16 (リビジョンバージョン 2.0.16.3.1.1 以降)
PostgreSQL 15 (リビジョンバージョン 2.0.15.12.4.0 以降)
PostgreSQL 14 (リビジョンバージョン 2.0.14.7.9.0 以降)
PostgreSQL 11 (リビジョンバージョン 2.0.11.9.35.0 以降)
PolarDB コンソールで、または SHOW polardb_version; 文を実行することで、クラスタのリビジョンバージョンを確認できます。リビジョンバージョンが要件を満たしていない場合は、リビジョンバージョンを更新してください。
注意事項
クロスノード並列実行機能を使用すると、ソート句を使用して高次元ベクトルを走査できます。
クロスノード並列実行機能は、インデックスクエリをサポートしていません。
仕組み
PASE 拡張機能と同様に、PGVector は階層型ナビゲーション可能なスモールワールド (HNSW) インデックスを使用します。フラット圧縮を使用した転置ファイル (IVFFlat) アルゴリズムは、転置インデックスに基づいており、近似最近傍検索を実装しています。ベクトル類似検索を実行するために使用できます。 IVFFlat は、ベクトル空間をそれぞれベクトルのクラスタを表す領域に分割し、転置インデックスを作成してベクトル類似検索を実行します。
IVFFlat は、非対称距離計算を使用した簡略化された転置ファイルシステム (IVFADC) アルゴリズムです。 IVFFlat は、高精度が必要であるが、クエリに最大 100 ミリ秒かかることを許容できるビジネスシナリオに適しています。 IVFFlat には、他のアルゴリズムと比較して、高い再現率、高精度、シンプルなアルゴリズムとパラメーター、低いストレージ使用量という利点があります。
PGVector 拡張機能は、PolarDB for PostgreSQL の拡張メカニズムに基づいて実装されています。 PGVector 拡張機能は C プログラミング言語で記述されており、さまざまなベクトル計算アルゴリズムとデータ型をサポートしています。次のセクションでは、アルゴリズムの動作プロセスについて説明します。
IVFFlat は、k 平均法などのクラスタリングアルゴリズムを使用して、暗黙のクラスタリングプロパティに基づいて高次元空間のベクトルをクラスタに分割します。このように、各クラスタには重心があります。
IVFFlat は、すべてのクラスタの重心を走査して、クエリするベクトルに最も近い n 個の重心を識別します。
IVFFlat は、識別された n 個の重心が属するクラスタ内のすべてのベクトルを走査してソートします。次に、IVFFlat は最も近い k 個のベクトルを取得します。
使用上の注意
PGVector 拡張機能を使用して、高次元ベクトルの順次検索またはインデックス検索を実行できます。詳細については、例を参照してください。
データベースエンジンバージョンによって、サポートされる拡張バージョンが異なる場合があります。詳細については、拡張機能を参照してください。
再現率とクエリパフォーマンス
0.5.0 より前のバージョンでは、PGVector 拡張機能は、構築速度が速いことで知られる IVFFlat インデックス作成方法を使用しています。 PGVector 拡張機能は、IVFFlat インデックス作成方法を使用してクエリのパフォーマンスを向上させます。ただし、再現率は中程度で、大量のメモリが使用されます。新しい HNSW インデックス作成方法は、より良い再現率と向上したクエリパフォーマンスを提供します。ただし、インデックス構築速度は遅く、メモリ使用量は多くなります。ベクトルインデックスに基づいてベクトルデータを効果的にクエリするには、クエリパフォーマンスと再現率に関連する長所と短所のバランスをとる必要があります。次のセクションでは、再現率を向上させるために、前述のインデックス作成方法のパラメーターを構成する方法について説明します。
HNSW
m: 各インデックス要素に接続されている双方向リンク (またはパス) の数。値の範囲は 2 ~ 100 です。デフォルト値は 16 です。再現率を上げるには、パラメーターに大きな数を指定します。ただし、双方向リンクの数が多いと、インデックス生成時間が大幅に長くなり、クエリのパフォーマンスに悪影響を与える可能性があります。ef_construction: インデックスに要素が追加されたときにチェックする近傍の数。値の範囲は 4 ~ 100 です。デフォルト値は 64 です。このパラメーターの値を増やすことで、再現率を上げることができます。ただし、インデックス構築時間が長くなる場合があります。このパラメーターの値は、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 モジュールを参照してください。
例
PGVector 拡張機能をデータベースに追加します。
説明クラスタで PostgreSQL 17 が実行されていて、
ERROR: must be superuserエラーメッセージが返された場合は、トラブルシューティングについてお問い合わせください。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 はインデックスを作成する列です。vector_ip_opsは、 によって提供されるベクトル演算子であり、ベクトル間の類似度を計算するために使用されます。前述のベクトル演算子は、ベクトル間のドット積距離、コサイン類似度、およびユークリッド距離の計算をサポートしています。PolarDB for PostgreSQLベクトル間の類似度を計算するために使用されます。上記のベクトル演算子は、ベクトル間のドット積距離、コサイン類似度、およびユークリッド距離の計算をサポートしています。WITH (lists = 1)は、1 つの領域のみが作成されることを示します。つまり、すべてのベクトルが同じ領域に割り当てられます。実際のベクトルクエリのシナリオでは、データ量とクエリパフォーマンスに基づいて領域の数を指定します。
リファレンス
。ベクトルの埋め込みプロセスの詳細については、中国本土および国際テキスト埋め込みモデルの出力を参照してください。