本文档介绍了如何使用存储的嵌入生成索引和查询嵌入。如需详细了解如何存储嵌入,请参阅存储向量嵌入。
您可以使用 AlloyDB 创建 ScaNN
、IVF
、IVFFlat
和 HNSW
索引。
准备工作
在开始创建索引之前,您必须完成以下前提条件。
安装了基于
pgvector
的vector
扩展程序版本0.5.0
或更高版本(由 Google 针对 AlloyDB 进行扩展)。CREATE EXTENSION IF NOT EXISTS vector;
如需生成
ScaNN
索引,请安装alloydb_scann
扩展程序以及vector
扩展程序。CREATE EXTENSION IF NOT EXISTS alloydb_scann;
创建索引
您可以为数据库中的表创建以下索引类型之一。
创建 ScaNN
索引
AlloyDB alloydb_scann
,
由 Google 开发的 PostgreSQL 扩展程序,可实现高度
由 [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
ScaNN
索引是一种基于树的量化索引,用于近似
最近邻搜索。与 相比,它可以缩短索引构建时间并减少内存占用。
内存占用量与 HNSW
相比。此外,与 相比,它可根据工作负载提供更快的 QPS。
与 HNSW
的比较(基于工作负载)。
AlloyDB 数据库中的表。如果您尝试生成 ScaNN
索引
如果您尝试对空表或分区表生成 索引,可能会遇到一些问题。如需了解详情
如需详细了解生成的错误,请参阅排查 ScaNN 索引错误。
二级树 ScaNN
索引
如需将使用 ScaNN 算法的二级树索引应用于列
如需对包含存储的向量嵌入的列创建使用 ScaNN 算法的二级树索引,请运行以下 DDL 查询:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
替换以下内容:
INDEX_NAME
:您要创建,例如
my-scann-index
。索引名称会在整个数据库中共享。数据库中的所有数据。确保每个索引名称对每个
数据库中的表。
TABLE
:要向其中添加索引的表。EMBEDDING_COLUMN
:用于存储vector
的列数据
DISTANCE_FUNCTION
:要使用的距离函数使用此索引。请按以下方式之一操作:
L2 距离:
l2
点积:
dot_product
余弦距离:
cosine
NUM_LEAVES_VALUE
:要应用的分区数量此指数。设置为介于 1 到 1048576 之间的任意值。了解详情
如需详细了解如何确定此值,请参阅对
ScaNN
索引进行调优。
三级树 ScaNN
索引
如需对包含存储的向量嵌入的列创建使用 ScaNN 算法的三级树索引,
如需对包含存储的向量嵌入的列创建使用 ScaNN 算法的二级树索引,请运行以下 DDL 查询:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
替换以下内容:
MAX_NUM_LEVELS
:K-means 聚类树。对于基于二级树的量化,设置为
1
(默认值)对于基于二级树的量化,设置为
2
;对于基于三级树的量化,设置为2
。
创建索引后,您可以运行最近邻搜索查询,
按照 [使用给定文本执行最近邻查询]中的说明,利用该索引执行查询。
查询(使用指定文本)](#query)。
索引参数必须设置为可在 QPS 和
召回。如需详细了解如何对 ScaNN
索引进行调优,请参阅 [对 ScaNN
index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).
如需在使用 real[]
数据类型的嵌入列上创建此索引
如需在使用 vector
数据类型(而非 vector
)的嵌入列上创建此索引,请将该列转换为 vector
数据类型:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
将 DIMENSIONS
替换为嵌入列的维度宽度。
嵌入列。如需详细了解如何查找维度,
请参阅 [Vectorvector_dims
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
如需查看索引编制进度,请使用 pg_stat_progress_create_index
视图:
SELECT * FROM pg_stat_progress_create_index;
phase
列会显示索引创建的当前状态,
building index: tree training
阶段会在索引创建后消失。
如需对索引进行调优以实现目标召回率和 QPS 平衡,请参阅对 ScaNN
索引进行调优。
分析已编制索引的表
创建 ScaNN
索引后,运行 ANALYZE
命令以更新有关数据的统计信息。
ANALYZE TABLE;
运行查询
在将嵌入存储到数据库中并为其编制索引后,您可以开始
使用 [pgvector
查询
功能](https://github.com/pgvector/pgvector#querying)。您无法运行
使用 alloydb_scann
扩展程序运行批量搜索查询。
如需查找嵌入向量的语义最近邻,您可以运行
以下示例查询,其中设置了在创建索引期间使用的相同距离函数。
在创建索引期间。
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
替换以下内容:
TABLE
:包含要与文本进行比较的嵌入的表。发短信至。
INDEX_NAME
:您要使用的指数的名称 - 对于例如,
my-scann-index
。EMBEDDING_COLUMN
:包含存储的嵌入。
DISTANCE_FUNCTION_QUERY
:要与此查询一起使用的距离函数。查询。根据所使用的距离函数,选择以下各项之一
创建索引时:
L2 距离:
<->
内积:
<#>
余弦距离:
<=>
EMBEDDING
:您要为其查找存储的最近邻的嵌入向量语义邻居。
ROW_COUNT
:要返回的行数。如果您只想获得单个最佳匹配项,请指定
1
。
如需详细了解其他查询示例,请参阅
查询。
您还可以使用 embedding()
函数将
文本转换为向量。您可以将向量应用于某个
pgvector
最近邻运算符(适用于 L2 距离的 <->
),以查找具有
语义上最相似的嵌入。
由于 embedding()
会返回 real
数组,因此您必须明确将
embedding()
调用转换为 vector
,以便将这些值与 pgvector
结合使用
运算符。
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
替换以下内容:
MODEL_ID
:要查询的模型的 ID。如果您使用的是 Vertex AI Model Garden,请将
text-embedding-005
指定为模型 ID。这些是 AlloyDB 可用于文本嵌入的云端模型。如需了解详情,请参阅文本嵌入。可选:
VERSION_TAG
:要查询的模型的版本标记。在标记前面添加@
。如果您将某个
text-embedding
英语模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记,例如text-embedding-005
。Google 强烈建议您始终指定版本标记。如果您未指定版本标记,AlloyDB 会始终使用最新的模型版本,这可能会导致意外结果。
TEXT
:要转换为向量嵌入的文本。