ApsaraDB RDS for PostgreSQL は pgvector 拡張機能をサポートしています。この拡張機能は、ベクターを格納するための新しいデータ型を提供し、高次元ベクターでの効率的な類似検索を可能にします。
背景情報
ApsaraDB RDS for PostgreSQL は、pgvector 拡張機能をサポートしており、ベクトルデータを格納してベクトル類似検索を実行することで、AI を活用したアプリケーションのデータ基盤を提供します。
pgvector 拡張機能には、主に次の特徴があります。
-
ベクトルデータを格納し、クエリするための
vectorデータ型を提供します。 -
完全一致検索および近似最近傍 (ANN) 検索をサポートしています。ユークリッド距離 (L2)、コサイン類似度、または内積を使用して類似度を計算できます。クエリを高速化するために、HNSW インデックスまたは IVFFlat インデックスを作成できます。この拡張機能は、ベクターの要素ごとの乗算、L1 距離関数、および合計集約もサポートしています。
-
最大 16,000 ディメンションのベクターをサポートし、最大 2,000 ディメンションのベクターに対してインデックスを作成できます。
基本概念と仕組み
埋め込み
埋め込みとは、高次元データを低次元表現にマッピングするプロセスです。機械学習や自然言語処理 (NLP) では、埋め込みは、離散的な記号やオブジェクトを連続的なベクトル空間内のポイントとして表現するためによく使用されます。
このプロセスは、ベクトル空間における単語間の意味的および構文的な関係を反映します。
仕組み
-
埋め込みは、テキスト、画像、音声などの情報を、複数のディメンションでその特徴を表現することにより、ベクトルデータに変換します。
-
pgvector 拡張機能は、ApsaraDB RDS for PostgreSQL にベクトルデータを格納するための
vectorデータ型を提供します。 -
pgvector は、格納されたベクトルデータに対して完全一致検索および近似最近傍検索を実行できます。
たとえば、3つのオブジェクト (リンゴ、バナナ、ネコ) をデータベースに格納し、pgvector を使用してそれらの類似度を計算するには、次の手順に従います。
-
埋め込みモデルを使用して、オブジェクトをベクターに変換します。2次元の埋め込みの場合、結果は次のようになります。
Apple: embedding[1,1] Banana: embedding[1.2,0.8] Cat: embedding[6,0.4] -
結果のベクターをデータベースに格納します。ベクトルデータの格納方法の詳細については、「例」セクションをご参照ください。
2次元平面では、オブジェクトの分布は次のようになります。

