2026年1月31日 · 阅读 —
大模型意图识别测试这事,AI 测试人得有一套“能落地、能复盘、能挨骂还能活”的体系
大模型意图识别测试这事,AI 测试人得有一套“能落地、能复盘、能挨骂还能活”的体系
原文核心思想
这篇文章聊的不是“模型有多强”,而是“意图识别到底该怎么测”。作者想提醒的是:测试不能只看准确率,要把语义理解、情绪语境、潜在需求和闭环效果整个链路测干净。为什么现在值得聊?因为模型分数高、用户照样骂,这才是产品真正的痛。读完能带走的东西很具体:测试目标如何拆层、数据集怎么做脏样本、指标怎么定义、流程怎么跑、以及哪几类场景必须打穿。
正文
我真是被“分数好看但用户骂街”的局面折磨过。测出来90%准确率,线上还被喷得狗血淋头,那个时候我才意识到:意图识别测试不是考试刷分,是实战打仗。测试人员要测的不是“模型懂不懂”,而是“模型有没有把事做对”。
我和读者站在同一边——我们都想让AI别翻车,但现实是翻车最常发生在最关键的场景:模糊、情绪、多轮漂移、潜在需求。这些全是关键词匹配解决不了的狗东西。
一、先把“测什么”说清楚:意图识别不是一个点,是一条链
你如果只测意图分类准确率,就像你只测刹车灵敏度,却不测方向盘。这玩意儿会把人直接送走。建议按四层拆:
1)显性意图准确性
- 识别用户“在说什么”
- 目标:意图分类准确率、混淆率、Top-2 命中率
2)隐性状态识别
- 识别用户“怎么说的”(情绪、讽刺、焦虑)
- 目标:情绪极性识别准确率、讽刺误判率、焦虑类召回
3)潜在需求预测
- 识别“接下来要干嘛”
- 目标:下一步需求预测命中率、触发正确策略的比例
4)闭环效果
- 识别 → 策略 → 行动 是否正确
- 目标:任务完成率、人工转接率下降、投诉/差评率变化
一句话:模型能懂只是起点,产品能做对才是终点。
类比一下,意图识别像你家管家,不止要听懂你说啥,还得懂你情绪、猜你下一步、最后把活干对。只测“听懂”就是测了耳朵,没测脑子和手。
二、测试数据集:别用干净样本骗自己
意图识别的死敌是“脏话术”,真实用户不是写需求文档的。你用干净语句去测,只能测出“实验室成绩好”,上线就翻车。
建议数据集至少覆盖这些坑点:
- 模糊意图(“我有点不舒服”“这个衣服怪怪的”)
- 讽刺/情绪(“你们物流真快啊”)
- 多轮漂移(先订机票 → 查天气 → 退了吧)
- 场景歧义(“买苹果”到底是水果还是手机)
- 潜在需求(“裙子什么时候发货”背后可能是婚礼急用)
- 高价值用户/低价值用户策略差异
这块就像做防洪工程,干净样本是晴天模拟,脏样本才是真洪水。
三、评测指标:别只盯 Accuracy
Accuracy 很重要,但不够。测试指标要像体检表,不能只量血压。
1)分类层指标
- Accuracy / F1 / Top-2 accuracy
- 类别混淆矩阵(重点看高频误判对)
2)情绪/语境指标
- 情绪极性准确率
- 讽刺句误判率
- 焦虑/愤怒场景下安抚策略触发率
3)多轮对话指标
- 意图漂移识别率
- 错误继承率(把上一轮当当前意图)
4)业务闭环指标
- 任务完成率
- 澄清选项触发正确率
- 正确补偿策略触发率
- 投诉/转人工变化趋势
如果只测Accuracy,就像只看考试卷子分数,没看学生出门会不会迷路。
四、评测流程:分层 + 回归 + 线上 A/B
我推荐一套“分层→回归→线上验证”的流程,稳、不花哨但能活命。
1)离线评测
- 标准意图集测显性意图准确率
- 情绪语句集测隐性状态识别
- 多轮对话集测意图漂移和上下文权重
2)仿真回放
- 抽真实日志回放
- 看“模型预测 → 策略触发 → 用户反馈”是否一致
3)线上 A/B
- 看投诉率、人工转接率、NPS 变化
- 重点看“策略是否触发对了”
这三段像打游戏的三关:练习场、模拟战、真刀真枪。每关都有坑,少走一关都可能上线翻车。
五、重点测试场景:时间不够就先打穿这五类
这五类不打穿,线上基本会被喷到怀疑人生。
1)模糊意图
- 识别率 < 阈值时是否给澄清选项
- 是否避免“乱答”
2)讽刺/情绪
- 是否识别到情绪极性
- 是否优先安抚或补偿策略
3)多轮漂移
- 是否被旧意图绑架
- 最新指令是否能正确覆盖
4)潜在需求
- 是否主动给下一步建议或按钮
- 是否能提前两步做准备
5)高价值用户策略
- 是否触发“直接赔付/优先处理”
- 是否减少“走流程废话”
这五类就像消防演习里的火源点,你不提前练,线上火一烧就完蛋。
六、给你一套工程化步骤(至少 6 步)
这是我用过的“实战流程”,从拉数据到上线复盘。
- 收集真实用户话术(重点含情绪、讽刺、抱怨)
- 标注意图层级(显性/隐性/潜在)
- 定义置信阈值(低于阈值必须澄清)
- 设计多轮对话权重(近期>远期,允许反转)
- 配套策略库(澄清、安抚、赔付、转人工)
- 建立回归测试集(覆盖高频Badcase)
- 上线A/B并监控投诉率、NPS、转人工趋势
这个流程像修路,地基不打稳,车一上来就翻。
七、表格清单(两个用途,不同视角)
-
表1:四层测试目标与指标对照表* | 层级 | 测试目标 | 关键指标 | 典型风险 | |---|---|---|---| | 显性意图 | 听懂说什么 | Accuracy / F1 / Top-2 | 场景混淆 | | 隐性状态 | 识别情绪语境 | 情绪极性准确率、讽刺误判率 | 误判导致用户更怒 | | 潜在需求 | 预测下一步 | 预测命中率、策略触发率 | 只回答字面需求 | | 闭环效果 | 行动是否正确 | 任务完成率、投诉率、转人工变化 | 只会说不会做 |
-
表2:脏样本清单与覆盖策略* | 样本类型 | 例子 | 必测原因 | 覆盖方式 | |---|---|---|---| | 模糊意图 | “我有点不舒服” | 误判风险高 | 低置信触发澄清 | | 讽刺情绪 | “你们物流真快啊” | 情绪误判会激怒用户 | 情绪极性评测 | | 多轮漂移 | 订机票→查天气→退了吧 | 旧意图绑架 | 多轮上下文权重 | | 场景歧义 | “买苹果” | 意图归类错误 | 场景意图标注 | | 潜在需求 | “裙子什么时候发货” | 需求不止查询 | 下一步策略验证 |
八、代码示例(工程感保证,含输入/输出/翻车点)
- 代码示例 1:置信度阈值触发澄清(场景:模糊意图)* 输入示例: 用户:“这裙子我有点不舒服”
可运行代码:
from typing import Dict
def resolve_intent(intent_score: Dict[str, float], threshold=0.85):
best_intent = max(intent_score, key=intent_score.get)
best_score = intent_score[best_intent]
if best_score < threshold:
return "您是想了解发货时间,还是想修改配送地址?"
return f"已为您进入{best_intent}流程"
# 输入示例
intent_score = {"发货时间查询": 0.62, "修改地址": 0.59}
print(resolve_intent(intent_score))
预期输出: “您是想了解发货时间,还是想修改配送地址?”
翻车点提醒: 如果低置信直接答,用户会觉得你在装傻,还可能直接投诉。
- 代码示例 2:多轮意图漂移处理(场景:上下文权重)* 输入示例: 对话:订机票 → 查天气 → 退了吧
可运行代码:
def resolve_multi_turn(history, latest):
# 近期意图权重更高,但允许新指令覆盖旧语义
recent_intent = history[-1]["intent"]
if "退" in latest and "机票" in history[0]["intent"]:
return "退机票"
return recent_intent
history = [
{"intent": "订机票"},
{"intent": "查天气"}
]
latest = "那帮我退了吧"
print(resolve_multi_turn(history, latest))
预期输出: “退机票”
翻车点提醒: 如果只看上一轮,很可能误判成“取消天气提醒”。
九、结语:测试的不是“懂”,是“帮你做对”
意图识别测试,最终不是给模型打分,而是让产品在最容易翻车的地方别翻车。 我承认,测清楚这套东西很累,但不测会更惨。 你要的不是“90%准确率”,而是“用户在愤怒时你能安抚、在模糊时你能澄清、在关键时刻你能补偿”。
这事就像开车: 模型懂路牌不够,测试要保证它真的会安全开车。 别让AI在用户最难的时候,做了最蠢的事。
#AI测试 #意图识别 #大模型评测 #NLP #多轮对话 #情绪识别 #产品体验 #质量保障 #Badcase #闭环设计