运行混合向量相似性搜索

本文档介绍如何使用 vector 扩展程序在 AlloyDB for PostgreSQL 中执行混合搜索,该扩展程序是为 AlloyDB 自定义的标准 pgvector PostgreSQL 扩展程序,可将文本搜索、关键字匹配、向量搜索和语义相似度整合到一起。借助混合搜索,您可以使用完全匹配的关键字和语义上相似的内容来检索高度相关的结果。

如要在 AlloyDB for PostgreSQL 中执行混合搜索,您需要在表中同时创建向量索引和文本搜索索引。之后,系统会整合这两项搜索的结果并重新对其进行排名,以呈现最相关的信息。

创建 GIN 索引

广义倒排索引 (GIN) 是一种经过优化的专用索引类型,可在复合值(例如数组、JSONB 及全文搜索数据)中进行搜索。

如需对文本数据创建 GIN 索引来执行全文搜索,请运行以下命令:

CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));

替换以下内容:

  • INDEX_NAME:要创建的索引的名称,例如 my-gin-index

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

  • COLUMN_NAME:用于存储要搜索的文本数据的列。

创建 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 索引。您还可以创建 HNSW 索引。

通过倒数排序融合执行混合搜索

混合搜索需要分别执行向量搜索和文本搜索,然后使用倒数排序融合 (RRF) 整合结果并对其重新排名。RRF 是一种基于排名的算法,它通过为每个文档分配一个得分,将多个已排名的搜索结果列表整合为一个已排名的列表。此得分基于通过 RRF 获得的相应文档在所有贡献列表中的倒数排序,排名越高的文档贡献越大。使用以下 SQL 查询来整合全文搜索和混合搜索,并对结果进行重新排名:

        WITH vector_search AS (
            SELECT id,
                RANK () OVER (ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT')) AS rank
                FROM TABLE
                ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT') LIMIT 10
        ),
        text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc)
            FROM TABLE
            WHERE to_tsvector('english', COLUMN_NAME) @@ to_tsquery(KEYWORD)
            ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc
            LIMIT 10
        )
        SELECT
            COALESCE(vector_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + vector_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM vector_search FULL OUTER JOIN text_search ON vector_search.id = text_search.id
        ORDER BY rrf_score DESC
        LIMIT 5;

替换以下内容:

  • MODEL_ID:要查询的模型的 ID。

    如果您使用的是 Vertex AI Model Garden,请将 text-embedding-005 指定为模型 ID。这些是 AlloyDB 可用于文本嵌入的云端模型。如需了解详情,请参阅文本嵌入

  • TABLE:包含数据的表。

  • TEXT:要转换为向量嵌入的文本。

  • KEYWORD:要搜索的关键字。

  • COLUMN_NAME:用于存储要搜索的文本数据的列。

混合搜索查询及相关通用表表达式 (CTE) 的说明:

  • vector_search CTE:执行标准向量相似度搜索,按余弦距离对结果进行排序并分配排名。它会检索语义上最相似的前 10 个产品。
  • text_search CTE:使用 to_tsvectorto_tsquery 执行文本搜索,会使用 ts_rank 计算相关性,并检索相关性最高的前 10 个文本匹配项。
  • Final SELECT Statement CTE:使用 FULL OUTER JOIN 联接向量搜索结果和文本搜索结果,选择产品 ID,计算 RRF 得分,按得分排序,并检索前 5 个结果。

后续步骤