PGVectorは、ベクトル類似性検索用の高性能データベース拡張機能であり、複数のアルゴリズムとデータ型をサポートします。 PGVectorを使用すると、機械学習で生成された埋め込みを残りのデータと一緒にPostgreSQLに保存、クエリ、およびインデックスを作成できます。 このトピックでは、PGVectorの背景情報、実装原則、使用法、および参照について説明します。
背景情報
データサイエンスと機械学習が急速に発展するにつれて、ベクトルコンピューティングはビッグデータ分野で最も一般的なコンピューティングタスクの1つになります。 PolarDB for PostgreSQL (Oracleと互換) データベースをPGVector拡張機能と組み合わせ、カスタムデータ型とストレージメソッドを使用して、高次元ベクトルコンピューティングのパフォーマンスを向上させることができます。
主要なテキスト埋め込みモデルを含む高次元ストレージは、データの入出力に使用されます。 PGVectorを使用すると、最大16000次元のベクトルを作成できます。
前提条件
この拡張機能は、次のエンジンを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターでサポートされています。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.9.0以降)
PolarDB for PostgreSQL (Oracle互換) 1.0 (バージョン1.1.35以降)
次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
SHOW polar_version;注意事項
クロスノード並列実行機能を使用すると、ソート句を使用して高次元ベクトルをトラバースできます。
クロスノード並列実行機能は、インデックスクエリをサポートしていません。
仕組み
PASE拡張と同様に、PGVectorは階層的ナビゲート可能スモールワールド (HNSW) インデックスを使用します。 Inverted File with Flat Compression (IVFFlat) アルゴリズムは、転置インデックスに基づいており、近似最近傍探索を実装しています。 ベクトル類似性検索を実行するために使用できます。 IVFFlatは、ベクトル空間を、それぞれがベクトルのクラスタを表す領域に分割し、ベクトル類似性検索を実行するために逆インデックスを作成します。
IVFFlatは、非対称距離計算 (IVFADC) アルゴリズムを備えた簡略化された反転ファイルシステムです。 IVFFlatは、高精度を必要とするビジネスシナリオに適していますが、クエリに最大100ミリ秒かかる可能性があります。 IVFFlatには、他のアルゴリズムと比較して次の利点があります。高い再現率、高い精度、単純なアルゴリズムとパラメータ、および低いストレージ使用量。
PGVector拡張機能は、PolarDB for PostgreSQL (Oracle互換) の拡張メカニズムに基づいて実装されています。 PGVector拡張は、Cプログラミング言語で記述され、様々なベクトル計算アルゴリズムおよびデータ型をサポートします。 次のセクションでは、アルゴリズムの動作のプロセスについて説明します。
IVFFlatは、k平均などのクラスタリングアルゴリズムを使用して、暗黙的なクラスタリング特性に基づいて高次元空間内のベクトルをクラスタに分割します。 このように、各クラスタは重心を有します。
IVFFlatは、すべてのクラスターの重心をトラバースして、クエリするベクトルに最も近いn個の重心を識別します。
IVFFlatは、識別されたn個の重心が属するクラスタ内のすべてのベクトルをトラバースおよびソートします。 次いで、IVFFlatは、最も近いk個のベクトルを得ます。
使用上の注意
PGVector拡張機能を使用して、高次元ベクトルのシーケンシャル検索またはインデックス検索を実行できます。 詳細については、「Example」をご参照ください。
リコール率とクエリのパフォーマンス
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拡張機能を追加します。
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 (Compatible with Oracle) によって提供されるベクトル演算子で、ベクトル間の類似性を計算するために使用されます。 前述のベクトル演算子は、ドット積距離、コサイン類似度、およびベクトル間のユークリッド距離の計算をサポートします。WITH (lists = 1)は、1つの領域のみが作成されることを示します。つまり、すべてのベクトルが同じ領域に割り当てられます。 実際のベクトルクエリのシナリオでは、データ量とクエリのパフォーマンスに基づいてリージョンの数を指定します。
関連ドキュメント
ベクトルの埋め込みプロセスの詳細については、中国本土および国際テキスト埋め込みモデルの出力を参照してください。