本页提供了一个工作流示例,展示了 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
、版本为 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;