リンゴとバナナはどちらも果物であるため、2次元座標系ではそれらのベクターは互いに近くなります。ネコは異なる種類のオブジェクトであるため、より遠くに位置します。
オブジェクトの属性 (果物の色、産地、味など) をさらに詳細に定義することもできます。各属性はディメンションを追加します。ディメンションが多いほど、より詳細な分類が可能になり、より正確な検索結果が得られます。
ユースケース
-
ベクトルデータの格納
-
ベクトル類似検索の実行
前提条件
ご利用の ApsaraDB RDS for PostgreSQL インスタンスは、次の要件を満たす必要があります。
-
インスタンスが PostgreSQL 14 以降を実行していること。
-
インスタンスのマイナーエンジンバージョンが 20230430 以降であること。PostgreSQL 17 を実行するインスタンスの場合、マイナーエンジンバージョンは 20241030 以降である必要があります。
説明メジャーエンジンバージョンのアップグレードまたはマイナーエンジンバージョンの更新については、「メジャーエンジンバージョンのアップグレード」または「マイナーエンジンバージョンの更新」をご参照ください。
-
ご利用の ApsaraDB RDS for PostgreSQL インスタンスの特権アカウントを持っていること。詳細については、「アカウントの作成」をご参照ください。
拡張機能の管理
RDS コンソール
-
拡張機能のインストール
-
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、インスタンスが配置されているリージョンを選択し、インスタンス ID をクリックします。
-
左側のナビゲーションウィンドウで、プラグイン をクリックします。
-
プラグインの概要 タブで、vector 拡張機能を見つけ、インストール をクリックします。
プラグインの管理 ページで vector プラグインを検索し、操作 列の [インストール] をクリックすることもできます。
-
表示されたダイアログボックスで、ターゲットデータベースと特権アカウントを選択し、インストール をクリックします。
インスタンスのステータスが メンテナンス中 から 実行中 に変わると、拡張機能は正常にインストールされています。
-
-
拡張機能の更新またはアンインストール
-
プラグインの管理 ページで、プラグインがインストール済みです タブをクリックします。ターゲットの拡張機能を見つけ、操作 列の バージョンアップグレード をクリックして、拡張機能を最新バージョンにアップグレードします。
説明操作 列に バージョンアップグレード ボタンが表示されていない場合、拡張機能はすでに最新バージョンです。
-
プラグインの管理 ページで、プラグインがインストール済みです タブをクリックします。ターゲットの拡張機能を見つけ、操作 列の アンインストール をクリックします。
-
SQL コマンド
特権アカウントのみが次のコマンドを実行できます。特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
-
拡張機能の作成
CREATE EXTENSION IF NOT EXISTS vector; -
拡張機能の削除
DROP EXTENSION vector; -
拡張機能の更新
ALTER EXTENSION vector UPDATE [ TO new_version ]説明new_version は pgvector のバージョンを指定します。最新バージョンとその機能については、pgvector の公式ドキュメントをご参照ください。
例
次の例は、pgvector 拡張機能の使用方法を示しています。より高度な使用方法については、pgvector の公式ドキュメントをご参照ください。
-
テーブル作成権限を持つアカウントを使用して、埋め込みを格納するための
itemsという名前のテーブルを作成します。CREATE TABLE items ( id bigserial PRIMARY KEY, item text, embedding vector(2) );説明この例では、2次元ベクターが使用されています。pgvector は最大 16,000 ディメンションのベクターをサポートしています。
-
ベクトルデータをテーブルに挿入します。
INSERT INTO items (item, embedding) VALUES ('Apple', '[1, 1]'), ('Banana', '[1.2, 0.8]'), ('Cat', '[6, 0.4]'); -
コサイン類似度演算子
<=>を使用して、バナナとリンゴ、ネコの類似度を計算します。SELECT item, embedding <=> '[1.2, 0.8]' AS cosine_distance FROM items ORDER BY cosine_distance;説明-
上記の例では、
<=>演算子を使用してコサイン距離を計算しています。距離が小さいほど、類似度が高くなります。 -
ユークリッド距離演算子
<->または内積演算子<#>を使用して類似度を計算することもできます。
結果の例:
item | cosine_distance --------+---------------------- Banana | 0 Apple | 0.019419362524530137 Cat | 0.13289443670962842上記の結果について:
-
Banana の結果は 0 で、完全一致 (距離がゼロ) を示します。
-
Apple の結果は 0.019 で、Apple が Banana に非常に類似していることを示します。
-
Cat の結果は 0.133 で、Cat が Banana にあまり類似していないことを示します。
説明実際のアプリケーションでは、類似度のしきい値を設定して、類似度の低い結果を除外できます。
-
-
類似検索のパフォーマンスを向上させるには、ベクトルデータにインデックスを作成します。次の例は、
embedding列にインデックスを作成する方法を示しています。HNSW インデックス
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);パラメーター:
パラメーター
説明
m
HNSW グラフの各レイヤーの各ノードの最大接続数。
値を大きくするとグラフが密になり、通常は取得率が向上しますが、インデックス作成時間とクエリ時間が増加します。
ef_construction
インデックス構築中の動的候補リストのサイズ。このパラメーターは、最適な接続を選択するために保持する候補ノードの数を定義します。
値を大きくすると取得率が向上する可能性がありますが、インデックス作成時間が増加します。
IVF インデックス
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);パラメーター:
パラメーター/値
説明
items
インデックスを作成する列を含むテーブル。
embedding
インデックスを作成するベクター列。
vector_cosine_ops
ベクターインデックスに指定された演算子クラス。
-
コサイン類似度検索では
vector_cosine_opsを使用します。 -
ユークリッド距離では
vector_l2_opsを使用します。 -
内積類似度では
vector_ip_opsを使用します。
lists = 100
lists パラメーターは、データセットを分割するリストの数を指定します。値を大きくすると、データセットがより多くのパーティションに分割され、各サブセットが小さくなるため、インデックスクエリは高速になります。ただし、lists の値が大きくなるにつれて、クエリの取得率が低下する可能性があります。
説明-
取得率は、情報検索および分類タスクにおけるメトリックです。これは、正しく取得または分類されたサンプルの総数に対する、関連するサンプルの総数の比率です。取得率は、システムがすべての関連サンプルを見つける能力を測定します。
-
インデックスの構築には大量のメモリが必要です。lists パラメーターの値が 2000 を超えると、
ERROR: memory required is xxx MB, maintenance_work_mem is xxx MBというエラーが発生します。ベクトルデータのインデックスを構築するには、maintenance_work_mem により大きな値を設定する必要があります。ただし、この値を高く設定しすぎると、インスタンスの OOM (メモリ不足) のリスクが高まります。詳細については、「インスタンスパラメーターの設定」をご参照ください。 -
アプリケーションの要件を満たすために、クエリ速度と取得率のバランスをとるように lists パラメーターを調整する必要があります。
ivfflat.probes パラメーターは、次のいずれかの方法で設定できます。このパラメーターは、インデックス内で検索するリストの数を指定します。ivfflat.probes の値を大きくすると、検索するリストが増え、クエリ結果の取得率が向上する可能性があります。
-
セッションレベル
SET ivfflat.probes = 10; -
トランザクションレベル
BEGIN; SET LOCAL ivfflat.probes = 10; SELECT ... COMMIT;
ivfflat.probes の値が大きいほど、クエリの取得率は高くなりますが、クエリ速度は遅くなります。アプリケーションのニーズとデータセットの特性に応じて、lists と ivfflat.probes の値を調整して、クエリパフォーマンスと取得率の最適なバランスを実現してください。
説明ivfflat.probes の値がインデックス作成時に指定された lists の値と等しい場合、クエリはベクターインデックスを無視し、全表スキャンを実行します。
-
パフォーマンスデータ
ベクトルデータのインデックスを作成する際は、データ量とアプリケーションシナリオに基づいて、クエリ速度と取得率のバランスをとる必要があります。関連するパフォーマンステストについては、次のトピックをご参照ください。