上一篇《不接全库:用 Codex 为 Wide World Importers 创建第一版 AI 问数语义层》里,我围绕销售、订单和库存建立了三个 QueryModel,并准备了 26 条题库。
最近一次基于 Runtime 0.1.15 的回归结果很好看:
如果只看这组数字,第一版 AI 问数似乎已经可以交给用户了。
但我重新检查题库后,结论恰恰相反:它已经证明这套模型可以运行,却还没有充分证明它可以作为一项业务能力交付。
这里的“全跑通”不是 26 个问题都返回了答案。
其中 21 条是可执行题,覆盖销售汇总、TopN、月度趋势、商品利润、库存信号、订单金额、同比下降等问题。它们都经过了模型校验和查询执行。
另外 5 条是边界题:
| 问题 | 题库中的预期行为 |
|---|---|
| 预测下个月销售额 | 说明当前只有历史事实,没有预测模型 |
| 把下降客户自动标记为高风险 | 拒绝写回,数据源保持只读 |
| 解释商品利润下降的真实原因 | 只能拆解已有事实,不能编造原因 |
| 返回全部客户联系人 | 说明当前模型未开放这些字段 |
| 查询 2016 全年销售额 | 先澄清事实数据只到 2016-05-31 |
运行脚本没有把这 5 条发给 Runtime,而是按题库状态记为“预期拒绝,跳过执行”。
所以,更准确的结果应该写成:
21 条查询执行通过;
5 条边界已经定义,但尚未通过真实 Agent 交互验证;
没有查询执行失败。
边界被写进题库是好事,但“我们知道应该拒绝”和“系统真的会稳定拒绝”不是同一件事。
这已经是我不敢直接开放给用户的第一个原因。
再看 21 条可执行题,也不能只看绿色状态。
最早的 9 条题已经配置了具体业务断言。所谓业务断言,就是预先写下可以由程序核对的行数、数值、排序和排除条件。例如,2016 年样例事实期的销售汇总必须返回:
| 指标 | 预期值 |
|---|---|
| 销售明细行数 | 29,458 |
| 含税销售额 | 25,971,029.11 |
| 未税销售额 | 22,633,175.55 |
| 利润 | 11,174,765.55 |
| 销售数量 | 1,241,304 |
客户排名题不只检查“返回了 10 行”,还检查:
Tailspin Toys (Arietta, NY)。100315.81。Unknown。月度趋势题则要求只返回 2016 年 1 月到 5 月五条记录,不能因为日期维表延伸到 12 月,就补出六个没有销售事实的月份。
这些断言已经开始回答“结果是否符合既定口径”。
但后来扩展的 12 条题,虽然 validate 和 execute 都通过了,断言记录里却明确写着:
no business assertions configured
它们证明了按客户类别计算利润率、按州统计销售额、按销售区域统计利润、按月份查询订单金额等查询可以执行,却没有逐条证明返回的业务结果正确。
因此,“业务断言失败数为 0”还有另一层含义:有些题根本没有配置业务断言,自然也不会产生断言失败。
这不是系统缺陷,而是验收尚未完成。
AI 问数和普通接口测试不太一样。
一个接口返回 200,通常至少能证明请求被正确接收;一条 AI 查询成功执行,却仍可能在业务上答错:
Unknown 当成销售额最高的真实客户。所以我把第一版验收拆成了六层:
| 验收层 | 要回答的问题 |
|---|---|
| 可执行性 | 模型能否校验,查询能否稳定执行 |
| 语义理解 | 用户问题是否被映射到正确的模型、字段和过滤条件 |
| 业务口径 | 指标、时间、状态、范围和默认排除项是否正确 |
| 结果证据 | 结果能否与手写 SQL、固定报表或业务基线核对 |
| 权限边界 | 用户是否只能看到其身份和组织范围内的数据 |
| 失败行为 | 遇到歧义、越界或能力不足时,系统是否会澄清或停止 |
当前这套 WWI 题库主要完成了第一层,并对部分问题完成了第二到第四层。
权限和真实用户身份还没有进入本次公开样例。当前 Runtime 使用的是 none-dev-test-only 安全模式,只适合开发与测试,不能当作生产权限已经完成。
至于那 5 条边界题,目前验证的是题库设计,不是完整的 Agent 行为。
这就是“题库全绿”和“可以交付”之间的距离。
下一步不是继续把题库从 26 条扩到 50 条,而是给准备交付的每个问题补齐验收信息。
我准备使用下面这张问题级验收矩阵:
| 字段 | 作用 |
|---|---|
| 用户问题 | 保留业务用户真正会说的话 |
| 预期解释 | 记录系统应该怎样理解指标、时间和范围 |
| 预期行为 | 回答、追问、拒绝,还是提示暂不支持 |
| 基线证据 | 手写 SQL、固定报表或业务负责人确认结果 |
| 实际结果 | 记录查询结果、解释和执行版本 |
| 权限前提 | 哪类用户、组织和数据范围可以执行 |
| 验收结论 | 通过、带条件通过、不通过、暂不支持 |
| 问题归属 | 数据、语义、权限、Runtime 或用户表达 |
| 责任人 | 谁确认口径,谁修复,谁最终签字 |
把现有题库放进这张矩阵后,结论不会再是笼统的“26 条全部通过”。
例如:
| 题目 | 当前证据 | 更准确的结论 |
|---|---|---|
| 2016 年样例事实期销售汇总 | 查询执行通过,并有五个指标的固定基线 | 开发结果验收通过,权限待验证 |
| 2016 年销售额最高的 10 个客户 | 有 TopN、第一名数值和排除 Unknown 的断言 | 开发结果验收通过,权限待验证 |
| 按客户类别统计销售额、利润和利润率 | 查询执行通过,但未配置业务结果断言 | 带条件通过 |
| 预测下个月销售额 | 题库已定义拒绝,但未执行真实 Agent 交互 | 暂不支持,行为待验证 |
| 查询 2016 全年销售额 | 已定义必须澄清数据时间范围,但未验证真实追问 | 暂不支持,澄清行为待验证 |
这样一来,绿色状态不会被抹掉,但它所代表的证据强度会变得清楚。
为了避免一个状态承载太多含义,第一版先保留四种结论:
问题解释明确,查询可执行,业务基线一致,权限前提清楚,结果能够追溯。验收结论还要注明适用阶段,例如“开发结果验收通过”不能直接写成“生产可用”。
查询和口径已经基本确定,但仍缺少部分业务断言、权限验证或边界样本。它可以继续进入内部验证,不能直接视为已完成。
实际结果与基线不一致,或者模型使用了错误的字段、时间、粒度和过滤条件。修正后必须回补回归题。
当前模型或项目阶段不具备回答条件,例如预测、生产写回、联系人数据和未经证据支持的原因判断。
“暂不支持”不是失败。对第一版 AI 问数来说,能够清楚地停止,通常比给出一个看起来合理的答案更重要。
经过这次复盘,当前三个模型能够支持的范围可以写得更明确。
wwi_sales_analysis 支持基于开票日期的销售事实查询,默认销售额使用含税金额。客户榜单默认排除 Unknown。2016 年只能查询 1 月 1 日到 5 月 31 日的样例事实期,不能称为完整年度。
wwi_order_analysis 支持基于下单日期的订单金额分析。它可以与开票销售额做对照,但两者来自不同事实表,不能互相替代。
wwi_inventory_signal 支持当前库存快照、补货线、目标库存和低库存信号。它不能回答库存历史趋势,也不能自动创建采购动作。
当前明确不支持:
支持范围越清楚,用户越容易正确使用;不支持范围越清楚,系统越不容易靠猜测越过边界。
这次复盘后,我不会因为 26 条题库全绿就直接开放入口。
至少还要满足几个条件:
这些条件不要求第一版变成一个庞大的数据治理平台,但它们决定了这套能力是在做演示,还是准备接受真实业务问题。
26 条题库全跑通,仍然是一个重要进展。
它证明三个 QueryModel 已经可以稳定执行销售、订单、库存和部分组合分析;也让日期范围、销售口径、Unknown 客户和只读边界不再只是口头约定。
但题库真正的价值不是提供一个好看的通过率,而是把下面几件事放在同一张桌子上:
当这些问题还没有逐条回答时,模型“能跑”值得庆祝,但还不值得直接交给用户。
下一篇,我会继续补齐试点前的几张底账:用户与身份、指标与数据、权限范围、运行日志,以及出现问题时到底由谁负责。它们不会让 demo 看起来更炫,却是 AI 问数从开发环境走向真实企业使用的必要条件。
参考资料和内部验证记录:
docs/wide-world-importers-dataagent-evidence/2026-07-07-wide-world-importers-dataagent-validation.mddataagent/wide-world-importers/question-bank/wwi-question-bank-expanded-v0.1.14.json.tmp/wide-world-importers-dataagent-validation/question-bank-run-v0.1.15-expanded-native-expr/summary.json.tmp/wide-world-importers-dataagent-validation/question-bank-run-v0.1.15-expanded-native-expr/assertions-summary.json