使用优化后的函数加速查询

借助 AlloyDB for PostgreSQL 中的优化函数,您可以使用更小、更快的代理模型来处理大多数使用 AI 函数的 SQL 查询,仅在必要时才回退到更大的大语言模型 (LLM)。这种方法可最大限度地减少逐行分类或过滤任务的远程 LLM 调用,从而降低运营成本并提高查询响应速度。

由于对大语言模型 (LLM) 的远程调用,ai.if() 等 AlloyDB AI 函数可能会出现高延迟。优化后的函数通过使用较小的本地训练代理模型来处理查询,从而解决此延迟问题。这些模型会根据您的数据样本进行训练,并使用 LLM 的输出作为真实来源。

在运行时,系统会使用 LLM 对部分行进行准确率检查。 为了执行此检查,AlloyDB 使用 LLM 为样本行生成标签,并将其与代理模型的预测结果进行比较,以验证准确率。如果准确性检查失败,查询将回退到使用 LLM。

当您使用优化函数时,AlloyDB 会执行以下操作:

  1. 训练代理模型:AlloyDB 会根据您的数据样本训练轻量级代理模型。当您将 PREPARE 语句与 ai.if() 函数搭配使用来训练模型以优化查询时,此过程会在后台进行。
  2. 执行查询:使用 EXECUTE 语句时,AlloyDB 会使用经过训练的代理模型在本地处理查询。
  3. 回退到 LLM:如果模型的准确率较低,或者 AlloyDB 找不到模型,AlloyDB 会自动回退到使用 LLM。

优化后的函数流程图

准备工作

在使用优化函数之前,请执行以下操作:

  • 使用 psql 或 AlloyDB Studio,以 postgres 用户身份或有权访问数据所在表的用户身份连接到数据库。
  • 验证 google_ml_integration 扩展程序是否已安装,并且版本是否为 1.5.8 或更高版本。

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    extversion
    ------------
    1.5.8
    (1 row)
    
  • 配置 AlloyDB,使其与 Gemini Enterprise Agent Platform 搭配使用。如需了解详情,请参阅将数据库与 Agent Platform 集成。

  • 确保已启用以下数据库标志。如需了解详情,请参阅配置实例的数据库标志。

    • google_ml_integration.enable_model_support
    • google_ml_integration.enable_ai_query_engine
    • google_ml_integration.enable_cost_optimized_ai_functions
  • 为要查询的表生成嵌入。如需了解详情,请参阅为表生成和管理自动嵌入。

  • 请考虑以下事项:

    • 源数据列必须是 TEXT 或 VARCHAR 类型。
    • 为优化后的 AI 函数提供输入的嵌入列必须是 REAL[] 或 VECTOR 类型。
    • 优化后的函数仅在提供 Agent Platform 生成模型的区域可用。如需查看可用区域的列表,请参阅部署和端点。

使用优化函数

如需使用优化函数,请将 PREPARE 和 EXECUTE 语句与 ai.if() 函数搭配使用。以下示例展示了如何使用优化函数:

  1. 创建 restaurant_reviews 表。保存源数据的 review 列的类型为 TEXT,用于查询的 review_embedding 列的类型为 VECTOR(768)。

    CREATE TABLE restaurant_reviews (
        id SERIAL,
        name VARCHAR(64),
        city VARCHAR(64),
        review TEXT,
        review_embedding VECTOR(768)
    );
    
  2. 将 PREPARE 语句与 ai.if() 函数搭配使用,以指明查询必须使用优化函数。此语句会触发模型在后台进行异步训练。

    仅在满足以下条件时,系统才会训练模型:

    • 查询中只有一个 ai.if() 函数。
    • ai.if() 不在子查询中。
    PREPARE positive_reviews_query AS
    SELECT r.name, r.city
    FROM restaurant_reviews r
    WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
    GROUP BY r.name, r.city
    HAVING COUNT(*) > 500;
    
  3. 使用 EXECUTE 语句运行查询。由于 PREPARE 语句特定于当前会话,因此您必须在同一连接上运行 EXECUTE 语句:

    EXECUTE positive_reviews_query;
    
    conn2=> SELECT r.name, r.city
        FROM restaurant_reviews r
        WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
        GROUP BY r.name, r.city
        HAVING COUNT(*) > 500;
    

    如果满足以下任一条件,则不会使用经过训练的代理模型:

    • ai.if() 中引用的内容或嵌入列发生更改。两列必须属于同一个表。
    • 提供给内容列的提示会发生变化。
    • 查询的结构发生变化,导致 query_id 不同。
    • 查询在开始时未达到准确率检查阈值。

    在这些情况下,查询会回退到使用 LLM,并且 AlloyDB 会返回警告。

  4. 可选。如需为整个数据库环境停用准确率验证检查(这是必需的,因为在模型训练期间也会执行准确率检查),请运行以下命令。

    ALTER DATABASE DATABASE_NAME SET google_ml_integration.proxy_models_enable_accuracy_check = off;
    

    将 DATABASE_NAME 替换为您的数据库名称。

重新训练代理模型

如果底层表数据发生重大变化,您可以通过再次运行 PREPARE 语句来重新训练代理模型。重新准备查询会通过发起新的训练请求来替换现有代理模型。

限制

如果您更改了源内容列、嵌入列或提供给 ai.if() 函数的提示,则必须发出新的 PREPARE 语句。AlloyDB 会训练优化后的函数,以近似模拟提示和输入数据的独特组合的行为。

后续步骤