本页面介绍了如何使用 AlloyDB for PostgreSQL 中的 HNSW
索引,通过存储的嵌入生成索引和查询嵌入。如需详细了解如何存储嵌入,请参阅存储向量嵌入。
准备工作
在开始创建索引之前,您必须完成以下前提条件。
安装了基于
pgvector
的vector
扩展程序版本0.5.0
或更高版本(由 Google 针对 AlloyDB 进行扩展)。CREATE EXTENSION IF NOT EXISTS vector;
创建 HNSW
索引
AlloyDB 支持使用 AlloyDB pgvector
扩展程序创建基于图的 hnsw
索引,该索引可与原生 pgvector
搭配使用。使用 hnsw
索引会导致贪婪搜索,即不断遍历图,寻找查询向量的最近邻,直到找到最佳结果。与 IVF
相比,它可以提供更快的查询性能,但构建时间更长。
如需详细了解 HNSW 算法,请参阅分层可导航小世界图。
如需创建 hnsw
索引,请运行以下查询:
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
替换以下内容:
INDEX_NAME
:要创建的索引的名称,例如my-hnsw-index
。TABLE
:要向其中添加索引的表。EMBEDDING_COLUMN
:用于存储vector
数据的列。DISTANCE_FUNCTION
:要与此索引一起使用的距离函数。请按以下方式之一操作:L2 距离:
vector_l2_ops
内积:
vector_ip_ops
余弦距离:
vector_cosine_ops
NUMBER_OF_CONNECTIONS
:图中每个节点的连接数上限。您可以先设置默认值16
,然后根据数据集的大小尝试更高的值。CANDIDATE_LIST_SIZE
:在图构建期间维护的候选项列表的大小,该列表会不断更新节点最近邻的当前最佳候选项。将此值设置为大于m
值两倍的任何值,例如64
。
如需查看索引编制进度,请使用 pg_stat_progress_create_index
视图:
SELECT * FROM pg_stat_progress_create_index;
phase
列会显示索引创建的当前状态,building graph
阶段会在索引创建后消失。
如需对索引进行调优以实现目标召回率和 QPS 平衡,请参阅对 hnsw
索引进行调优。
运行查询
在将嵌入存储到数据库中并为其编制索引后,您可以开始使用 pgvector
查询功能进行查询。
如需查找嵌入向量的语义最近邻,您可以运行以下示例查询,其中设置了在创建索引期间使用的相同距离函数。
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
替换以下内容:
TABLE
:包含要与文本进行比较的嵌入的表。INDEX_NAME
:要使用的索引的名称,例如my-hnsw-index
。EMBEDDING_COLUMN
:包含存储的嵌入的列。DISTANCE_FUNCTION_QUERY
:要用于此查询的距离函数。根据创建索引时使用的距离函数,选择以下各项之一:L2 距离:
<->
内积:
<#>
余弦距离:
<=>
EMBEDDING
:您要为其查找存储的语义最近邻的嵌入向量。ROW_COUNT
:要返回的行数。如果您只想获得单个最佳匹配项,请指定
1
。
如需详细了解其他查询示例,请参阅查询。
您还可以使用 embedding()
函数将文本转换为向量。您可以将向量应用于某个 pgvector
最近邻运算符(适用于 L2 距离的 <->
),以查找具有语义最相似的嵌入的数据库行。
由于 embedding()
会返回 real
数组,因此您必须明确将 embedding()
调用转换为 vector
,以便将这些值与 pgvector
运算符结合使用。