本页面提供了一个工作流示例,演示了 embedding()
函数如何处理存储在表中的数据以及 pgvector
查询功能。该示例使用纯文本输入,从依赖于大语言模型 (LLM) 驱动的文本含义语义解析的数据库中提取结果。
嵌入工作流的示例场景
假设某个数据库在 Cloud SQL for PostgreSQL 上运行,具有以下特点:
该数据库包含一个表:
items
。此表中的每一行描述了您的企业销售的商品。items
表包含列:complaints
。此列存储以纯文本形式记录的与每件商品相关的买方投诉。该数据库与 Vertex AI Model Garden 集成,使其能够访问
textembedding-gecko
LLM。
虽然此数据库存储了有关商品的投诉,但这些投诉会以纯文本形式存储,因此难以查询。例如,如果您想要查看哪些商品因为客户收到错误的商品颜色而受到最多投诉,则可以对表执行普通 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 查询有助于弥补这一缺口。通过应用嵌入,您可以在此示例的表中查询投诉与给定文本提示(例如“这是错误的颜色”)具有语义相似度的商品。
以下步骤展示了如何在前面介绍的示例场景中启用此功能。
准备表
在对 items
表的内容运行基于 LLM 的查询之前,必须准备表,以便基于现有数据存储和索引嵌入。
创建列来存储嵌入
向表添加列以存储嵌入。
ALTER TABLE items ADD COLUMN complaint_embedding vector(768);
此示例将 768
指定为参数,因为 textembedding-gecko
LLM 支持的维度数就是这个数。如需了解详情,请参阅生成嵌入。
此示例将 vector
数据类型应用于列,以简化使用 pgvector
函数和运算符处理列值的情况。
填充新列
使用 embedding()
函数,根据 complaints
列中显示的每行文本的值,使用嵌入填充此新列。在此示例中,Cloud SQL 使用 ID 为 textembedding-gecko
、版本为 001
的 LLM 生成嵌入。
UPDATE items SET complaint_embedding = embedding('textembedding-gecko@001', 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 项投诉。
查询会显示第一个排序行的 id
和 name
值。
SELECT id, name FROM items
ORDER BY complaint_embedding
<-> embedding('textembedding-gecko@001', 'It was the wrong color')::vector LIMIT 10;