创建索引和查询向量

选择文档版本:

本文档介绍了如何使用存储的嵌入生成索引和查询嵌入。如需详细了解如何存储嵌入,请参阅存储向量嵌入

您可以使用 AlloyDB 创建 ScaNNIVFIVFFlatHNSW 索引。

准备工作

在开始创建索引之前,您必须完成以下前提条件。

  • 嵌入向量已添加到 AlloyDB 数据库中的表

  • 安装了基于 pgvectorvector 扩展程序版本 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 相比)。此外,与

HNSW 相比,它可根据工作负载提供更快的 QPS。

AlloyDB 数据库中的表。如果您尝试对空表或分区表生成 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 in your database.

  • TABLE:要向其中添加索引的表。

  • EMBEDDING_COLUMN:用于存储 vector 数据的列。

    data.

  • DISTANCE_FUNCTION:要与此索引搭配使用的距离函数。

    请按以下方式之一操作:

    • L2 距离:l2

    • 点积:dot_product

    • 余弦距离:cosine

  • NUM_LEAVES_VALUE:要应用到此索引的分区数量。

    设置为介于 1 到 1048576 之间的任意值。了解详情

    如需详细了解如何确定此值,请参阅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

创建索引后,您可以运行最近邻搜索查询,

按照 [使用给定文本执行最近邻查询](#query)中的说明,利用该索引执行查询。

query with given text](#query).

索引参数必须设置为可在 QPS 和召回率之间取得适当的平衡。

如需详细了解如何对 ScaNN 索引进行调优,请参阅[对ScaNN

index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).

如需在使用 real[] 数据类型

(而非 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 替换为嵌入列的维度宽度。

如需详细了解如何查找维度,

请参阅[向量函数](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions)中的vector_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 扩展程序运行批量搜索查询。

如需查找嵌入向量的语义最近邻,您可以运行

以下示例查询,其中设置了在创建索引期间使用的相同距离函数。

during the index creation.


  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']

    LIMIT ROW_COUNT

替换以下内容:

  • TABLE:包含要与文本进行比较的嵌入的表。

    text to.

  • INDEX_NAME:您要使用的指数的名称,

    示例:my-scann-index

  • EMBEDDING_COLUMN:包含存储的潜入的列。

    embeddings.

  • DISTANCE_FUNCTION_QUERY:要与此查询一起使用的距离函数。

    根据创建索引时使用的距离函数,选择以下各项之一:

    while creating the index:

    • L2 距离:<->

    • 内积:<#>

    • 余弦距离:<=>

  • EMBEDDING:您要为其查找存储的语义最近邻的嵌入向量。

    semantic neighbors of.

  • ROW_COUNT:要返回的行数。

    如果您只想获得单个最佳匹配项,请指定 1

如需详细了解其他查询示例,请参阅

查询

您还可以使用 embedding() 函数将

文本转换为向量。您可以将向量应用于某个

pgvector 最近邻运算符(适用于 L2 距离的 <->),

语义上最相似的嵌入。

由于 embedding() 会返回 real 数组,因此您必须明确将

embedding() 调用转换为 vector,以便将这些值与 pgvector 运算符结合使用。

operators.


  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:要转换为向量嵌入的文本。

后续步骤