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