你当前正在访问 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
要求用户通过预览表单注册。 按照以下步骤注册:
- 打开预览表单
- 填写所有相关的详细信息。 我们需要 Azure 订阅 ID 才能启用。
注意
填写预览表单后,请求需要一些时间才能获得批准。 将向你发送确认电子邮件。
启用 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;
如果 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 索引的阶段包括:
initializing
loading tuples
警告
在某些情况下,用户可能会遇到索引生成速度缓慢的情况。
选择索引访问函数
矢量类型允许对存储的向量执行三种类型的搜索。 需要为索引选择正确的访问函数,以便数据库在执行查询时考虑索引。
pg_diskann
支持以下距离运算符
vector_l2_ops
:<->
欧几里得距离vector_cosine_ops
:<=>
余弦距离vector_ip_ops
:<#>
内积