嵌入工作流示例

本页提供了一个示例工作流,演示了 embedding() 函数如何与表格存储的数据和 pgvector 地图项协同工作。该示例使用纯文本输入从数据库中提取结果,该数据库依赖于大语言模型 (LLM) 驱动的文本含义的语义解析。

示例场景

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

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

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

  • 该数据库与 Vertex AI Model Garden 集成,可访问 textembedding-gecko 英语模型。

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

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

使用 LLM 赋能的嵌入的 SQL 查询可以帮助缩小这一差距。通过应用嵌入,您可以在此示例的表中查询投诉与给定文本提示(例如“这是错误的颜色”)具有语义相似度的商品。

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

准备工作

请确保您满足以下要求:

必需的数据库扩展

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

    • google_ml_integration 个扩展程序

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

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

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

设置模型访问权限

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

如需使用基于云的 textembeddings-gecko 模型,您需要将数据库与 Vertex AI 集成

准备表格

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

创建用于存储嵌入的列

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

ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

此示例将 768 指定为参数,因为这是 textembedding-gecko 英语模型支持的维度数。如需了解详情,请参阅生成嵌入

该示例将 vector 数据类型应用于该列,以便轻松地将 pgvector 函数和运算符与其值搭配使用。

填充新列

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

您可以选择使用 embedding() 函数向此新列填充嵌入,以防您在 complaints 列中存储了文本。在此示例设置中,AlloyDB 使用版本为 003textembedding-gecko 模型生成嵌入。

UPDATE items SET complaint_embedding = embedding('textembedding-gecko@003', complaints);

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

创建索引

为了提高性能,请向 items 添加一个使用标量量化技术的索引。

CREATE INDEX complaint_embed_idx ON items
  USING ivf (complaint_embedding vector_l2_ops)
  WITH (lists = 20, quantizer = 'SQ8');

如需详细了解如何创建近似最近邻索引,请参阅索引

使用提供的文本运行 LLM 赋能的查询

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

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

后续步骤