你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何为 Azure Database for PostgreSQL 灵活服务器启用和使用 diskann 扩展(预览版)

DiskANN 是一种可扩展的最近的邻域搜索算法,可给出近似的结果,适用于任意规模的高效矢量搜索。 这一算法能够做到高召回率、每秒高查询 (QPS) 和低查询延迟,甚至适用于包含数十亿项目的数据集。 这使得它成为处理大量数据的强大工具。 从 Microsoft 了解有关 DiskANN 的更多信息

Azure Database for PostgreSQL 灵活服务器的 pg_diskann 扩展增加了使用 DiskANN 进行高效矢量索引和搜索的支持。

注册 pg_diskann 预览功能

适用于 Azure Database for PostgreSQL 灵活服务器的 pg_diskann 要求用户通过预览表单注册。 按照以下步骤注册:

  1. 打开预览表单
  2. 填写所有相关的详细信息。 我们需要 Azure 订阅 ID 才能启用。

注意

填写预览表单后,请求需要一些时间才能获得批准。 将向你发送确认电子邮件。

启用 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;

如果 PostgreSQL 数据库中尚未安装 ,此命令将进行启用。pgvector

注意

若要从当前连接的数据库中移除扩展,请使用 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 值 (l_value_is)(在事务块中使用 SET LOCAL):

SET diskann.l_value_is = 100;
SELECT * FROM my_table ORDER BY embedding <=> '[1,2,3]' LIMIT 5; -- uses 100 candidates

Postgres 将自动决定何时使用 DiskANN 索引。 如果在某些情况下始终要使用索引,请使用以下命令:

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

警告

在某些情况下,用户可能会遇到索引生成速度缓慢的情况。

选择索引访问函数

矢量类型允许对存储的向量执行三种类型的搜索。 需要为索引选择正确的访问函数,以便数据库在执行查询时考虑索引。

pg_diskann 支持以下距离运算符

  • vector_l2_ops<-> 欧几里得距离
  • vector_cosine_ops<=> 余弦距离
  • vector_ip_ops<#> 内积