Azure Database for PostgreSQL - フレキシブル サーバーで diskann 拡張機能を有効にして使用する
DiskANN は、あらゆる規模で効率的なベクトル検索を行うためのスケーラブルな最近傍探索アルゴリズムです。 数十億点のデータセットでも、高い再現率、高い1 秒あたりのクエリ数 (QPS)、低いクエリの待機時間を実現します。 これは、大量のデータを処理するための強力なツールとなります。 Microsoft の DiskANN について詳しく知る
Azure Database for PostgreSQL フレキシブル サーバーの拡張機能である pg_diskann
は、効率的なベクトル インデックス作成と検索を行うための DiskANN の使用をサポートします。
pg_diskann
のプレビュー機能に登録する方法
Azure Database for PostgreSQL - フレキシブル サーバー用の pg_diskann
を使用するには、プレビュー フォームからサインアップする必要があります。 次の手順で登録します。
- プレビュー フォームを開きます
- 必要事項をすべて記入します。 有効化には、お客様の Azure サブスクリプション ID が必要です。
Note
プレビュー フォームに記入した後、リクエストが承認されるまでしばらく時間がかかります。 お客様宛てに確認メールが送信されます。
pg_diskann
拡張機能を有効にする
Azure Database for PostgreSQL フレキシブル サーバー インスタンスで pg_diskann
を有効にする前に、「PostgreSQL 拡張機能の使用方法」で説明されているように、それを許可リストに追加し、正しく追加されているかを SHOW azure.extensions;
を実行して確認する必要があります。
重要
このプレビュー機能は新しくデプロイされた Azure Database for PostgreSQL フレキシブル サーバー インスタンスでのみ利用できます。
その後、ターゲット データベースに接続して CREATE EXTENSION コマンドを実行することで、拡張機能をインストールできます。 拡張機能を使用できるようにしたいデータベースごとに、このコマンドを個別に繰り返す必要があります。
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
pgvector
が PostgreSQL データベースにまだインストールされていない場合は、このコマンドによって有効になります。
Note
現在接続されているデータベースから拡張機能を削除するには、DROP EXTENSION vector;
を使用します。
diskann
インデックス アクセス メソッドを使用する
拡張機能がインストールされたら、ベクトル データを含むテーブル列に diskann
インデックスを作成できるようになります。 たとえば、my_table
テーブルの embedding
列にインデックスを作成するには、次のコマンドを使用します。
CREATE TABLE my_table (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
-- other columns
);
-- insert dummy data
INSERT INTO my_table (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');
-- create a diskann index by using Cosine distance operator
CREATE INDEX my_table_embedding_diskann_idx ON my_table USING diskann (embedding vector_cosine_ops)
インデックス オプション
diskann
を使用してインデックスを作成する際は、さまざまなパラメーターを指定することで動作を制御できます。 現在用意されているオプションは次のとおりです。
max_neighbors
: グラフ内のノードあたりのエッジの最大数。 (既定値は 32)l_value_ib
: インデックス構築中の検索リストのサイズ (既定値は 50)
CREATE INDEX my_table_embedding_diskann_custom_idx ON my_table USING diskann (embedding vector_cosine_ops)
WITH (
max_neighbors = 48,
l_value_ib = 100
);
インデックス スキャン (l_value_is
) の L 値は、次のように接続全体またはトランザクションごとに設定できます (トランザクション ブロック内で SET LOCAL
を使用)。
SET diskann.l_value_is = 100;
SELECT * FROM my_table ORDER BY embedding <=> '[1,2,3]' LIMIT 5; -- uses 100 candidates
DiskANN インデックスを使用するタイミングは、Postgres によって自動的に決定されます。 常にインデックスを使用したい場合は、次のコマンドを使用します。
SET LOCAL enable_seqscan TO OFF;
SELECT * FROM my_table ORDER BY embedding <=> '[1,2,3]' LIMIT 5; -- forces the use of index
インデックス作成の進行状況
PostgreSQL 12 以降では、インデックス作成の進行状況を確認するために pg_stat_progress_create_index
を使用できます。
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
DiskANN インデックスの構築フェーズは次のとおりです。
initializing
loading tuples
警告
場合によっては、インデックスの構築に時間がかかる場合があります。
インデックス アクセス関数の選択
ベクトル型を使用すると、保存されているベクトルに対して 3 種類の検索を実行できます。 クエリの実行時にデータベースでインデックスを考慮できるように、インデックスの正しいアクセス関数を選択する必要があります。
pg_diskann
は、以下の距離演算子をサポートしています
vector_l2_ops
:<->
ユークリッド距離vector_cosine_ops
:<=>
コサイン距離vector_ip_ops
:<#>
内積