通过模型蒸馏优化 AI 函数费用
本文档介绍了如何在 BigQuery 中使用 托管 AI
函数的优化模式。与标准的逐行 LLM 推理相比,您可以使用优化模式处理包含数千甚至数十亿行的大规模数据集,同时显著减少大语言模型 (LLM) 词元消耗和查询延迟时间。此优化仅适用于 AI.IF 和 AI.CLASSIFY 函数。
为了更好地了解词元消耗情况,您可以在控制台中查看查询使用的词元数。Google Cloud 如需在运行查询之前估算此用量,请使用
AI.COUNT_TOKENS 函数。
以下示例演示了如何使用 AI.IF 函数
和优化模式来识别有关自然灾害的新闻报道,并使用 text-embedding-005
作为嵌入模型:
SELECT
title,
body,
AI.IF(
('The following news story is about a natural disaster: ', body),
embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
-- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
optimization_mode => 'MINIMIZE_COST'
) AS is_natural_disaster
FROM
`bigquery-public-data.bbc_news.fulltext`;
optimization_mode => 'MINIMIZE_COST' 实参可启用优化
模式。这是提供嵌入时的默认设置,因此您可以省略此实参。
在此示例中,嵌入是即时生成的。在实践中,我们 建议您实现嵌入,以便重复使用。
优化模式的工作原理
托管 AI 函数 AI.IF 和 AI.CLASSIFY 通常会针对数据集中的每一行调用
远程 LLM。当您使用优化模式时,BigQuery 会在查询执行期间自动训练轻量级蒸馏模型。
该过程的工作原理如下:

- 抽样和标签:BigQuery 会选择一小部分 代表性样本数据,并调用 Gemini 来提供 标签。
- 蒸馏模型训练:使用 LLM 标签和数据嵌入作为特征,及时训练本地蒸馏模型。
- 质量检查:BigQuery 会根据 LLM 的结果评估蒸馏模型的 准确率。默认情况下,如果蒸馏模型未能达到所需的质量阈值,查询将失败,并显示一条错误消息,说明模型被舍弃的原因。如果模型的质量可接受,BigQuery 仍可能会针对特定行回退到远程 LLM,以保持质量一致性,或者针对缺少有效嵌入的行回退到远程 LLM。
- 推理:蒸馏模型会处理大部分行, 从而显著减少 Gemini 调用次数。
限制
优化模式具有以下限制:
- 最少行数:AI 函数的输入必须包含 大约 3,000 行,以确保有足够的数据用于模型训练。
- 数据类型:对于引用多个列的提示,只有字符串 列支持优化。
- 多标签分类:优化模式不支持使用
output_mode => 'multi'的AI.CLASSIFY。 - 函数支持:只有
AI.IF和AI.CLASSIFY函数支持 优化模式;但是,如果将优化模式与AI.CLASSIFY搭配使用,当蒸馏模型质量不足时,查询可能会失败。 - 错误率:优化模式不支持
max_error_ratio实参。
准备工作
如需获得在 BigQuery 中运行托管 AI 函数所需的权限,请参阅为调用 Gemini Enterprise Agent Platform LLM 的生成式 AI 函数设置权限。
选择嵌入模型
如需使用优化模式,您必须计算 嵌入数据的嵌入,并将其提供给 AI 函数。如需让输入列具有关联的嵌入,所有行都必须具有一致的嵌入维度,并且由同一嵌入模型生成。
为了获得最佳的费用-质量和可伸缩性,我们建议您使用嵌入模型(例如
text-embedding-005或 Gemini 嵌入
,用于英语或多语言任务)计算
您数据的嵌入。对于多模态数据(文本和图片),请使用多模态嵌入模型,例如
multimodalembedding@001。
生成嵌入
您可以使用由 BigQuery 管理的自主生成功能计算数据的嵌入,也可以手动创建嵌入列。
以下部分介绍了如何将这两种方法与 AI.CLASSIFY 和 AI.IF 函数搭配使用。
自主嵌入生成
如果您使用 自主嵌入生成功能,
BigQuery 会在调用 AI.IF 或
AI.CLASSIFY 时自动使用嵌入。这是推荐的方法,但每张表只能有一个嵌入列。
以下示例使用 text-embedding-005 作为嵌入模型,创建一个具有自主生成的嵌入列的表,然后使用 AI.CLASSIFY 函数对数据进行分类:
-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
title STRING,
body STRING,
body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS