Azure Cosmos DB for PostgreSQL で pgvector
を有効にして使用する方法
適用対象: Azure Cosmos DB for PostgreSQL (PostgreSQL の Citus データベース拡張機能を利用)
pgvector
拡張機能により、オープンソース ベクトルの類似性検索が PostgreSQL に追加されます。
この記事では、pgvector
で有効になっている追加の機能について説明します。 ベクトルの類似性と埋め込みの概念について説明し、pgvector
拡張機能を有効にする方法に関するガイダンスを提供します。 ベクトルを作成、保存、クエリする方法について学習します。
プロジェクトの公式 README を参照することもできます。
拡張機能を有効にする
PostgreSQL 拡張機能を使用するには、その拡張機能がデータベースで有効にされている必要があります。 拡張機能を有効にするには、psql ツールからコマンドを実行して、パッケージ化されたオブジェクトをデータベースに読み込みます。
SELECT CREATE_EXTENSION('vector');
注意
拡張機能を無効にするには、drop_extension()
を使用します。
概念
ベクトルの類似性
ベクトルの類似性は、2 つの項目をベクトル (一連の数値) として表すことによってどのように類似しているかを測定するために使用されるメソッドです。 ベクトルは、多くの場合、データ ポイントを表すために使用され、ベクトルの各要素は、データ ポイントの特徴または属性を表します。
ベクトルの類似性は通常、Euclidean distance
または cosine
の類似性などの距離メトリックを使用して計算されます。 ユークリッド距離は、n 次元空間内の 2 つのベクトル間の直線距離を測定し、コサイン類似性は 2 つのベクトル間の角度のコサインを測定します。 類似性メトリックの値は通常、0
から 1
までの範囲にあり、higher
値はベクトル間の類似性がより高いことを示します。
ベクトルの類似性は、レコメンデーション システム、テキスト分類、画像認識、クラスタリングなどのさまざまなアプリケーションで広く使用されています。 たとえば、レコメンデーション システムでは、ベクトルの類似性を使用して、ユーザーの好みに基づいて同様の項目を識別できます。 テキスト分類では、ベクトルの類似性を使用して、ベクトル表現に基づいて 2 つのドキュメントまたは文間の類似性を判断できます。
埋め込み
埋め込みは、テキスト、画像、ビデオ、またはその他の種類の情報の「関連性」を評価する手法です。 この評価により、機械学習モデルはデータ間の関係と類似性を効率的に識別でき、アルゴリズムはパターンを識別し、正確な予測を行うことができます。 たとえば、感情分析タスクでは、埋め込みの類似した単語のセンチメント スコアが似ていると予想される場合があります。
作業の開始
3 次元ベクトルを表すembedding
型の列vector(3)
を持つテーブル tblvector
を作成します。
CREATE TABLE tblvector(
id bigserial PRIMARY KEY,
embedding vector(3)
);
OpenAI API などのサービスを使用して埋め込みを生成したら、結果のベクトルをデータベースに保存できます。 ベクトルを vector(3)
として定義すると、3 次元平面で [x,y,z] coordinates
が指定されます。 このコマンドは、この提供された埋め込みを使用して tblvector
テーブルに 5 つの新しい行を挿入します。
INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]'), (3, '[5,4,6]'), (4, '[3,5,7]'), (5, '[7,8,9]');
INSERT INTO ... ON CONFLICT
ステートメントを使用すると、条件に一致するレコードの更新などの代替アクションを指定できます。 これにより、潜在的な競合をより効率的かつ効果的に処理できるようになります。
INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;
DELETE
コマンドは、WHERE 句で指定された条件に基づいて、指定されたテーブルから行を削除します。 WHERE 句が存在しない場合、テーブル内のすべての行が削除されます。
DELETE FROM tblvector WHERE id = 1;
ベクトルを取得して類似性を計算するには、SELECT
ステートメントと組み込みのベクトル演算子を使用します。 たとえば、クエリは、指定されたベクトルと tblvector
テーブルに格納されているベクトルの間のユークリッド距離 (L2 距離) を計算し、計算された距離によって結果を並べ替え、5 つの最も近い、最も類似した項目を返します。
SELECT * FROM tblvector
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;
クエリでは、多次元空間内の 2 つのベクトル間の距離を計算するために使用される「距離演算子」である「<->」演算子が使用されます。 クエリは、ベクトル [3,1,2] からの距離が 6 未満のすべての行を返します。
SELECT * FROM tblvector WHERE embedding <-> '[3,1,2]' < 6;
このコマンドは、"tblvector" テーブルから "embedding" 列の平均値を取得します。 たとえば、"埋め込み" 列に言語モデルの単語埋め込みが含まれている場合、これらの埋め込みの平均値を使用して、文全体またはドキュメント全体を表すことができます。
SELECT AVG(embedding) FROM tblvector;
ベクトル演算子
pgvector
には、ベクトルに対し使用できる 6 つの新しい演算子が導入されています。
Operator | 説明 |
---|---|
+ | 要素ごとの加算 |
- | 要素ごとの減算 |
* | 要素ごとの乗算 |
<-> | ユークリッド距離 |
<#> | 負の内積 |
<=> | コサイン距離 |
ベクトル関数
cosine_distance
2 つのベクトル間のコサイン距離を計算します。
cosine_distance(vector, vector)
引数
vector
1 番目の vector
。
vector
2 番目の vector
。
返り値の種類
2 つの指定されたベクトル間の距離を表す double precision
。
inner_product
2 つのベクトルの内積を計算します。
inner_product(vector, vector)
引数
vector
1 番目の vector
。
vector
2 番目の vector
返り値の種類
2 つのベクトルの内積を表す double precision
。
l2_distance
2 つのベクトル間のユークリッド距離 (L2 とも呼ばれます) を計算します。
l2_distance(vector, vector)
引数
vector
1 番目の vector
。
vector
2 番目の vector
返り値の種類
2 つのベクトル間のユークリッド距離を表す double precision
。
l1_distance
2 つのベクトル間のタクシー距離 (L1 とも呼ばれます) を計算します。
l1_distance(vector, vector)
引数
vector
1 番目の vector
。
vector
2 番目の vector
返り値の種類
2 つのベクトル間のタクシー距離を表す double precision
。
vector_dims(vector)
指定されたベクトルの次元を返します。
引数
vector
vector
。
返り値の種類
指定されたベクトルの次元数を表す integer
。
vector_norms(vector)
特定のベクトルのユークリッド ノルムを計算します。
引数
vector
vector
。
返り値の種類
指定されたベクトルのユークリッド ノルムを表す double precision
。
ベクトル集計
AVG
処理されたベクトルの平均を計算します。
引数
vector
vector
。
返り値の種類
処理されたベクトルの平均を表す vector
。
SUM
引数
vector
vector
。
返り値の種類
処理されたベクトルの合計を表す vector
。
次のステップ
詳細については、pgvector
を使用して、パフォーマンス、インデックス作成、制限事項を参照してください。