做了快两年的对话系统和 AI Agent 相关的开发,从最早期的规则引擎,到后来的分类模型,再到现在直接用大模型做意图识别,这条路走了不少弯路。今天把这些经验整理一下,给正在做相关开发的朋友做个参考。
摘要:意图识别是对话系统的核心。本文从规则匹配、传统机器学习到大模型,梳理三代意图识别方案的演进与取舍,并结合工程实践给出「高频意图用轻量模型、低频复杂意图交给大模型」的混合落地思路,帮你少走弯路。
为什么意图识别这么重要?
简单说,意图识别就是搞清楚用户到底想干嘛。
用户说一句话,系统要判断他是想查信息、想办事、还是就是随便聊聊。判断对了,后面的流程才能跑通;判断错了,整个对话就跑偏了。
这个环节看似简单,实际上是整个对话系统最核心的部分。意图识别准确率上不去,后面再怎么优化都是白搭。
第一代:规则匹配,简单粗暴
最早做项目的时候,没钱买模型,也没什么数据,就靠写规则。
用户说什么关键词,就对应什么意图。比如用户说 “退款”,就触发退款流程;用户说 “查订单”,就触发查询流程。
这种方式的优点是简单直接,开发快,好解释。缺点也很明显:
用户换个说法就认不出来了
规则写多了之后互相打架,维护起来崩溃
边界情况特别多,永远补不完
那个时候我们光规则就写了上千条,每次出问题就是到处找哪条规则写错了,痛苦得很。
第二代:传统机器学习,上了一个台阶
后来数据积累多了,开始用传统的分类模型。
把用户说的话分词,提取特征,然后用 SVM、朴素贝叶斯这些模型做分类。效果比规则好不少,用户换个说法也能认出来了。
但还是有问题:
特征工程特别费时间,要人工调
小语种、口语化的内容效果不好
新意图出来的时候,要重新收集数据、重新训练,迭代很慢
而且传统模型对上下文的理解能力很弱,用户说半句话它根本接不上。
第三代:大模型时代,思路完全变了
大模型出来之后,意图识别这件事的玩法彻底变了。
以前是 “先分类,再处理”,现在大模型本身就能理解语义,你直接把用户的问题和系统的功能列表给它,让它自己判断是哪个意图。
这种方式的好处太明显了:
不用再训练专门的分类模型了
新意图只要在提示词里加一句就行,几分钟就能上线
用户说什么奇怪的说法都能理解,泛化能力特别强
但也不是完美的。大模型做意图识别,成本比传统模型高,延迟也大一点。而且有时候会 “想太多”,把简单的问题想复杂了。
下面把三代方案放在一起对比一下,方便直观感受各自的取舍:
| 维度 | 规则匹配 | 传统机器学习 | 大模型 |
|---|---|---|---|
| 准确率 | 低,依赖规则覆盖 | 中,依赖特征工程 | 高,语义理解能力强 |
| 开发成本 | 低,写规则即可 | 高,需标注数据、调特征 | 中,主要靠提示词设计 |
| 维护成本 | 高,规则易冲突、难维护 | 中,新意图需重新训练 | 低,新意图改提示词即可 |
| 延迟 | 极低 | 低 | 相对较高 |
| 泛化能力 | 弱,换个说法就失效 | 一般,口语化效果差 | 强,能理解各种奇怪说法 |
| 适用场景 | 意图少、说法固定的小项目 | 数据充足、意图相对稳定的场景 | 意图复杂、变化快、追求泛化的场景 |
小结:规则匹配胜在简单直接,适合小规模固定场景;传统机器学习在数据充足时性价比不错,但迭代慢、泛化弱;大模型能力最强、维护最省心,但成本和延迟更高。实际落地不必二选一,把高频简单意图交给轻量模型、低频复杂意图交给大模型,往往是最稳的组合。
工程实践中的几个坑
实际落地的时候,我踩过不少坑,这里列几个比较典型的:
1. 别全靠大模型,混合方案最靠谱
现在我们的做法是:高频常用意图,还是用轻量分类模型快速判断,准确率高、速度快、成本低。低频复杂意图,再交给大模型处理。
这样既能保证性能和成本,又能处理复杂情况。全用大模型,不仅贵,而且没必要。
下面用一段 Python 伪代码示意这种混合路由的核心逻辑:
# 高频意图白名单:这些意图用轻量分类模型,快且便宜HIGH_FREQ_INTENTS={"查订单","退款","改地址"}# 置信度阈值:低于该值不信任当前模型结果CONFIDENCE_THRESHOLD=0.8defroute_intent(user_input:str,context:dict)->str:# 第一步:先用轻量分类模型快速判断intent,confidence=light_model.predict(user_input,context)# 第二步:意图优先级判断——高频意图直接走轻量模型ifintentinHIGH_FREQ_INTENTSandconfidence>=CONFIDENCE_THRESHOLD:returnintent# 命中高频意图且置信度足够,直接返回# 第三步:低频或复杂意图,降级交给大模型兜底llm_intent=llm_model.predict(user_input,context)llm_confidence=llm_model.confidence()# 第四步:大模型结果也要过置信度阈值,不够就走兜底流程ifllm_confidence>=CONFIDENCE_THRESHOLD:returnllm_intent# 置信度都不够:反问用户或转人工,别硬猜returnfallback_to_human(user_input)核心就三步:高频意图优先走轻量模型,命中且置信度够就直接返回;低频复杂意图降级给大模型;最后无论哪个模型,置信度不够都走兜底,绝不硬猜。
2. 一定要加置信度阈值
大模型判断完意图之后,不是直接就信了。我们会看它的置信度,如果置信度不够高,就走兜底流程,要么反问用户,要么转人工。
别觉得有了大模型就万事大吉了,它也会犯错。有个兜底机制,系统才稳。
3. 上下文很重要
很多意图不是单看一句话就能判断的。用户前面问了什么,会影响后面这句话的意思。
比如用户说 “那这个呢?”,单独看这句话根本不知道啥意思,但结合上下文就清楚了。所以做意图识别的时候,一定要把上下文信息带上,不要光看当前这一句。
最后说两句
意图识别这个技术,从规则到传统机器学习再到大模型,走了这么多年,现在算是到了一个比较成熟的阶段。
但不是说用了大模型就高枕无忧了。工程落地的时候,还是要结合自己的业务场景,该用什么方案就用什么方案,别盲目追新技术。
有什么问题评论区交流。