测什么才可信 — 区间记录·质量指标·失败率·关卡
一句话总结
语音助手的一轮对话要经过多个阶段,每个阶段都会各自变慢、各自失败。所以每一轮留下一条跟踪(trace),每个阶段留下一个跨度(span),并且所有指标——各阶段的延迟分布、WER、回答质量、失败率——都从这同一份原始数据中计算。错误率和用户遭遇的失败率是不同的数字,通过了依据检查的错误回答,只有对照标准答案表才看得出来。最后,要设置一道门禁:一旦比基线版本更差,就阻止发布。
为什么需要它
“平均响应 1.2 秒,运行良好”这样的报告,隐藏了三件事:哪个阶段慢(分布与阶段),哪些轮次失败了(失败的种类),以及回答对不对(质量)。正如前面的模块中看到的,这条流水线会给出通过依据检查的错误回答(模块 5)——对周六的提问回答工作日的时间,因为数字在文档里,所以也能通过。在只测量延迟和错误的仪表板上,这种错误回答会被统计为“成功”。
工作原理
跟踪与跨度。沿用 OpenTelemetry 的形态——每个跨度包含 trace_id、span_id、parent_id、名称、开始、结束、状态和属性。一轮对话有一个根跨度(turn)和子跨度(asr、retrieve、llm、verify、tts)。属性中放入最终文字、找到的文档、回答和出处。从这一份原始数据中,就能得出延迟分布(跨度长度)、WER(asr 跨度中的文字对照正确答案)、质量(根跨度中的回答对照标准答案表)和失败率(状态)。如果每个指标各自单独留日志,就会统计到不同的轮次,数字之间就对不上。
再看 WER。在 12 条合成的电话查询上,这条流水线的 ASR WER 接近 20%(在模块 3 的 LibriSpeech 上只有 1% 多一点)。是同一个模型。评估数据为什么必须与服务相似,在数字上看得很清楚。
三个质量指标。(1)事实准确率——在有答案的问题中,回答里是否包含正确答案事实(“9 a.m.”、“$80”……)中的一个。(2)拒答准确率——对没有答案的问题是否拒答了。(3)依据一致率——所说回答中的数字是否在引用的文档里。这条流水线的拒答准确率是 100%,依据一致率是 100%,事实准确率却是 50%(在集群 nuc1 节点上测得的值)。同样的模型、同样的种子、temperature 为 0,在 Mac(arm64)上却是 30%——CPU 不同,浮点数计算的顺序就不同,0.5B 模型的回答会有几个发生变化。所以要在你自己的运行中重新测量,基线版本也要在同一种节点上生成。因为 0.5B 模型会抄错文档里的其他数字,或者用来替代未通过检查的回答的提取句子偏离了问题。依据一致不等于准确。
错误与失败不同。故意让三个阶段失败,就一目了然了。ASR 给出空文本时,用户会听到“请再说一遍”(重新提问——用户失败)。LLM 超时了,但如果把检索到的段落中的句子读出来,用户就能听到答案(降级响应——是错误,但不是失败)。TTS 失败时,用户听到的是沉默(失败)。在 3 个出错的轮次中,用户失败有 2 个。如果仪表板上只放错误率,就无法区分“悄悄顺利处理掉的错误”和“抛弃了用户的错误”。
SLO 与门禁。SLO(服务水平目标)要按用户的体验来写——例如首次出声 p95 不超过 2.5 秒、事实准确率不低于 0.6、用户失败率不超过 5%。与测量值比较,判定达标或未达标。门禁(gate)则更进一步,看的是是否比基线版本更差。每个指标的方向和容差都不同——WER 和失败率上升就是变差(绝对幅度),事实准确率下降就是变差,而延迟因机器而异,所以按比例(例如 20%)来看。门禁也是代码,所以要放进该被阻止的东西试一试,看红灯是否亮起。
在现场相遇的样子
评估数据一开始很小,每出一次事故就增加一些。本课程的标准答案表,只是给 12 条查询手工标注的正确文档和事实。尽管如此,用来说明事实准确率只有一半多一点,以及依据一致率 100% 把它掩盖了,已经足够了。在生产环境中,会从真实通话里抽取被转交的轮次(handoff)和重新提问的轮次作为样本,不断补充到标准答案表中。LabHub 仓库每次新建门禁时都写明“要放进想阻止的东西,确认红灯是否亮起”(AGENTS.md),也是同一个原则。
延迟指标依赖于机器,这一点也要写入记录。同一条流水线,因节点 CPU 不同,耗时会相差几十个百分点。所以在门禁中,延迟要与在同一台机器上测得的基线比较,或者按比例来看,并且在基线版本的指标中一并写明“在哪里测的”。如果用一个绝对阈值来判定,在慢节点上运行的每一天都会出现虚假的退化。相反,质量指标(WER、事实准确率)不依赖机器,所以用相同的输入、相同的种子重新运行,应当得到相同的数字——如果结果不同,这本身就是需要调查的事件。
下一项实验要做什么
给基线流水线挂上跨度记录,把 12 条查询作为跟踪留下来。从同一份原始数据中,计算各阶段的 p50/p95、WER、事实与拒答准确率以及依据一致率。让三个阶段失败,区分出错误轮次和用户失败,确定 SLO 并判定。制作阻止相对基线版本退化的 gate.py,接受隐藏用例的测试,并用这一版的指标运行门禁。