让数据代理会查、会解释、会归因:BigQuery 增强分析 TVF 实战

2026-09-15 29 预计阅读时间: 1 分钟
来源: cloud.google.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

传统 BI 擅长回答“发生了什么”,但当业务追问“为什么变化”“变化从哪天开始”“活动究竟带来了多少增量”时,分析师往往需要在 SQL、统计脚本和外部建模工具之间来回切换。BigQuery 新增的一组增强分析表值函数(Table-Valued Functions,TVF),把变化点检测、关键驱动因素分析、趋势与季节性分解、相关性和因果效应估计直接放进了 SQL。

这项变化的价值不只是少写几段 Python。TVF 返回结构化结果,既能继续参与 SQL 查询,也适合封装成 AI Agent 的分析技能,让代理按照“发现异常—解释原因—评估影响”的路径自动调查数据。

六个函数分别解决什么问题

这组增强分析能力由六个目标明确的函数组成:

函数 分析任务 典型问题
AI.KEY_DRIVERS 找出两个时期或两组数据之间,哪些维度最能解释指标变化 为什么本季度收入突然增长?
AI.CAUSAL_EFFECT 根据反事实基线估算某项行动或事件的净影响 调价带来的收入增量是多少,而不是自然增长多少?
ML.CORRELATION 衡量数值指标之间关系的方向与强度 会话时长是否与客户终身价值相关?
ML.DETECT_CHANGE_POINTS 找到时间序列发生结构性变化的日期或区间 平台延迟从什么时候开始持续恶化?
ML.TREND 从短期波动和噪声中分离长期趋势 过去一年收入的基础走势如何?
ML.SEASONALITY 发现按小时、星期、月份或季度重复的周期 每周哪几天服务器负载最高?

这些函数最值得关注的设计,是输入和输出仍然属于 SQL 世界。结果可以被 WHEREJOIN、CTE 或后续 TVF 消费,而不必先导出 CSV,再启动独立的分析服务。

一条可组合的调查链:何时变化、谁在推动、净增量多少

以公开的 Austin Bikeshare 数据集为例,可以把调查拆成三个连续步骤。

1. 先检测结构性变化

下面的查询可直接放入 BigQuery 控制台运行。它先聚合每日骑行量,再寻找统计意义上的基线变化区间:

WITH daily_trips AS (
  SELECT
    TIMESTAMP_TRUNC(start_time, DAY) AS trip_day,
    COUNT(*) AS total_trips
  FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
  GROUP BY 1
)
SELECT
  begin_timestamp,
  end_timestamp,
  metrics.avg AS avg_daily_trips,
  metrics.min AS min_daily_trips,
  metrics.max AS max_daily_trips,
  metrics.count AS duration_days
FROM ML.DETECT_CHANGE_POINTS(
  (SELECT * FROM daily_trips),
  data_col => 'total_trips',
  timestamp_col => 'trip_day'
);

这个步骤不是找出单日尖峰,而是识别相对于周边模式持续存在的结构性改变。来源案例将一个重要断点定位到 2018 年 2 月,并把它用于后续分析。

2. 再定位推动变化的业务切片

有了断点,可以建立等长的前后窗口,把断点之后标记为关注组、之前标记为参考组,然后检查站点、订阅类型和车辆类型等维度:

WITH daily_segments AS (
  SELECT
    start_station_name,
    end_station_name,
    subscriber_type,
    bike_type,
    1 AS trip_count,
    IF(DATE(start_time) >= DATE '2018-02-11', TRUE, FALSE) AS after_shift
  FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
  WHERE start_time BETWEEN TIMESTAMP '2018-01-12'
                       AND TIMESTAMP '2018-03-13'
)
SELECT
  drivers,
  metric_interest,
  metric_reference,
  difference,
  relative_difference,
  unexpected_difference,
  contribution
FROM AI.KEY_DRIVERS(
  (SELECT * FROM daily_segments),
  metric_col => 'trip_count',
  interest_label_col => 'after_shift',
  dimension_cols => [
    'start_station_name',
    'end_station_name',
    'subscriber_type',
    'bike_type'
  ],
  top_k => 10
);

每一行结果代表一个具体数据切片,而不只是给出“订阅类型很重要”这样的笼统判断。案例中,总骑行量在两个窗口之间增长了 374.7%,增长主要集中于得州大学学生会员,以及以 21st & Speedway @PCL 为终点的行程。这与当时推出的学生免费年费会员合作相吻合。

