本页介绍了如何根据模型生成和存储向量嵌入。
如需了解详情,请参阅使用 Cloud SQL 构建生成式 AI 应用。
借助 Cloud SQL,您可以使用由 Vertex AI 托管的嵌入模型将文本字符串转换为嵌入,这是模型将给定文本的语义含义表示为数值向量的方法。
Cloud SQL 将嵌入式数据实现为 real
值的数组。您可以将生成的嵌入作为 pgvector
扩展程序函数的输入。
准备工作
有些要求因您是想使用 Cloud SQL 生成嵌入,还是只需要使用从其他来源存储在数据库中的嵌入而有所不同。
���域限制
如需���用 Cloud SQL 生成 Vertex AI 嵌入,您的实例必须位于支持生成式 AI 基础模型的区域。Cloud SQL 可用于嵌入的 Vertex AI 模型(text-embedding
和 textembedding-gecko
)位于该区域。
必需的数据库扩展
如需使用嵌入,请在您的 Cloud SQL 实例上安装 google_ml_integration
扩展程序。对于 Vertex AI 模型,请安装版本 1.2
或更高版本。对于第三方或自定义模型,请安装版本 1.4.2
或更高版本。
您可以选择性地使用 pgvector
扩展程序,如果您想存储这些嵌入,并将向量函数和运算符与嵌入一起使用。
Cloud SQL 支持这两种扩展程序。您可以在实例中的任何数据库上安装它们。如需了解详情,请参阅配置 PostgreSQL 扩展程序。
设置模型访问权限
您必须先将 Cloud SQL 配置为使用文本嵌入模型,然后才能通过 Cloud SQL 实例生成嵌入。
如需使用基于云的 text-embedding
或 textembedding-gecko
模型,您需要将 Cloud SQL 与 Vertex AI 集成。
向数据库用户授予生成嵌入的访问权限
向数据库用户授予使用 embedding
函数运行预测的权限:
按照使用 psql 客户端连接中所述,将
psql
客户端连接到主实例。在
psql
命令提示符下,连接到数据库并授予权限:\c DB_NAME GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
请替换以下内容:
DB_NAME:您要授予其权限的数据库的名称
USER_NAME:您要为其授予权限的用户的名称
生成嵌入
Cloud SQL 提供了一个函数,可让您将文本转换为向量嵌入。然后,您可以将该嵌入作为向量数据存储在数据库中,并可选择性地使用 pgvector
函数对其运行查询。
生成嵌入
如需使用 Cloud SQL 生成嵌入,请使用 google_ml_integration
扩展程序提供的 embedding
函数:
SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');
进行以下替换:
MODEL_ID:要查询的模型的 ID。
如果您使用的是 Vertex AI Model Garden,请指定
text-embedding-004
或text-multilingual-embedding-002
。这些是 Cloud SQL 可用于文本嵌入的基于云的模型。如需了解详情,请参阅文本嵌入。VERSION_TAG(可选):要查询的模型的版本标记。对于
text-embedding-004
或text-multilingual-embedding-002
之前的textembedding-gecko
版本,请在标记前面添加@
。如果您将某个
textembedding-gecko
模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记。TEXT:要转换为向量嵌入的文本。
以下示例使用 text-embedding-004
模型,根据提供的字面量字符串生成嵌入:
SELECT embedding( 'text-embedding-004', 'Cloud SQL is a managed, cloud-hosted SQL database service.');
存储生成的嵌入
embedding()
函数的返回值是 real
值的数组。如需将此值存储在表中,请添加 real[]
列:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];
进行以下替换:
TABLE:表格名称
EMBEDDING_COLUMN:新嵌入列的名称
DIMENSIONS:模型支持的维度数。
如果您将某个
text-embedding
或textembedding-gecko
模型与 Vertex AI 搭配使用,请指定768
。
(可选)如果您已安装 pgvector
扩展程序,则可以将嵌入存储为 vector
值:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN vector(DIMENSIONS);
创建用于存储嵌入列的列后,您可以根据已存储在同一表中其他列中的值来填充该列:
UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);
进行以下替换:
TABLE:表名称。
EMBEDDING_COLUMN:嵌入列的名称。
MODEL_ID:要查询的模型的 ID。
如果您使用的是 Vertex AI Model Garden,请指定
text-embedding-004
或text-multilingual-embedding-002
。这些是 Cloud SQL 可用于文本嵌入的基于云的模型。如需了解详情,请参阅文本嵌入。VERSION_TAG(可选):要查询的模型的版本标记。对于
text-embedding-004
或text-multilingual-embedding-002
之前的textembedding-gecko
版本,请Prepend the tag with
@`。如果您将某个
textembedding-gecko
模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记。SOURCE_TEXT_COLUMN:存储文本的列的名称。您将此文本转换为嵌入。
上述命令适用于 real[]
和 vector
嵌入列。如果嵌入列的类型为 vector
,Cloud SQL 会将 embedding()
的返回值从 real
数组隐式转换为 vector
值。
以下示例使用 text-embedding-004
模型,根据 messages.message
列的内容在 messages.message_vector
列中填充嵌入:
UPDATE messages SET message_vector = embedding( 'text-embedding-004', message);
使用 pgvector
查询嵌入并编入索引
借助 pgvector
PostgreSQL 扩展程序,您可以在数据库中存储、编入索引和查询文本嵌入时使用向量专用运算符和函数。Cloud SQL 针对使用 pgvector
进行了自己的优化,可让您创建索引,以加快涉及嵌入的查询速度。
创建最近邻索引
pgvector
支持通过索引编制进行近似最近邻 (ANN) 搜索。
如需创建 HNSW
索引,请使用 hnsw
函数,如以下示例所示:
CREATE INDEX ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = M, ef_construction = EF_CONSTRUCTION);
进行以下替换:
TABLE:要向其中添加索引的表。
EMBEDDING_COLUMN:用于存储
vector
数据的列。DISTANCE_FUNCTION:要与此索引一起使��的距离函数。请按以下方式之一操作:
L2 距离:
vector_l2_ops
内积:
vector_ip_ops
余弦距离:
vector_cosine_ops
M(可选):图中与相邻数据点的连接数上限。我们建议的范围为 5 到 48。默认为 16。
EF_CONSTRUCTION(可选):在构建索引时,在图遍历期间存储最接近候选项的列表的大小。值越高,算法考虑的候选项就越多,从而可以创建更好的索引。默认大小为 64。
如需在使用 real[]
数据类型(而非 vector
)的嵌入列上创建此索引,请将该列转换为 vector
数据类型:
CREATE INDEX ON TABLE
USING hnsw ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
WITH (m = M, ef_construction = EF_CONSTRUCTION);
将 DIMENSIONS 替换为嵌入列的维度宽度。
下一部分将演示此类索引的示例。
使用给定文本执行最近邻查询
在将嵌入式数据存储到数据库并为其编制索引后,您可以使用全部范围的 pgvector
查询功能。
如需查找一段文字的最近邻语义,请使用 embedding()
函数将文字转换为向量。在同一查询中,将此向量应用于 pgvector
近似最近邻运算符 <->
,以查找语义最相似的嵌入数据库行。
由于 embedding()
会返回 real
数组,因此您必须将 embedding()
调用转换为 vector
,以便将这些值与 pgvector
运算符结合使用。
SELECT RESULT_COLUMNS FROM TABLE
ORDER BY EMBEDDING_COLUMN
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
LIMIT ROW_COUNT
进行以下替换:
RESULT_COLUMNS:要显示的语义相似行中的列。
TABLE:包含要与文本进行比较的嵌入的表。
EMBEDDING_COLUMN:包含存储的嵌入列的列。
MODEL_ID:要查询的模型的 ID。
如果您使用的是 Vertex AI Model Garden,请指定
text-embedding-004
或text-embedding-multilingual-002
。这些是 Cloud SQL 可用于文本嵌入的基于云的模型。如需了解详情,请参阅文本嵌入。VERSION_TAG(可选):要查询的模型的版本标记。在标记前面添加
@
。如果您将某个
textembedding-gecko
模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记。TEXT:您想要的文本,以便您可以找到最近的存储语义邻近项。
ROW_COUNT:要返回的行数。如果您只想获得单个最佳匹配项,请将
1
指定为此参数的值。
如需使用存储的嵌入列(使用 real[]
数据类型,而不是 vector
)运行此查询,请将该列转换为 vector
数据类型:
SELECT RESULT_COLUMNS FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
LIMIT ROW_COUNT
使用模型版本标记以避免出错
Cloud SQL 强烈建议您始终使用所选嵌入模型的稳定版本。对于大多数模型,这意味着需要明确设置版本标记。
调用 embedding()
函数时未指定版本标记虽然在语法上有效,但可能容易出错。
如果您在使用 Vertex AI Model Garden 中的模型时省略版本标记,Vertex AI 会使用该模型的最新版本。这可能不是最新的稳定版本。如需详细了解可用的 Vertex AI 模型版本,请参阅模型版本。
给定 Vertex AI 模型版本始终会针对给定文本输入返回相同的 embedding()
响应。如果您未在嵌入调用中指定模型版本,则新发布的模型版本可能会突然更改给定输入的返回向量。这可能会导致应用出现错误或其他意外行为。
后续步骤
- 使用 Cloud SQL 构建生成式 AI 应用
- 将 Cloud SQL 与 Vertex AI 集成
- 从 Cloud SQL 实例调用在线预测
- 了解嵌入工作流的示例
- 使用 LangChain 构建依托 LLM 的应用
- 使用 Cloud SQL Studio 管理数据
- 在 Gemini 协助下编写 SQL