生成嵌入

本页面介绍了如何将 AlloyDB 用作大型语言模型 (LLM) 工具,以及如何根据 LLM 生成向量嵌入。

如需详细了解如何将机器学习模型与 AlloyDB Omni 搭配使用,请参阅使用 AlloyDB AI 构建生成式 AI 应用

借助 AlloyDB,您可以使用由 Vertex AI 托管的 LLM 将文本字符串转换为嵌入,这是模型将给定文本的语义含义表示为数值向量的方法。如需详细了解针对文本嵌入的 Vertex AI 支持,请参阅文本嵌入

准备工作

如需让 AlloyDB 生成嵌入,请确保您满足以下要求:

区域限制

您可以在可使用 Vertex AI 上的生成式 AI 的区域中生成嵌入。如需查看相应区域的列表,请参阅 Vertex AI 上的生成式 AI 位置

对于 AlloyDB,请确保 AlloyDB 集群和您要查询的 Vertex AI 模型位于同一区域。

必需的数据库扩展程序

  • 确保 google_ml_integration 扩展程序已安装到您的 AlloyDB 数据库。

    CREATE EXTENSION IF NOT EXISTS google_ml_integration;
    

    此扩展程序包含在 AlloyDB 中。您可以在集群中的任何数据库上安装它。

  • google_ml_integration.enable_model_support 数据库标志设置为 off

设置模型访问权限

您必须先将 AlloyDB 配置为与文本嵌入模型搭配使用,然后才能通过 AlloyDB 数据库生成嵌入。

如需使用云端 text-embedding 模型,您需要将您的数据库与 Vertex AI 集成

向数据库用户授予生成嵌入的访问权限

向数据库用户授予执行 embedding 函数以运行预测的权限:

  1. 按照使用容器化 psql 进行连接中所述,将 psql 客户端连接到集群的主实例。

  2. 在 psql 命令提示符下,连接到数据库并授予权限:

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

    替换以下内容:

    • DB_NAME:应针对其授予权限的数据库的名称

    • USER_NAME:应向其授予权限的用户的名称

生成嵌入

AlloyDB 提供了一个函数,可让您将文本转换为向量嵌入。然后,您可以将该嵌入作为向量数据存储在数据库中,并可选择性地使用 pgvector 函数使其作为查询依据。

如需使用 AlloyDB 生成嵌入,请使用 google_ml_integration 扩展程序提供的 embedding() 函数:

SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');

替换以下内容:

  • MODEL_ID:要查询的模型的 ID。

    如果您使用的是 Vertex AI Model Garden,请将 text-embedding-005 指定为模型 ID。这些是 AlloyDB 可用于文本嵌入的云端模型。如需了解详情,请参阅文本嵌入

  • 可选:VERSION_TAG:要查询的模型的版本标记。在标记前面添加 @

    如果您将某个 text-embedding 英语模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记,例如 text-embedding-005

    Google 强烈建议您始终指定版本标记。如果您未指定版本标记,AlloyDB 将始终使用最新的模型版本,这可能会导致意外结果。

  • TEXT:要转换为向量嵌入的文本。

以下示例使用 text-embedding 英语模型的版本 005,根据提供的字面量字符串生成嵌入:

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

存储嵌入

使用 google_ml_integration 扩展程序生成的嵌入会作为 real 值的数组实现。这些生成的嵌入会作为 pgvector 扩展程序函数的输入传递。

如需将此值存储在表中,请添加 real[] 列:

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[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-005 指定为模型 ID。这些是 AlloyDB 可用于文本嵌入的云端模型。如需了解详情,请参阅文本嵌入

  • 可选:VERSION_TAG:要查询的模型的版本标记。在标记前面添加 @

    如果您将某个 text-embedding 英语模型与 Vertex AI 搭配使用,请指定模型版本中列出的某个版本标记,例如 text-embedding-005

    Google 强烈建议您始终指定版本标记。如果您未指定版本标记,AlloyDB 将始终使用最新的模型版本,这可能会导致意外结果。

  • SOURCE_TEXT_COLUMN:存储要转换为嵌入的文本的列的名称

您还可以使用 embedding() 函数将文本转换为向量。您可以将向量应用于 pgvector 最近邻运算符 <->,以查找具有语义最相似的嵌入的数据库行。

由于 embedding() 会返回 real 数组,因此您必须明确将 embedding() 调用转换为 vector,以便将这些值与 pgvector 运算符结合使用。

  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT

使用模型版本标记以避免出错

Google 强烈建议您始终使用所选嵌入模型的稳定版。对于大多数模型,这意味着需要明确设置版本标记。

调用 embedding() 函数时未指定模型的版本标记虽然在语法上有效,但也容易出错。

如果您在使用 Vertex AI Model Garden 中的模型时省略版本标记,Vertex AI 会使用该模型的最新版本。这可能不是最新的稳定版本。如需详细了解可用的 Vertex AI 模型版本,请参阅模型版本

给定 Vertex AI 模型版本始终会针对给定文本输入返回相同的 embedding() 响应。如果您未在对 embedding() 的调用中指定模型版本,则新发布的模型版本可能会突然更改针对给定输入的返回向量,从而导致应用出现错误或其他意外行为。

为避免出现这些问题,请始终指定模型版本。

问题排查

错误:未找到 model_id 的对应模型

错误消息

尝试使用 embedding()google_ml.embedding() 函数生成嵌入时,可能会发生以下错误:

ERROR: 'Model not found for model_id:

  • 升级 google_ml_integration 扩展程序,然后尝试重新生成嵌入。

    ALTER EXTENSION google_ml_integration UPDATE;
    

    您也可以删除该扩展程序,然后重新创建。

    DROP extension google_ml_integration;
    CREATE EXTENSION IF NOT EXISTS google_ml_integration;
    
  • 如果您使用 google_ml.embedding() 函数生成嵌入,请确保模型已注册,并且您在查询中使用正确的 model_id

后续步骤