运行自己的数据时,需要替换三类内容:源表、指标列和候选维度。候选维度不要无节制加入高基数字段,例如用户 ID、订单 ID 或自由文本,否则结果可能过细、成本也会增加。

3. 最后估算活动之外的净增量

“某类会员贡献最大”仍然不等于“活动造成了全部增长”。天气、季节、长期增长和其他市场活动都可能同时影响结果。AI.CAUSAL_EFFECT 会基于干预前数据构建 ARIMA_PLUS 反事实基线,估计如果事件没有发生,指标可能呈现什么走势:

WITH daily_trips AS (
  SELECT
    TIMESTAMP_TRUNC(start_time, DAY) AS trip_day,
    COUNT(*) AS total_trips
  FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
  WHERE start_time BETWEEN TIMESTAMP '2017-08-11'
                       AND TIMESTAMP '2018-04-11'
  GROUP BY 1
)
SELECT *
FROM AI.CAUSAL_EFFECT(
  (SELECT * FROM daily_trips),
  data_col => 'total_trips',
  timestamp_col => 'trip_day',
  intervention_timestamp => TIMESTAMP '2018-02-11 00:00:00',
  output_time_series => TRUE
);

设置 output_time_series => TRUE 适合把实际值和反事实预测画在同一张图上;改成 FALSE,则更适合获取汇总影响。来源案例估算该计划使骑行量高于自然基线约 358%,产生约 89,775 次增量骑行,并给出了 99.9% 的因果效应概率。

这里必须保留统计边界:反事实模型并不会自动消除同期发生的所有混杂事件。若干预日期附近同时上线了促销、扩容或计量规则变更,应补充对照序列、敏感性分析和业务证据,不能把模型输出直接当作实验结论。

为什么这些 TVF 特别适合 AI Agent

数据代理最难的部分通常不是生成一条 SELECT,而是把模糊问题拆成可靠步骤。紧凑、结构化的 TVF 可以被注册成独立工具,并由代理按结果继续规划:

  1. ML.DETECT_CHANGE_POINTS 找到候选断点;
  2. 把断点传给 AI.KEY_DRIVERS,比较前后窗口;
  3. 根据驱动因素生成解释假设;
  4. AI.CAUSAL_EFFECT 估计干预的净影响;
  5. 返回数据表、置信信息和自然语言摘要,而不是只给一句结论。

实践中可以为代理工具定义受控参数,而不是允许模型任意拼接 SQL。例如只开放经过审核的数据集、时间列、指标列和维度白名单,并限制扫描区间与 top_k。这样既能降低查询成本,也能减少 SQL 注入、越权访问和高基数分析带来的风险。

相关性分析同样适合组合。来源中的 Chicago Taxi 示例先用 ML.CORRELATION 找出与司机获得小费关系最强的指标,再用 AI.KEY_DRIVERS 分析地点、支付方式等类别维度。另一个 Iowa 酒类销售示例则串联 ML.TRENDML.SEASONALITY,把长期增长和年度周期拆开解释。

上线前的检查清单

将这些函数接入生产分析或对话式代理时,建议逐项确认:

  • 指标口径稳定:断点可能来自埋点、时区、去重或计算公式变化,而不是业务变化。
  • 时间粒度合理:小时级噪声可能淹没长期趋势,月级聚合又可能隐藏短期冲击。
  • 前后窗口可比:节假日、季节和样本覆盖范围要尽量一致。
  • 维度经过治理:限制敏感字段、高基数字段和可识别个人的信息。
  • 成本有上限:先检查扫描量,再为代理设置数据范围、并发和预算限制。
  • 区分相关与因果ML.CORRELATION 只能描述关系;因果估计也依赖反事实模型及其假设。
  • 保留可审计记录:保存代理使用的 SQL、参数、数据版本与最终解释,方便复核。

BigQuery 增强分析 TVF 的核心意义,是把高级分析从一次性的外部建模任务变成可查询、可组合、可治理的数据能力。对于开发团队,合适的落地顺序不是立刻让 Agent 自主运行所有函数,而是先固化一两条高价值调查链,在人工审核下验证指标和解释,再逐步开放自动编排。


相关推荐