嵌入工作流示例

本页面提供了一个工作流示例,展示了 embedding() 函数如何与存储在表中的数据和 pgvector 功能结合使用。此示例使用纯文本输入从数据库中提取结果,该数据库依赖于大语言模型 (LLM) 驱动的语义解析来解析文本的含义。

示例场景

假设某个数据库在 AlloyDB 上运行,具有以下特点:

  • 该数据库包含一个表:items。此表中的每一行描述了您的企业销售的商品。

  • items 表包含一列:complaints。此 TEXT 列会存储针对每件商品记录的买家投诉。

  • 该数据库与 Vertex AI Model Garden 集成,因而可访问 text-embedding 英语模型。

尽管此数据库存储了与商品相关的投诉,但这些投诉以纯文本形式存储,因此很难进行查询。例如,如果您想要查看哪些商品因为客户收到错误的商品颜色而受到最多投诉,则可以对表执行普通 SQL 查询,查找各种关键字匹配项。但是,此方法仅匹配包含这些精确关键字的行。

例如,SELECT * FROM item WHERE complaints LIKE "%wrong color%" 等基本 SQL 查询不会返回 complaints 字段仅包含 The picture shows a blue one, but the one I received was red 的行。

使用 LLM 支持的嵌入的 SQL 查询可以帮助缩小这种差距。通过应用嵌入,您可以在此示例的表中查询其投诉与给定文本提示(例如“It was the wrong color”)具有语义相似度的商品。

以下步骤展示了如何在前面所述的示例设置中启用此功能。

准备工作

请确保您符合以下要求:

必需的数据库扩展程序

  • 确保您的 AlloyDB 数据库上已安装以下扩展程序。

    • google_ml_integration 扩展程序

    • vector 扩展程序,版本为 0.5.0.google-1 或更高版本

如需详细了解如何安装和管理扩展程序,请参阅配置数据库扩展程序

  • google_ml_integration.enable_model_support 数据库标志设置为 off

设置模型访问权限

您必须先将 AlloyDB 配置为与文本嵌入模型搭配使用,然后才能通过 AlloyDB 数据库生成嵌入。

如需使用云端 text-embedding-005 模型,您需要将您的数据库与 Vertex AI 集成

准备表

在对 items 表的内容运行基于 LLM 的查询之前,您必须准备该表以根据现有数据对嵌入进行存储和编制索引。

创建用于存储嵌入列的列

向表中添加一个用于存储嵌入的列。

ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

此示例将 768 指定为参数,因为该数值是 text-embedding-005 英语模型支持的维度数量。如需了解详情,请参阅生成嵌入代码

此示例将 vector 数据类型应用于列,以便于将 pgvector 函数和运算符与其值结合使用。

填充新列

如果您已有 CSV 格式的嵌入,请按照存储向量嵌入中的步骤存储嵌入。

如果已在 complaints 列中存储了文本,可以选择通过 embedding() 函数使用嵌入填充此新列。在此示例设置中,AlloyDB 使用 text-embedding 模型(版本为 005)生成嵌入。

UPDATE items SET complaint_embedding = embedding('text-embedding-005', complaints);

此示例将 embedding()real[] 返回值隐式转换为 vector 值,以便将该值存储到之前创建的 vector 列中。

创建索引

如需提高性能,请向 items 添加使用标量量化技术的索引。

CREATE INDEX complaint_embed_idx ON items
  USING scann (complaint_embedding l2)
  WITH (num_leaves=20);

如需详细了解如何创建 ScaNN 索引,请参阅创建索引和查询向量

使用提供的文本运行 LLM 支持的查询

现在,您可以对 items 表执行语义最近邻查询。以下查询使用 pgvector 提供的 <-> 运算符,根据与文本 It was the wrong color 的语义邻近性对表的行进行排序,并返回最相关的十条投诉。该查询会显示排序后的第一行的 idname 值。

SELECT id, name FROM items
  ORDER BY complaint_embedding::vector
  <-> embedding('text-embedding-005', 'It was the wrong color') LIMIT 10;

后续步骤