文本嵌入是文本数据的向量表示法,用于以多种方式查找相似项。每次完成 Google 搜索或在线购物时,您都会与文本嵌入进行互动。创建文本嵌入时,您可以以浮点数数组的形式获取自然文本的向量表示法。也就是说 都会为文本赋予数字表示形式。通过比较两段文本的向量表示法之间的数值距离,应用可以确定文本或文本表示的对象之间的相似度。
借助 Vertex AI 文本嵌入 API,您可以使用生成式 AI 创建文本嵌入。使用
你可以为
Spanner 和 Vertex AI 嵌入模型,
textembedding-gecko
模型。
如需详细了解嵌入,请参阅 获取文本嵌入。
目标
在本教程中,您将学习如何:
- 使用 DDL 语句在 Spanner 架构中注册 Vertex AI
textembedding-gecko
模型。 - 使用 SQL 查询引用已注册的模型,以便根据存储在 Spanner 中的数据生成嵌入。
费用
本教程使用 Google Cloud 的以下收费组件:
- Spanner
- Vertex AI
如需详细了解 Spanner 费用,请参阅 Spanner 价格页面。
如需详细了解 Vertex AI 费用,请参阅 Vertex AI 价格页面。
生成和存储文本嵌入
生成嵌入可能需要一些时间,具体取决于您使用的模型。对于对性能更为敏感的工作负载,最佳实践是避免在读写事务中生成嵌入。而是在 Transformer 模型 只读事务。
GoogleSQL
在 Spanner 中注册文本嵌入模型
在 GoogleSQL 中,您必须先注册模型,然后才能通过
ML.PREDICT
函数。如需在一个数据集中注册 textembedding-gecko
模型,
Spanner 数据库,执行以下 DDL
statement:
CREATE MODEL MODEL_NAME
INPUT(content STRING(MAX))
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION'
);
请替换以下内容:
MODEL_NAME
:嵌入模型的名称PROJECT
:托管 Vertex AI 端点的项目LOCATION
:Vertex AI 端点的位置MODEL_VERSION
:textembedding-gecko
嵌入模型的版本
Spanner 会自动授予适当的权限。如果没有,请查看模型端点访问控制。
架构发现和验证不适用于生成式 AI
模型。您需要提供匹配的 INPUT
和 OUTPUT
子句
与模型架构相冲突如需查看 Gecko 模型的完整架构,请参阅获取文本嵌入。
生成文本嵌入
要生成嵌入,请将一段文本直接传递给
ML.PREDICT
函数,请使用以下 SQL:
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT "A product description" as content)
);
如需为表中存储的数据生成嵌入,请使用以下 SQL:
SELECT id, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT id, description as content FROM Products)
);
存储文本嵌入
在只读事务中生成嵌入后,将其存储在 Spanner 中,以便与您的运营数据一起管理。接收者 存储嵌入,使用读写事务。
对于对性能不太敏感的工作负载,您可以在读写事务中使用以下 SQL 生成和插入嵌入:
CREATE TABLE Products(
id INT64 NOT NULL,
description STRING(MAX),
embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT @Description as content)
);
PostgreSQL
生成文本嵌入
如需生成嵌入,请使用以下 SQL 将一段文本直接传递给 spanner.ML_PREDICT_ROW
函数:
SELECT
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
'{"instances": [{"content": "A product description"}]}'::jsonb
) ->'predictions'->0->'embeddings'->'values';
请替换以下内容:
PROJECT
:托管 Vertex AI 端点的项目LOCATION
:Vertex AI 端点的位置MODEL_VERSION
:textembedding-gecko
嵌入模型的版本
如需为表中存储的数据生成嵌入,请使用以下 SQL:
SELECT id, spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
) -> `predictions`->0->`embeddings`->`values``
FROM Products;
请替换以下内容:
PROJECT
:托管 Vertex AI 端点的项目LOCATION
:Vertex AI 端点的位置MODEL_VERSION
:textembedding-gecko
嵌入模型的版本
存储文本嵌入
在只读事务中生成嵌入后,将其存储在 Spanner 中,以便与您的运营数据一起管理。接收者 存储嵌入,使用读写事务。
对于对性能不太敏感的工作负载,您可以在读写事务中使用以下 SQL 生成和插入嵌入:
CREATE TABLE Products (
id INT8 NOT NULL,
description TEXT,
embeddings REAL[],
PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
) -> 'predictions'->0->'embeddings'->'values'
));
请替换以下内容:
PROJECT
:托管 Vertex AI 端点的项目LOCATION
:Vertex AI 端点的位置MODEL_VERSION
:textembedding-gecko
嵌入模型的版本
更新文本嵌入
如需更新嵌入或实时提取数据,请使用 UPDATE
(GoogleSQL 和 PostgreSQL)语句。
如需更新上例中的 Products
表,请使用以下 SQL:
GoogleSQL
UPDATE Products
SET
description = @description,
embeddings = (SELECT embeddings.values
FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
)
WHERE id = @id;
替换以下内容:
MODEL_NAME
:嵌入模型的名称
PostgreSQL
UPDATE
Products
SET
description = $1,
embeddings = spanner.FLOAT32_ARRAY(
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
) -> 'predictions'->0->'embeddings'->'values')
WHERE
id = $2;
请替换以下内容:
PROJECT
:托管 Vertex AI 端点的项目LOCATION
:Vertex AI 端点的位置MODEL_VERSION
:textembedding-gecko
嵌入模型的版本
后续步骤
- 了解如何使用 Vertex AI 矢量搜索 来搜索语义相似的项。
- 如需详细了解机器学习和嵌入,请参阅我们的 嵌入的速成课程。