获取 Vertex AI 文本嵌入

文本嵌入是文本数据的向量表示,用于查找相似项的方式多种多样。您每次完成 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 价格页面。

生成和存储文本嵌入

生成嵌入可能需要一些时间,具体取决于您使用的模型。对于对性能要求更高的工作负载,最佳实践是避免在读写事务中生成嵌入。而是使用以下 SQL 示例在只读事务中生成嵌入。

GoogleSQL

在 Spanner 中注册文本嵌入模型

在 GoogleSQL 中,您必须先注册模型,然后才能将其与 ML.PREDICT 函数一起使用。如需在 Spanner 数据库中注册 textembedding-gecko 模型,请execute以下 DDL 语句

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@002'
);

替换以下内容:

  • MODEL_NAME:嵌入模型的名称
  • PROJECT:托管 Vertex AI 端点的项目
  • LOCATION:Vertex AI 端点的位置

Spanner 会自动授予适当的权限。如果没有,请查看模型端点访问权限控制

架构发现和验证不适用于生成式 AI 模型。您需要提供与模型架构匹配的 INPUTOUTPUT 子句。如需了解 Gecko 模型的完整架构,请参阅获取文本嵌入

生成文本嵌入

如需生成嵌入,请使用以下 SQL 将一段文本直接传递给 ML.PREDICT 函数:

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 生成并插入嵌入:

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@002'::text,
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

替换以下内容:

  • PROJECT:项目 ID
  • LOCATION:您使用 Vertex AI 的区域

如需为存储在表中的数据生成嵌入,请使用以下 SQL:

SELECT id, spanner.ML_PREDICT_ROW(
  'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@002'::text, JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
) -> `predictions`->0->`embeddings`->`values``
FROM Products;

替换以下内容:

  • PROJECT:项目 ID
  • LOCATION:您使用 Vertex AI 的区域

存储文本嵌入

在只读事务中生成嵌入后,将它们存储在 Spanner 中,以便您可以使用运营数据对其进行管理。如需存储嵌入,请使用读写事务

对于性能要求较低的工作负载,您可以在读写事务中使用以下 SQL 生成并插入嵌入:

INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@002'::text,
  JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))) -> 'predictions'->0->'embeddings'->'values'
)

替换以下内容:

  • PROJECT:项目 ID
  • LOCATION:您使用 Vertex AI 的区域

更新文本嵌入

如需更新嵌入或实时注入数据,请使用 UPDATEGoogleSQLPostgreSQL)语句。

如需更新上一个示例中的 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 = ARRAY(
  SELECT
    UNNEST::real
  FROM
    UNNEST((
      SELECT
        spanner.JSONB_QUERY_ARRAY(spanner.ML_PREDICT_ROW('projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko',
          JSONB_BUILD_OBJECT('instances',
            JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content',
                $1)))) -> 'predictions'->0->'embeddings'->'values'))))
WHERE
  id = $2;

替换以下内容:

  • PROJECT:项目 ID
  • LOCATION:您使用 Vertex AI 的区域

后续步骤