日期:2026-10-19。正文:第十章。先验证请求中的临时计算,再在账单 QM 中新增常用指标 averageAmount;业务数据不变。
首次调用 capabilities 时 Runtime 未运行,CLI 返回 transport error / WinError 10061,stdout 为空;原始 stderr 和失败命令已保留。采集辅助脚本随后补充空 stdout 的明确报错处理,不将连接失败误报成模型或 JSON 语法问题。
确认 18067 无监听后,按现有发行脚本恢复本教学服务,使用原 runtime/work,不重新初始化数据源或样例。启动记录见 launcher-start.json。当次新 PID 为 86344;wait-ready 第四次探测成功。原命名空间绑定、数据源和账单模型恢复可用。随后按用户要求新增固定指标,过程见下节,无须再次重启服务。
http://127.0.0.1:18067;Namespace:chinook;命名数据源:chinook-sqlite;查询模型:ChinookInvoiceQueryModel。foggy-semantic-query Skill。能力返回 engine=java、runtimeApiVersion=foggy-runtime-api/v1、schemaVersion=2026-06-06、securityMode=none-dev-test-only。lab/data/Chinook_Sqlite.sqlite;模型目录为 lab/models;Console/FAP 仍关闭。模型描述和查询匿名执行,本轮没有提供或验证业务身份。TM 已提供 invoiceAmount、invoiceId,只修改 ChinookInvoiceQueryModel.qm,在“账单指标”分组增加 averageAmount:formula: 'sum(invoiceAmount) / nullif(count(invoiceId), 0)',类型为 MONEY,说明当前筛选与分组范围、空期间和原始单位。
查询前完成以下操作,公开 CLI 响应保存为 evidence/chapter-10/*-fixed-model-*.json:
chinook-teaching Bundle、表结构及原查询元数据。averageAmount 的 predefined=true、calculated=true、aggregatable=false,用法为 predefined_formula,提示直接在 columns 中引用,不要在 calculatedFields 重定义。为避免名称冲突,临时计算改名为 temporaryAverage,公式不变。修改前的八用例清单、基线和验收保存在 query-manifest-before-fixed.json、baseline-before-fixed.json、acceptance-before-fixed.json;原执行响应仍保留。旧 QM 保存为 ChinookInvoiceQueryModel-before.qm,第八章源码链接指向该章版本的独立快照,避免后续指标混入前文。
完整请求位于 queries/chapter-10,每题对应的校验、执行响应见 query-manifest.json。命令日志按执行时点保存为 *-commands.json,响应未覆盖。固定指标加载后,完整复跑 11 个请求,均校验、执行通过。
| 请求 | 结果与检查点 |
|---|---|
01-totals-and-counts.json |
SUM 金额 477.53;COUNT 账单 83;COUNT_DISTINCT 客户 47,区别于客户表 59 人 |
02-average.json |
calculatedFields 定义 temporaryAverage,公式为 sum(invoiceAmount) / nullif(count(invoiceId), 0),均额 5.753373493975904 |
03-country-share.json |
20 个有账单国家;ratio_to_total(totalAmount) 使用已选聚合别名,完整分母 477.53、比例合计 1 |
04-country-average.json |
每个国家的总额、张数与均额逐项核对;20 个国家均额的简单平均为 5.84317142857…,不同于整体 5.753373… |
05-share-two-countries.json |
在 slice 中限定 USA / Canada,分母 170.55,比例分别为 0.7503957783641161 / 0.2496042216358839 |
06-share-top-three.json |
原全年请求仅 limit 改为 3,前三项占比仍按全年总额计算,与完整结果前 3 行一致。分页明确还有更多行,不将它标成完整国家结果 |
07-empty-average.json |
1990 年无记录,实际返回 items: [{"billCount": 0}],SUM 和均额的空值字段未序列化;不能说均额为 0 |
08-native-aggregates.json |
原生 AVG 与计算均额一致;MIN 为 0.99,MAX 为 23.86 |
09-predefined-average.json |
columns 只选 averageAmount,不传公式,返回 5.753373493975904,与临时计算一致 |
10-predefined-country-average.json |
按账单国家分组,20 个固定指标均额与临时计算及原始行核算一致 |
11-predefined-empty-average.json |
空期间返回账单数 0,固定均额字段缺失,与临时计算一致 |
COUNT_DISTINCT、NULLIF、ratio_to_total 及 QM 预定义聚合公式均经 Runtime 实际验证。temporaryAverage、amountShare 属于本次 payload;averageAmount 属于 QM,不是数据库物理列。
limit: 2 用于整体汇总请求的输出上限,实际一行;它不限制参与聚合的原始账单。本版本满页时会给可能有下一页的提示,Top 3 明确允许部分结果,其余用例检查无后续页。
verify-chapter-10.py只读读取原始 Invoice / Customer 行,通过集合去重、字典分组、Decimal 累计和相除,核对计数、临时与固定均额、20 个国家的金额及张数、两种占比分母、Top 3 稳定性和无账单情形。比例与均额的数值误差容许值为 1E-12,不是拿显示两位小数掩盖计算差异。
model-evolution.json记录修改前后哈希和模型校验、describe 响应路径。修改前四文件与第八章验收一致,修改后仅账单 QM 改变,其余三个文件保持原哈希;Chinook 原件与副本仍匹配固定 SHA256。第九章核对脚本已兼容这一已验收模型增量,本轮未重新执行第九章查询。
结果:baseline.json、acceptance.json。通过范围为本地模型增量及 11 个结构化查询;独立自然语言提示词、两路线正确性对比、Console/FAP 与生产权限均未验证。“减少推理复杂度”指请求不再重复组织公式,没有据此声称准确率、Token 或耗时已经量化改善。
服务关闭时先按 lab 的现有启动说明恢复,并检查 wait-ready。模型就绪后,在 lab 目录运行:
python -X utf8 .\checks\collect-chapter-10.py
python -X utf8 .\checks\verify-chapter-10.py
采集入口复跑 11 个查询,并实时获取能力、绑定、连接与模型说明;查询逐条先校验后执行,不恢复或重建模型。复跑前应已加载包含 averageAmount 的当前 QM;入口不会运行历史 SQL 对照脚本。