意图准确率 93%,任务完成率只有 62%:我把评估体系重做了
系列第 6 篇 · 质量度量
⚠️ 数据性质声明(先看这段,避免误读):本文所有数字都是我在本机实跑算出来的,不是引用、不是估算。实验对象是我手写的 60 条中文客服评测集 + 我实现的一个字符 2-3gram TF-IDF 检索客服机器人(10 条 FAQ 知识库)。它不是某家公司的线上系统,数据也不是生产数据——但"准确率高、任务完成率低"这个背离是被真实测量出来的,脚本可复现(
eval_system_study.py,seed 固定)。
我给一个客服机器人跑评测,意图准确率 93.3%,看起来该上线了。换一个指标再测:任务完成率只有 61.7%——同一批 60 个问题,同一个机器人,两个数字差了 31.7 个百分点。
更扎心的是:我又写了个「自动评估器」去打分,就算把阈值调到它能达到的最优点,它和真值的 Cohen's kappa 也只有 0.346——统计学上这叫"一般般的一致性"。用它验收,等于蒙着眼验收。
一、准确率陷阱:答对了"是什么",没答"怎么办"
先说清两个指标的区别,这是全文的地基:
- 意图准确率:机器人有没有听懂你问的是"退款"还是"物流"。
- 任务完成率:机器人给的那段话,够不够让用户把事办完。
我给评测集里每条问题都标了「一个有用的回答必须包含哪些要素」。比如:
问:"我的退款什么时候到账" 必需要素:时效(多少个工作日)+ 查询入口(去哪看进度)
只有必需要素一个不缺,才算任务完成。结果就是开头那个 31.7pp 的落差。
二、实测对比表:同一个机器人,四个指标四种脸
| 指标 | 数值 | 说明 |
|---|---|---|
| 意图准确率 | 93.3% | 60 条里听懂了 56 条 |
| 任务完成率 | 61.7% | 只有 37 条真的把事说全了 |
| 拒答 / 转人工率 | 1.7% | 几乎不拒答(看着很"自信") |
| 需人工接管率 | 38.3% | 每 3 个用户就有 1 个还得找人 |
反直觉点:拒答率只有 1.7%,看指标像是"什么都能答"——但实际上有 38.3% 的对话最终还得转人工。低拒答率不是能力强,是"不知道自己不知道",机器人自信地给了一段不完整的话,把用户挡在了自助流程里。
三、分意图拆开看,才知道该修哪
总分永远骗人。按意图拆开,问题立刻定位:
| 意图 | 样本数 | 意图准确率 | 任务完成率 | 差值 |
|---|---|---|---|---|
| 退款 refund | 18 | 88.9% | 61.1% | −27.8pp |
| 物流 logistics | 14 | 100% | 64.3% | −35.7pp |
| 质量 quality | 10 | 80.0% | 60.0% | −20.0pp |
| 地址 address | 8 | 100% | 100% | 0 |
| 优惠券 coupon | 6 | 100% | 33.3% | −66.7pp |
| 发票 invoice | 4 | 100% | 25.0% | −75.0pp |
看出门道了吗:
- 地址意图 100%/100% —— 因为它的回答模板里同时写了"发货前可自助改、已发货找人工",要素齐全。
- 发票意图意图准确 100%,任务完成只有 25% —— 模板只说了"去哪开票",没说多久能拿到。
结论:机器人不是"听不懂",是"话没说全"。 这两类问题的修复成本差着数量级:前者要改模型/检索,后者只要改文案模板。不拆指标,你会去调模型;拆了指标,你发现改几行文案就行。
再看最常缺失的要素 TOP5(这就是文案待办清单):
| 缺失要素 | 次数 |
|---|---|
| 人工入口 | 6 |
| 时限 | 4 |
| 时效 | 2 |
| 查询入口 | 2 |
| 催单动作 | 2 |
四、血泪坑:我写的"自动评估器",其实在骗我
评测集要人工标注太贵,所以大家都想用「自动评估器」(相似度打分 / LLM-as-judge)。我实现了两个:
- judge A(同源):和检索器共用同一套 char-ngram + IDF 表征。
- judge B(独立):换成 token-overlap,另一套表征。
为了公平,我给每个 judge 都遍历所有阈值,取它能达到的最高 kappa(也就是"它的最好成绩"):
| 自动评估器 | 最优阈值下通过率 | 真值 61.7% | TP/FP/FN/TN | 一致率 | kappa |
|---|---|---|---|---|---|
| judge A(同源表征) | 56.7% | −5.0pp | 26/8/11/15 | 68.3% | 0.346 |
| judge B(独立表征) | 65.0% | +3.3pp | 27/12/10/11 | 63.3% | 0.211 |
坑在哪:光看"通过率 56.7% vs 真值 61.7%",误差只有 5 个百分点,看上去这个自动评估器很准。但打开混淆矩阵:FP=8、FN=11,一共错了 19 条——它只是错得刚好互相抵消,总分对了,每一条都在乱判。
教训:验收自动评估器,永远看 kappa 和混淆矩阵,别看总通过率。 总通过率是最容易被"抵消效应"骗到的指标。
顺带一个诚实的负面结果:我本来想验证"judge 和被测系统共用表征会自我偏袒"。把两个 judge 强制放行同样比例(各 30%)后,同源 judge 误放 FP=6,独立 judge FP=5 —— 差距很小,在我这个实验里没能复现出显著的同源偏好效应。这条我照实写出来,不硬凑结论。
五、评测集怎么抽:分层抽样真正的价值不是"降方差"
大家都说要分层抽样。我用 bootstrap 跑了 2000 次,每次抽 20 条:
| 抽样方式 | 完成率估计均值 | 标准差 | 估计区间 |
|---|---|---|---|
| 随机抽样 | 0.620 | 0.0881 | [0.35, 0.90] |
| 分层抽样 | 0.627 | 0.0856 | [0.40, 0.90] |
分层只把标准差降了 2.8% —— 说实话,几乎没用。如果只看这张表,你会得出"分层抽样是玄学"的结论。
但换个问法就不一样了。随机抽 20 条时,某个意图一条都抽不到的概率:
| 意图 | 集合内条数 | 完全漏抽概率 |
|---|---|---|
| 发票 invoice | 4 | 20.2% |
| 优惠券 coupon | 6 | 7.8% |
| 地址 address | 8 | 2.8% |
发票意图有 1/5 的概率整个消失。 而前面第三节刚测出来:发票意图的任务完成率只有 25%,是全场最差。
也就是说:你随机抽一批样本做验收,有 20% 的概率完全看不到最烂的那个场景,然后信心满满地上线。 分层抽样的价值不在方差,在于保证长尾场景不被抽没。
同时也说明:即便随机抽 20 条,估计区间是 [0.35, 0.90] —— 小样本评测的结论根本不能信,20 条是在赌博。
六、把评估体系重做成什么样
基于上面的实测,我的指标树是这样的:
第一层(能不能用) - 任务完成率(必需要素全覆盖率)← 主指标 - 人工接管率 - 长尾意图的分意图完成率(不看总分)
第二层(为什么不能用) - 意图准确率(听没听懂) - 要素缺失分布(话有没有说全)← 直接产出文案待办
第三层(怎么高效测) - 分层抽样,保证每个意图 ≥ N 条 - 自动评估器只做初筛,且必须先用人工标注算 kappa 验收 - kappa < 0.6 的自动评估器,不允许单独用于上线决策
读者交付物
① 评测集 CSV 结构(直接抄):
id, question, gold_intent, required_elements, bot_answer,
intent_ok, missing_elements, task_ok
关键是 required_elements 这一列——它是把"准确率"升级成"任务完成率"的唯一开关。
② 评估体系指标树:见上一节三层结构。
③ 可复现脚本:eval_system_study.py(seed=7,纯标准库 + 无外部依赖,跑一次约 3 秒)。
结尾:今天就能动手的 3 条清单
- 给你的评测集加一列
required_elements。挑 20 条真实用户问题,人工写清"回答必须包含什么",重算一次完成率——大概率你也会看到 20pp 以上的落差。 - 把总分拆成分意图。按意图分组算完成率,找出那个"准确率 100%、完成率 25%"的场景,先改它的回答模板(成本最低、收益最大)。
- 给你的自动评估器算一次 kappa。用 50 条人工标注对一下,kappa < 0.6 就别拿它当验收标准,只能当初筛。
实测环境与免责:Windows 11 / AMD Ryzen / Python 3.13 + 纯标准库,评测集为本人手写的 60 条中文客服样本(非生产数据),被测机器人为本人实现的 char 2-3gram TF-IDF 检索 + 10 条 FAQ 模板,所有指标、混淆矩阵、kappa、bootstrap 均为本机实跑计算,seed 固定可复现。结论基于本人环境与本人构造的数据集,仅供参考,不代表任何真实商用客服系统的表现。
下篇我们聊:语义缓存降本——加一层缓存把推理账单砍下来,命中率和"答案过期"之间怎么权衡。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)