"意图识别准确率 95%":这个数字为什么不能拿来验收
选型会上最容易出现这样的对话:
厂商:"我们的意图识别准确率是 95%。"
甲方技术:"测了多少条?什么数据?"
厂商:"标准语料库,几千条。"
这两句问答里其实藏着三个致命问题,而绝大多数团队当场没追问下去。
一、先做归因:是听错了,还是没听懂
语音场景里,"理解错了"和"听错了"是两件事,但报表里往往被合并成同一个"意图识别错误"。
一次语音交互的链路是:声波 → ASR(转成文字)→ NLU(理解意图)→ 对话管理 → 响应。当结果是错的,第一件要做的事是拿出 ASR 转写文本看:
- 文本本身就是错的 → 是 ASR 问题(口音、噪音、专业词、方言、说话人重叠);
- 文本正确但意图判错 → 才是 NLU 问题。
这两者的治理成本完全不同:ASR 层的问题靠热词表、方言模型、音频前端处理;NLU 层的问题靠语料和意图体系重构。在没有分层归因之前谈"准确率",等于把两类预算混在一起花。
一个粗略但有效的判据:抽检 100 条识别失败的会话,逐条看转写文本。如果其中超过三成文本本身就是错的,那么优先优化 ASR 的收益会明显大于继续调 NLU。
二、四个指标,各管一段,不能互相替代
| 指标 | 定义 | 管什么 |
|---|---|---|
| 意图识别率 | 识别正确的意图数 ÷ 总识别机会数 | 理解得对不对 |
| 任务完成率 | 成功办结的会话数 ÷ 总会话数 | 事情办没办成 |
| 平均轮次 | 一次会话中客户与机器人一来一回的次数 | 过程费不费劲 |
| 遏制率 | 未转人工即结束的会话占比 | 省下了多少人力 |
识别率高而完成率低,通常说明后端没接上——模型听懂了,但查不到订单系统、改不了地址。这时候继续提升识别率毫无意义。
平均轮次上升是比准确率下降更早出现的信号:它说明模型开始需要追问客户才能搞定,客户体验已经在恶化了,只是还没体现在投诉率上。
而遏制率要小心使用:它上升的同时如果 CSAT 下降、或者短期内同一问题重复来电上升,说明机器不是在解决问题,是在把客户拦在外面。
三、95% 为什么不可信:三个失真源
失真源 1:测试集被训练集污染
如果厂商用同一批数据既训练又测试,那模型等于"用出生年份预测年龄"——数学上几乎全对,实际上什么都没学会。
判断方法很简单:问测试语料的时间窗口和来源。 拿三个月后的新语料去测同一个模型,准确率通常会掉几个到十几个百分点,而那个数字才是你未来真正会面对的水平。
失真源 2:测试集不代表真实分布
真实的话务分布是极度不平衡的:往往头部几个意图占掉大部分流量,剩下几十个意图各自不到百分之一。
如果测试集按意图均匀抽样(每个意图一样多条),那么长尾意图会被大幅高估——它们在测试里占 2%,在真实流量里可能只占 0.1%,对整体体验的影响被放大了二十倍。反过来,头部意图的错误成本却被低估了。
正确的做法是按真实流量比例抽样,让测试集里的分布跟生产日志一致。
失真源 3:它是某个时间点的快照
意图是会长出来的。上促销、改政策、出新故障类型,都会带来全新的说法。评测不是一次性的验收动作,而是一项长期维护工作。建议在每个版本迭代后固定跑一次回归。
四、混淆矩阵:比单一准确率有用得多
把所有"判错"的样本按(真实意图,预测意图)成对统计,就是混淆矩阵。它能回答准确率回答不了的问题:哪些意图在互相打架。
假设有这样一个自造的例子:某模型在 500 条真实语料上整体判对 440 条,整体准确率 88%——看起来不错。但把其中"改收货地址"这个意图单独拆开:
- 该意图在测试集中共 60 条;
- 模型把其中 45 条判成了"改收货地址"(含判错的和判对的混在一起);
- 这 45 条里实际正确的是 40 条。
那么针对这个意图:
- 精确率 Precision = 40 ÷ 45 = 88.9%(模型说是这个意图时,有多大把握是对的)
- 召回率 Recall = 40 ÷ 60 = 66.7%(真实是这个意图时,模型能揪出多少)
- F1 = 2 × 88.9% × 66.7% ÷ (88.9% + 66.7%) ≈ 76.2%
召回率只有 66.7%,意味着每三条里漏一条。而混淆矩阵会告诉你漏到哪去了——通常集中在"修改订单信息""改配送方式"这类语义邻近的意图上。
这时候该做的不是继续加语料盲目重训,而是考虑:这几个意图要不要合并? 很多时候把三个互相打架的意图合成一个"订单变更",再在对话里用选项确认分支,比追求更高的识别率有效得多。
五、一套能落地的评测集建设方法
这是我认为投入产出比最高的一套动作,全部可以靠自己团队完成,不需要额外采购:
- 从生产日志抽取真实客户说法,脱敏后作为原始池。不要由产品经理凭空造句子——他们大概率会用训练机器人时的同一种说话方式,产生正向偏差。
- 在抽取时就记录"期望意图"(即 ground truth)。事后补标注既慢又贵,而在设计用例时顺手记一笔几乎不增加成本。
- 按真实流量分层抽样,头部意图多留、长尾意图按比例保留,样本量目标建议:头部意图每类不少于 50 条,整体不少于 500 条。
- 留出独立的"黄金测试集",不在任何训练环节中使用,只在评测时调用。一旦有人把它的语料拿去修模型,这个集就废了。
- 走查交给不参与建设的人。让没读过机器人话术的同事按场景跑一遍,专挑不按脚本说话的路径(中途改需求、一句话两个诉求、情绪激动、直接说"转人工")。这类用例最能暴露机器人设计的盲点。
- 每次迭代跑回归,把四个指标(识别率 / 完成率 / 轮次 / 遏制率)和上一次并列,而不是只看一个数。
六、国内落地时的四个注意点
- 先解决 ASR 再谈 NLU。中文场景的口音和方言差异远大于英文,很多团队花了半年调意图模型,实际瓶颈是前端识别。
- 把"拒识"当正式功能设计。宁可让机器人说"这个我处理不了,马上转人工",也不要硬接一个它不懂的请求。低置信度时的兜底策略,直接决定客户体感。
- 知识库通常比模型更拖后腿。很多时候意图判对了,但答案过时、答非所问。先盘清文档的新鲜度和结构,比换模型划算。
- 给评测集设 Owner。这是最容易烂尾的一环——没有归属人的评测集,三个月后就会被遗忘,然后大家重新开始相信厂商给的那个数字。
本文为原创内容。文中示例数值仅用于说明计算方法,不构成任何行业基准,也不代表任何厂商的实际水平。