Google Cloud Blog

Synthesize the big picture and analyze trends with BigQuery's AI.AGG function

8.5内容质量
Synthesize the big picture and analyze trends with BigQuery's AI.AGG function

TL;DR · AI 摘要

BigQuery推出AI.AGG函数,通过自然语言指令分析非结构化数据,提升日志分析效率。

核心要点

  • AI.AGG支持在单行SQL中处理非结构化数据,如日志和文档分析
  • 可识别日志中隐藏的内存抖动、时钟漂移等性能问题
  • 结合BigQuery其他AI函数可实现复杂数据分析流水线

结构提纲

按章节快速跳转。

  1. 介绍BigQuery AI.AGG函数的发布背景及核心价值

  2. 通过自然语言指令在SQL中处理非结构化数据的实现原理

  3. 展示如何用AI.AGG识别Spark日志中的隐藏性能问题

  4. AI.AGG与BigQuery现有AI函数的集成方式

  5. 工程团队使用AI.AGG优化自身功能开发的实例

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • BigQuery AI.AGG函数
    • 核心功能
      • 自然语言SQL处理
      • 非结构化数据分析
    • 应用场景
      • 日志分析
      • 性能优化
    • 技术集成
      • BigQuery AI生态

金句 / Highlights

值得收藏与分享的关键句。

#BigQuery#AI#数据分析#SQL
打开原文

深入解析 BigQuery AI.AGG 函数 | Google Cloud 博客

数据分析

用 BigQuery 的 AI.AGG 函数合成全局视图并分析趋势

2026 年 6 月 30 日

##### Thomas Anchor

软件工程师

##### Alicia Williams

开发者倡导者

##### 今天试用 Gemini Enterprise Business Edition

职场 AI 的入口

立即试用

我们最近宣布了 BigQuery AI.AGG() 函数的预览版。通过 AI.AGG(),您可以在单行 SQL 中使用自然语言指令,对数百万行非结构化数据甚至多模态数据进行汇总或合成分析。

虽然 BigQuery 已经提供了强大的 AI 函数来帮助您分析单行数据,但大规模分析非结构化数据需要不同的方法。AI.AGG() 让您可以从日志和文档等非结构化数据中提出问题,例如:

  • 负面产品评论中排名前三的功能请求是什么?
  • 用户最常遇到什么类型的错误?我应该如何开始调查这些问题?
  • 在哪些具体场景中,我们的自动化代理始终无法解决客户问题?

在本文中,我们将深入探讨 AI.AGG() 函数,并查看一些它解锁的用例,包括如何将其与其他 BigQuery 管理的 AI 函数结合使用,实现复杂且智能的数据分析。

使用 AI.AGG() 分析系统日志

AI.AGG() 功能强大性的绝佳例子是分析系统日志。日志消息、警告、错误和堆栈跟踪可能包含对改进服务极为有用的信息,但手动调查它们可能需要大量时间和人力——尤其是在大规模运营并需要审查数千条日志时。

通过 AI.AGG(),您可以轻松同时分析许多日志,对它们进行分组和优先级排序,以决定首先深入研究哪些日志。事实上,我们的 BigQuery 工程团队在开发 AI.AGG() 时就采用了这种方法——使用该函数帮助识别与功能本身输入处理相关的边缘情况!

为了演示这一点,让我们分析 Loghub 提供的 Apache Spark 标准 INFO 日志公共数据集。通常,集群可能会遇到内存抖动、时钟漂移或广播瓶颈等问题,而不会抛出任何 FATAL 错误。您可以使用 AI.AGG() 分析这些看似正常的日志,寻找隐藏的低效问题。您可以使用任何支持的方法(如 UI、CLI 或客户端库)将示例数据文件加载到 BigQuery。以下示例假设您已将日志文件加载到名为 bq_logs_demo 的数据集和名为 spark_logs_unstructured 的表中。

请注意我们在这里如何构建提示。我们明确授权模型说出“一切正常”,这可以防止它编造错误,同时指示它寻找特定的异常:

加载中...

SELECT Component AS spark_component, COUNT(*) AS log_count, AI.AGG( Content, '分析这些 Spark 系统 INFO 日志。提供两句话摘要:第一,描述此组件的正常运行情况。第二,明确识别任何隐藏的低效问题、延迟峰值、重复重试或异常模式。' ) AS performance_analysis FROM bq_logs_demo.spark_logs_structured GROUP BY Component ORDER BY log_count DESC;

