优化一个由外部平台裁决的系统时,最像成果的那个数字往往最不可信。总播报量在相邻参数下波动 10 倍,真正能用来判断改动的,只有「同一场次内可复现」的那几个指标。
钩子:只要系统里有外部裁判,参数与结果之间就不是单调关系,中间隔着一个看不见的决策过程。
导火索是 batch_probe.js 报出「末批等待 20~37s,超出平台静默窗口 23~26s」。于是把单轮上限从 30s 降到 15s、队列上限设为 4 批、预算八成停止入队。
后果是每轮只播 13s,约 65 字。sim13 平台追问的原话是「您的自我介绍似乎没有说完方便补充一下您的技术背景和项目经历吗」,334s 催场、366s 结束。
回退判定:宁可超时催场,也不能说一半。超时只需再答一句,说一半直接终止。
sim10 起把打断策略改成「保留队列」,但 bridgePump 丢弃旧内容仍用入队时间早于停止标记时间这个判据,而保留下来的批次恰好全在停止标记之前入队。
sim14 因此产生 53 次 dropped_after_barge_in。改为按轮次丢弃后,sim15 降到 1 次。
新策略与老判据共存时,更具体、更靠底层的那个会赢,而且不报错。
判据只有一条,这个指标在同一场次内能不能复现。
| 指标 | demo(改造前) | sim10~sim15(改造后) |
|---|---|---|
| 首句开口滞后 | 中位 12.0s / 最长 27.0s | 中位 3.97s / 最长 6.70s |
| 批间纯静音 | 平均 21.8s(最长 58.8s) | 2.0~2.5s |
| 送达电平 | — | micPeak 0.12~0.18 / rms 0.05~0.07 |
| 两条打断路径计数 | 0 / 0 | 首次被真跑覆盖 |
复盘承认的唯一无争议成果,是开口滞后最长从 27.0s 降到 6.70s。要比较参数,同参数必须跑 ≥5 场取中位数。
batch_probe.js 第一版只算分批不算预算,于是报出「全部超窗口」的误导结论。真实运行里 guard.planBatch 会跳过超预算批次,根本等不到。两个量必须一起模拟。
另一个细节:gap_probe.js 的跨场次对比表写死了 demo 到 sim13 五个目录,跑完 sim14 与 sim15 之后不会自动跟上。
核心一句话:工具的输出是证据,不是结论。跑之前先看它模拟了哪几层现实、读的是哪几个目录。
已知:开口滞后与批间静音已达标;总播报量不可作优化目标;比较需同参数 ≥5 场;「宁可超时催场,也不能说一半」已成硬规矩。
未知:为什么平台在部分场次只答 2 轮就终止。该现象与播报量不成正相关,sim14 播 84s 答 12 轮,sim15 播 20s 答 2 轮,sim12 播 13s 也答 2 轮。
推测方向归给了平台侧行为(提问节奏 + 语音活动检测判定),需要与平台侧对照才能归因,没有强行给出一个自洽解释。
autobot/docs/TUNING-RETRO-2026-10-07.md §1 六场实测 · §2 两次错误改动 · §3 稳定指标 · §4 诊断工具 · §5 下一步;autobot/gap_probe.js;autobot/batch_probe.js。