第四幕 是骡子是马,放出来遛遛?
第四幕 是骡子是马,放出来遛遛?
分数会撒谎
57.2%、67.6%、70.5%。这三个数字是同一套系统、同一个测试集上的成绩,顺序就是我跑出来的顺序。
十四个百分点的提升,听起来很能打。但拆开看,三步里只有一步算真进步。
判据在工具调用层
先讲 E1,它是这套评测的方法论起点。
五十条固定话术,三层分档:明确指定("把灯带亮度调到 60")、部分指定("有点热")、完全不指定("弄得舒服点"),再混入非法指令("把风扇调到 300 档")。真实 API 跑,判据不在最终文本,在工具调用层:调了哪个工具、参数合不合法。契约校验层天然就是参数合法性的自动判据,不依赖真机,不用人肉看回答。
结果:总准确率 96%,48/50。最值得说的是 vague 档 100% 不退化。对照 HomeMind 论文的曲线——提示词具体度下降,规则准确率从 96.88% 掉到 33.59%——这个模型对抽象意图的组合决策没有塌。失败的 2 例都在 partial 档:一例没执行,一例动作配错设备没拒绝。
放出去遛:HomeBench
E1 是自建题,说服力有限。得用外部的、公开的基准:HomeBench,ACL 2025 的智能家居指令评测集。官方论文的玩法是给裸 LLM 喂文本判输出,13 个模型在"非法多设备指令"上成功率 0.0%。
我的玩法不一样:把 HomeBench 的一个 home(12 房间 × 15 类设备)翻译成设备定义,42 台 mock 设备经 MQTT info 上浮,后端零代码改动,跑完整决策链:模型 → 工具调用 → 契约校验 → cmd → ack → 轨迹翻译回 HomeBench 判分口径。
评测链路先踩了两个坑,都是上游 API 语义的:session_key=None 每次新建会话;消息提取只拿本回合,跨回合全漏。修完链路,基线 EM 57.2%。
时间线:三次提升,一次进步
第二次提升 +10.4pt,到 67.6%。模型什么都没变,是评测变准了。两处修正:
- 状态漂移:normal 用例的 gold 是相对增量("调高 20"),但连发用例真的执行会改设备状态,模型按真实状态算就对不上 gold。评测驱动每条例前恢复初始状态;
- 探索性失败噪音:gold 没有 error_input 的用例里,模型猜错设备名被拒再纠正的失败探索,不再产生 error_input 元素。
第三次提升 +2.9pt,到 70.5%。这一次才是真进步,来自三条执行纪律写进提示词:
- 调整数值前必须先
iot::query查当前状态; - 增量指令目标值 = 当前值 ± N 绝对值,"percent" 按点数不按比例;
- 只执行明确要求的动作,不臆造设备,不张冠李戴。
normal_single 从 89% 到 98.6%,增量指令失败清零。我还试过把纪律提示词和业务提示词拆开(评测注入通道),实测证伪:模型在真实对话里会把计算过程展示出来,拆开反而两头不像。于是合并定稿,评测提示词就是业务提示词。
这三步里,只有第三步能写进论文当"模型行为改进"。第二步是评测公平性修正,算成绩时得和真进步分家。把评测修正当模型进步报,等于学术注水。
数据集自己也有坑
HomeBench 数据集本身也有毛病。multi 用例里 22.5% 的 error_input 项,设备和操作实际存在,gold 标错了,模型正确执行反被判错。还有相对增量指令的 gold 不可复现:同一句"把门厅亮度降低 63%",两条用例的 gold 分别是 20 和 80,因为数据集为每条用例生成了不同初始状态,但只发布一份 home_status。
判分上限受数据集限制,这个必须写进报告。分数会撒谎,数据集也会。
收个尾
说句心里话:带工具链的端到端口径下,我到现在还是觉得这套东西是 SOTA。官方口径是裸 LLM 文本,我的口径多了工具链和契约校验,不能直接等价比较。但正是这个"多出来的部分"是系统设计,不是作弊。
这些数字都是真钱跑出来的:真实 API,一条用例平均 7 秒,173 条全量跑了三遍。没有 mock 成绩,没有离线模型。96% 和 70.5%,每一分都有账单。
仓库暂未公开,评测代码都在里面,等开放那天自己翻。
