问答部分的评测题库、每次运行的完整输出与复现脚本。结论与解读见
docs/verification.md 与 docs/decisions/03-intent.md。
换模型、改训练、调采样参数之前,先跑一次并存档。 训练之后要回答”变好了还是变差了”, 只能靠训练之前留下的数字——换掉模型的那一刻,旧模型在旧题库上的表现就不可复现了。 存的是完整输出而不是摘要:回归往往只体现在个别题上。
| 项 | 值 |
|---|---|
| 模型 | qwen3.5:4b(4.7B 参数,Q4_K_M 量化,3.39 GB) |
| 服务 | 本地 Ollama |
| temperature | 0.3 |
| num_predict | 160 |
| 思考模式 | 关 |
| 运行组合 | 与 run_all_界面加网关.bat 相同:模拟运行时 + 语言模型 + 轮询循环 |
同一个模型换个温度就是另一组数,所以配置与分数一起记。
| 文件 | 内容 |
|---|---|
问答基线_*.txt |
87 句拟合题库的完整输出(scripts/assistant_benchmark.py),三个日期 |
留出题库_20260914.json、留出实验* |
148 句留出题库、规则与模型分别分类的结果 |
heldout_set.json、exp_results.json |
留出实验的中间数据 |
噪声与引导实验* |
32 句噪声包裹、错误前提、注入、引导性指令 |
复合句组合实验*、compound_pairs_failures.json |
87 句两两拼成复合句的结果与失败明细 |
边界题库_20260925.json、边界实验* |
75 句能力之外的问法;13:51 为修复前、14:07 为修复后、15:11 为补”去年”后按最新代码重跑的逐句记录(在线演示的问答页用的是 15:11) |
约束展示实录_*.json |
录下的真实问答,含每次改写与出口检查判定。展示用,不是统计样本;浏览器控制台的问答回放用的就是它 |
实时流程录制_*.json |
每题的回答步骤(网关推送的 assistant_step 消息,保留原始耗时),供浏览器控制台按原始节奏重演”一句回答是怎么来的”。同样只作展示,见下方”实时流程录制” |
并行裁决推演_20261001_1607_qwen3.5-4b.json |
342 句上”提问也并行、分歧按模型”的离线推演,含模型原始回复;结论是不做,见 docs/decisions/03-intent.md。--replay 可只重算判分(会重写文件里的计时字段) |
exp_*.py |
复现脚本 |
| 指标 | 含义 | 训练能改善吗 |
|---|---|---|
| 规则命中率 | 压根没用到模型的比例 | 不能,这靠改关键词表 |
| 模型分类成功率 | 规则落空的题里模型分对的比例 | 能,这是训练的主要目标 |
| 改写采纳率 | 模型措辞通过出口检查的比例 | 能,但被拒不等于缺陷,是检查在干活 |
不合成一个总分。答错时先查关键词表再动模型:首次运行的八处失败里有五处是规则缺词, 补词把规则命中率从 69% 提到 78%,这是怎么调提示词都做不到的。
84 / 87 = 96.6%。按类别:提问 54/57,指令 22/22,范围外 8/8。模型客户端请求 63 次,超时 0、失败 0 (超时数一旦非零,分数反映的就是机器负载而不是模型能力)。
未通过的 3 条同属一类:”那你开开呗”“打开”“关了吧”期望反问”开哪个”,实际直接判成了开关风扇。 这是意图规则的重叠:开关词表收录”开”之后,裸开关句在进入反问分支前就被判成了指令。
这个数只说明规则没退化:词表是照着这批题补的。
用模板展开((a|b) 多选一、[x] 可选),固定种子 20260914,剔除拟合题库里的原句。
范围内 134 句、范围外 14 句,覆盖 12 个标签与 3 个通道。规定不许照着它补词表,
一旦照着补,它就变成第二个拟合题库。
| 规则 | 模型直接分类 | |
|---|---|---|
| 范围内正确 | 111 / 134 = 82.8% | 122 / 134 = 91.0% |
| 范围内规则答错 | 18 | — |
| 答错且执行成错误指令 | 0(修复前 1) | 0 |
| 范围外被误接 | 5 / 14 | 1 / 14 |
规则答错分三类:带报警词就判成”是否超标”(”温度报警线是多少”本是问阈值);认不出统计词时退回当前读数 (”最潮的时候湿度多少”);字面撞词(”空调温度调到 26 度”“明天温度多少”被当成问读数)。 都没有副作用:数字仍是真实读数,答案写明了答的是哪类问题。
另测了用 JSON Schema 约束模型输出:快一倍多(中位 1.84 s 对 4.06 s),准确率没有提升, 还多出一次错误执行(”空调温度调到 26 度”→ 改通风阈值)——强迫模型从枚举里挑一个,它就会挑。不采用。
局限:题是本项目自己用模板写的,不等于真人问法;个别题的标注有争议;模型部分每种方式只跑一次。
32 句手写题,每句跑三遍:只过规则、模型直接分类、真实完整管线。
| 指标 | 结果 |
|---|---|
| 回答复述了用户编造的数字 | 0 / 32 |
| 注入要求得逞 | 0 / 5 |
| 被错误前提带偏结论 | 0 / 8 |
| 引导性提问被执行成指令 | 5 / 7 → 加征询语气守卫后 0 / 7 |
“能不能”刻意没有收进征询词——”能开风扇不”是真实用户说过的命令。
75 句系统答不了、也不该照做的问法,十一类。是否动了设备只看通风设置前后的快照。
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 不该执行却执行了 | 6 | 0 |
| 编造数字 / 崩溃 / 合法指令没执行 | 0 / 0 / 0 | 0 / 0 / 0 |
| 问没有的传感器却答了某通道读数 | 2 | 2(已知局限,无副作用) |
六次误执行中四次是真缺陷:否定(”不要关风扇”关了风扇)、撤回(”开玩笑的”照常执行)、
负数(”零下 10 度”读成 10)。”不要关风扇”那条模型单独判也是关风扇,规则与模型一起错,
复核拦不住,只能在规则层修。第一轮原始记录里另标的几处”编造数字、漏执行”是判定脚本的误报,
判定修正后可用 --rejudge <时间戳> 按存档重算。14:07 那轮之后又补了”去年”的范围说明,
15:11 按最新代码整轮重跑,结果逐项同 14:07,且该题已带范围说明。
exp_assistant_steps.py 走与 run_api_server.py 相同的装配(仿真运行时 + 真实本地模型),把每题的回答步骤存下来。
不产生任何准确率数字。
87 句题库里可组合的 73 条两两拼成”A,B”,规则层全量跑:
| 组合数 | 首版 | 补问句标记后 | |
|---|---|---|---|
| 问 + 问 | 2390 | 65.9% | 93.5% |
| 问 + 指令 | 2244 | 80.4% | 96.1% |
首版失败集中在”没”字问(超了没有)、正反问(冷不冷)与”有多响”,补进问句标记后,剩下的失败只与两句有关, 都按设计不修。端到端抽样各 25 句(需模型):问 + 指令 25/25 直接执行、反问 0;问 + 问错误执行 0。
python scripts/assistant_benchmark.py > experiment-data/assistant/问答基线_<日期>_<模型>.txt
python experiment-data/assistant/exp_intent_heldout.py --rules-only # 数秒;去掉参数则连模型,约 12 分钟
python experiment-data/assistant/exp_noise_leading.py # 需要模型,约 12 分钟
python experiment-data/assistant/exp_compound_pairs.py # 规则层,约半分钟
python experiment-data/assistant/exp_compound_pairs_e2e.py # 需要模型,约 4 分钟
python experiment-data/assistant/exp_constraint_showcase.py # 需要模型
python experiment-data/assistant/exp_boundary.py # 需要模型,约 15 分钟
注意:这些脚本会把结果写回本目录,覆盖同名文件。