在这些结果中,您可以看到 AI.AGG() 成功确认了“正常运行”消息,同时揭示了关键的诊断洞察:

查询结果面板显示AI.AGG()根据日志数据集生成的洞察。

从非结构化文本和图像数据中提取类别

现在,让我们通过BigQuery的公开数据集cymbal_pets(一家虚构的宠物用品商店)来看更多使用案例,展示AI.AGG()的灵活性。该数据集包含商店销售产品的目录,包含产品名称、描述和图片等非结构化数据,是展示AI函数处理非结构化数据能力的绝佳示例。

例如,假设你想对数据集中的产品进行分类。在这种情况下,第一个障碍不是为产品打标签,而是发现产品目录中存在哪些类别。通过AI.AGG(),你可以让模型分析原始产品名称和描述,为你识别出主要类别。

-- 从产品名称和描述中识别产品类别 SELECT AI.AGG( ('Product: ', product_name, ' - Description: ', description), 'What are the major categories of these products?' ) AS category_description FROM bigquery-public-data.cymbal_pets.products;

该查询返回一个简单的纯文本类别列表:

AI.AGG()根据我们的产品数据集确定的类别纯文本结果。

这个初始查询非常适合探索,但简单的纯文本字符串不足以构建可靠的数据管道。要实际标记数据,需要指示AI.AGG()返回结构化格式,如JSON数组。然后,你可以将结构化类别作为参数传递给另一个AI函数AI.CLASSIFY(),为每个产品分配其类别。

以下SQL语句通过一个脚本完成所有步骤:

-- 1. 声明一个变量来存储类别数组 DECLARE generated_labels ARRAY<STRING>;

-- 2. 创建存储结果的数据库 CREATE SCHEMA IF NOT EXISTS categorized_cymbal_pets;

-- 3. 使用AI.AGG生成JSON字符串并提取到变量中 SET generated_labels = ( SELECT JSON_VALUE_ARRAY( AI.AGG( ('Product: ', product_name, ' - Description: ', description), 'Identify the major product categories. Return exactly one valid JSON array of strings. Do not include markdown code blocks, backticks, or conversational text.' ) ) FROM bigquery-public-data.cymbal_pets.products );

-- 4. 将变量直接传递给AI.CLASSIFY CREATE OR REPLACE TABLE categorized_cymbal_pets.categorized_products AS ( SELECT product_name, description, AI.CLASSIFY( ('Product: ', product_name, ' - Description: ', description), generated_labels ) AS assigned_category FROM bigquery-public-data.cymbal_pets.products );

现在你可以查看包含assigned_category字段的结果表:

categorized_products表的预览,包含AI.AGG()和AI.CLASSIFY()创建的新assigned_category列。

如果仔细查看中间表,会注意到结构化类别与初始纯文本结果略有不同。这有两个原因:首先,大型语言模型(LLMs)是非确定性的,这意味着它们对相同提示的响应不总是完全相同。其次,提示已调整以适应新的输出结构。

如提示所请求的,AI.AGG()将返回的产品类别结构化为JSON格式。

现在表格已按类别标记,您可以按类别分组进行传统的SQL聚合操作,或使用AI.AGG()分别考虑每个类别。

例如,以下查询可以同时获取传统指标(如行数)和特定分组产品的合成AI摘要:

-- 按新分配的类别合成洞察 SELECT assigned_category, COUNT(*) AS item_count, AI.AGG( ('Product: ', product_name, ' - Description: ', description), 'Write a concise, one-sentence summary describing the common characteristics or purpose of the products in this category.' ) AS category_summary FROM categorized_cymbal_pets.categorized_products GROUP BY assigned_category ORDER BY item_count DESC;

显示使用AI.AGG()与传统SQL方法结合分析的查询结果。

非结构化数据不限于文本。由于AI.AGG()原生支持多模态输入,您可以直接从图像文件中返回聚合洞察。

cymbal_pets Google Cloud项目还包含一个装满产品照片的Cloud Storage存储桶。通过创建外部对象表,您可以将图像URI直接传递给AI.AGG(),并要求模型总结整个集合的视觉内容。

-- 总结对象表中图像的内容 SELECT AI.AGG( STRUCT(OBJ.GET_ACCESS_URL(ref, 'r')), 'What are the major categories of these images?' ) AS category_description FROM bigquery-public-data.cymbal_pets.product_images;

