embedded-host-platform

问答评测数据

问答部分的评测题库、每次运行的完整输出与复现脚本。结论与解读见 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%,这是怎么调提示词都做不到的。

87 句拟合题库

84 / 87 = 96.6%。按类别:提问 54/57,指令 22/22,范围外 8/8。模型客户端请求 63 次,超时 0、失败 0 (超时数一旦非零,分数反映的就是机器负载而不是模型能力)。

未通过的 3 条同属一类:”那你开开呗”“打开”“关了吧”期望反问”开哪个”,实际直接判成了开关风扇。 这是意图规则的重叠:开关词表收录”开”之后,裸开关句在进入反问分支前就被判成了指令。

这个数只说明规则没退化:词表是照着这批题补的。

148 句留出题库

用模板展开((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 分钟

注意:这些脚本会把结果写回本目录,覆盖同名文件。