次の方法で共有


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 を使用するには、プレビュー フォームからサインアップする必要があります。 次の手順で登録します。

  1. プレビュー フォームを開きます
  2. 必要事項をすべて記入します。 有効化には、お客様の Azure サブスクリプション ID が必要です。

Note

プレビュー フォームに記入した後、リクエストが承認されるまでしばらく時間がかかります。 お客様宛てに確認メールが送信されます。

pg_diskann 拡張機能を有効にする

Azure Database for PostgreSQL フレキシブル サーバー インスタンスで pg_diskann を有効にする前に、「PostgreSQL 拡張機能の使用方法」で説明されているように、それを許可リストに追加し、正しく追加されているかを SHOW azure.extensions; を実行して確認する必要があります。

サーバー パラメーターで pg_diskann を選択しているスクリーンショット。

重要

このプレビュー機能は新しくデプロイされた 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 インデックスの構築フェーズは次のとおりです。

  1. initializing
  2. loading tuples

警告

場合によっては、インデックスの構築に時間がかかる場合があります。

インデックス アクセス関数の選択

ベクトル型を使用すると、保存されているベクトルに対して 3 種類の検索を実行できます。 クエリの実行時にデータベースでインデックスを考慮できるように、インデックスの正しいアクセス関数を選択する必要があります。

pg_diskann は、以下の距離演算子をサポートしています

  • vector_l2_ops: <-> ユークリッド距離
  • vector_cosine_ops: <=> コサイン距離
  • vector_ip_ops: <#> 内積