Data Agent:SQL 能跑通,距离答案可信还有多远
用广告行为分析示例,拆解查询权限、语义契约、扫描预算和结果校验,避免把 Text-to-SQL 直接当成数据分析。
Read in English →工程学习与设计笔记。示例使用合成场景;适用版本与参考资料见正文。
用户问“昨天转化率为什么下降”,Data Agent 生成一条 SQL 并返回下降 8%。这还不能算完成任务:分母是点击还是曝光?“昨天”采用哪个时区?转化按发生日还是点击归因日统计?数据是否已经补齐?
可信的 Data Agent 需要同时满足三件事:能访问的数据正确、指标定义正确、结论能回到具体证据。模型只是查询链路中的一个组件。
先形成查询契约
对模糊问题,先读取经过维护的指标目录,再生成结构化契约。一个演示契约可以是:
metric: attributed_order_cvr_v2
grain: campaign_id, business_date
numerator: 去重归因订单数
denominator: 合法点击数
date_basis: 点击归因日
timezone: Asia/Shanghai
window: 2026-11-05 至 2026-11-06
freshness_requirement: 分区完成标记为 ready
这个定义下,转化率不一定能简单解释为“点击用户下单概率”,因为一个点击可能对应多笔订单。若业务需要用户概率口径,就要改成去重用户分子和匹配的用户分母。Agent 必须沿用已确认的指标定义,不能为了 SQL 好写而悄悄更换分母。
若用户无权查看某些维度,契约中就不应出现这些字段。授权范围不能靠提示词里的“不要看”保证。
只读需要落实到数据库和工具层
第一层是身份与数据权限:使用任务对应的受限身份、授权视图和必要的行列限制。AWS Lake Formation 提供行、列和单元格级过滤能力,但具体引擎与数据类型支持有约束,需要按实际集成验证。Lake Formation 数据过滤 。
第二层是 SQL 网关:解析完整语法树,只允许支持的单条查询和白名单函数,递归检查 CTE、子查询、表及列。仅判断字符串以 SELECT 开头不够;数据库方言可能允许输出文件、调用有副作用的函数,或者访问不该开放的系统对象。网关规则失败时返回结构化原因,让模型有限次数修正。
第三层是资源预算:限制时间范围、并发、运行时长、返回行数和扫描量。LIMIT 100 通常只限制结果行数,无法保证少扫描。Athena 的单查询扫描限制可取消超限查询;工作组累计阈值主要触发告警,不能误认为天然具有硬停止语义。Athena 用量控制
。
只读指不修改业务源数据,也不代表没有副作用:查询会产生费用、审计日志和结果文件。结果存储仍需要独立权限和生命周期管理。
让结果携带出处
对两个不同粒度的事实表直接 join,很容易把指标放大。以下伪 SQL 先各自汇总到一致粒度,再合并,前提是订单已经完成归因和去重:
WITH clicks AS (
SELECT campaign_id, attribution_date, COUNT(*) AS click_count
FROM approved_valid_clicks
WHERE attribution_date = :day
GROUP BY campaign_id, attribution_date
), orders AS (
SELECT campaign_id, attribution_date,
COUNT(DISTINCT order_id) AS order_count
FROM approved_attributed_orders
WHERE attribution_date = :day
GROUP BY campaign_id, attribution_date
)
SELECT c.campaign_id, c.click_count,
COALESCE(o.order_count, 0) AS order_count,
1.0 * COALESCE(o.order_count, 0) / NULLIF(c.click_count, 0) AS cvr
FROM clicks c
LEFT JOIN orders o
ON c.campaign_id = o.campaign_id
AND c.attribution_date = o.attribution_date;
这里使用 left join 是为了保留零转化的点击群体。但如果出现“有归因订单、没有点击”的键,会被排除,因此还需要单独做 anti join 数据质量检查。SQL 返回结果前应携带查询 ID、SQL 哈希、参数、指标版本、数据更新时间、行数和扫描量。报告中的数字引用该查询 ID,才能把结论追回实际计算。
解释变化前先排除口径变化
校验顺序可以是:分区是否完整、基础量是否与可信报表一致、join 是否膨胀、去重键是否稳定、维度映射是否变化,然后再看媒体或广告计划分组。总转化率是总订单除以总点击,不是各组转化率的简单平均。即便每个组转化率没下降,流量向低转化组迁移,也可能使整体下降。
把“某组贡献了大部分下降”称为结构分解结果;没有实验或其他识别条件,不能直接说这个组造成了下降。数据不足时,返回缺失证据和下一条查询,比生成一个确定但不可验证的原因更有帮助。
验收样例至少覆盖零分母、迟到分区、重复订单、跨时区边界、无权限字段和超大扫描。分别记录数值正确率、越权拦截结果、口径一致率、不可回答时的正确退出率。评测应比较结果集合与容差,不要求 SQL 文本一模一样,因为合法写法可能很多。
参考资料
- AWS Lake Formation:Data filtering and cell-level security ,授权数据范围的实现能力及限制入口。
- Amazon Athena:Data usage controls ,单查询取消与工作组告警的区别。
- Anthropic:Demystifying evals for AI agents ,以环境结果而非答案口吻验证任务是否完成。