显示AI.AGG()通过分析Google Cloud Storage中的产品图像来呈现产品类别的查询结果。

AI.AGG()的工作原理和最佳实践

要在自己的环境中有效使用AI.AGG(),了解其幕后处理数据的方式很有帮助。以下是关于上下文窗口、错误处理和优化管道的关键信息。

  1. 上下文窗口和多级聚合

大型语言模型具有特定的上下文窗口,处理大量输入时可能遇到困难。AI.AGG()通过自动将输入行分成批次、聚合这些批次,然后将这些批次的结果聚合为最终答案来解决这个问题。这意味着在传递大量行时,您无需手动管理上下文窗口。请注意,AI.AGG()不会将数据行拆分到不同批次中,因此请确保每行数据都小于上下文窗口,以避免行被跳过。使用更多较小的行可以为AI.AGG()提供更灵活的批次处理方式。

  1. 多级聚合中的令牌使用

由于AI.AGG()使用多级聚合结构,发送给模型的总输入令牌数可能高于原始表中的原始令牌数(具体取决于需要多少轮聚合)。作为最佳实践,建议在传递给AI.AGG()之前,使用LIMIT或上游预过滤来减少输入令牌数量。

  1. 指定模型端点

如果不指定模型端点,AI.AGG()将默认使用最新模型。但对于生产管道,通常需要显式控制:

  • 短名称:您可以使用短名称端点(例如gemini-2.5-flash),在这种情况下,AI.AGG()将在查询执行区域使用该模型:

AI.AGG( input_data, instructions => 'Your instructions here.', endpoint => 'gemini-2.5-flash' )

  • 完全限定名称:如果查询执行区域不支持您所需的模型,或者您更倾向于使用全局或跨区域端点,请提供完全限定的模型名称:

AI.AGG( input_data, instructions => '您的指令内容', endpoint => 'https://aiplatform.googleapis.com/v1/projects/[YOUR_PROJECT]/locations/global/publishers/google/models/gemini-3.5-flash' )

  1. 输入和输出模态
  • 输入:AI.AGG() 支持文本(通过字符串或文本文件引用)和图像数据。它也支持这些类型的数组,但请注意在已知问题文档中查看有关图像数组的特殊情况说明。
  • 输出:该函数始终返回字符串。虽然您可以在指令中提示模型将输出格式化为 JSON 或 Markdown,但请注意数据库引擎不会严格强制执行此格式。目前不支持多模态输出(例如生成图像)。
  1. 对 NULL 值的处理

AI.AGG() 会自动跳过 NULL 输入行而无需处理它们。然而,在传递结构化数据时需要特别小心。与 BigQuery 的其他 AI 函数类似,AI.AGG() 会像标准 CONCAT() 函数一样连接 STRUCT 字段。这意味着如果您的 STRUCT 中有任何一个字段为 NULL,整行将被视为 NULL 并被跳过。

让我们重新审视第一个分类查询。如果产品表中多行缺少描述字段会发生什么?由于 NULL 连接规则,这些行将完全被静默地从分析中删除。我们可以使用 IFNULL() 提供一个备用字符串,确保即使描述字段为空,也能保证每个产品都被考虑进去:

-- 通过产品名称和(可选)描述识别产品类别 SELECT AI.AGG( ('Product: ', product_name, ' - Description: ', IFNULL(description, 'No description provided')), 'What are the major categories of these products?' ) AS category_description FROM bigquery-public-data.cymbal_pets.products;

  1. 错误处理

如果 AI.AGG() 接收到无效输入,或在 LLM 处理过程中遇到错误,它将尝试提供部分结果。包含无效输入或被 LLM 模型拒绝的行不会被计入最终结果。

您可以通过检查 BigQuery 作业统计信息,了解确切有多少行未能处理,这与查看 AI.IF() 等标量管理 AI 函数时的方式完全相同。

显示 Gen AI 函数错误详细信息的示例。

立即尝试!

以上只是 AI.AGG() 帮助分析非结构化数据的一些示例。AI.AGG() 函数目前在 BigQuery 处于预览阶段,因此所有 BigQuery 用户均可使用。请在您自己的用例中尝试使用它!

您可能还对 BigQuery 的其他管理 AI 函数感兴趣,包括 AI.CLASSIFY()、AI.IF() 和 AI.SCORE(),以及通用函数如 AI.GENERATE()。我们期待看到您使用这些功能构建的成果。

发布在

  • 数据分析
  • AI 与机器学习
  • BigQuery