生成嵌入

选择文档版本:

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

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

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

准备工作

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

区域限制

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

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

必需的数据库扩展程序

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

    CREATE EXTENSION IF NOT EXISTS google_ml_integration;
    

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

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

设置模型访问权限

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

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

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

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

  1. 按照psql 客户端连接到实例中所述,将 psql 客户端连接到集群的主实例。

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

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

    替换以下内容:

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

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

生成嵌入

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

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

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

替换以下内容:

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

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

  • 可选: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 Omni 可用于文本嵌入的云端模型。如需了解详情,请参阅文本嵌入

  • 可选: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 IF NOT EXISTS google_ml_integration UPDATE;
    

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

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

后续步骤