意图识别怎么做?
一句话结论
混合架构:规则快筛 + 向量检索 + 轻量模型 + LLM 兜底,用"分层漏斗"把简单意图用极低成本快速处理,复杂意图才交给更强但更贵的模型,在准确率、延迟、成本之间取得平衡。
- 综合准确率 93%+(很多团队实测 95% 左右)
- 90% 以上请求 30ms 内响应
- LLM 调用量从 100% 降到 10~30%
核心思想
能用便宜且确定的方法就绝不走贵的方法。
分层过滤、逐级升维——由快到慢、由确定到模糊。
四层漏斗架构
用户输入
↓
【第一层:规则过滤】 <5ms 拦截 10~20% 流量
├─ 命中 → 直出
└─ 未命中 ↓
【第二层:轻量分类器】 10~30ms 消化 60~70% 流量
├─ 高置信度 → 业务分流
└─ 低置信度 ↓
【第三层:LLM 复杂解析】 300~1000ms 处理 10~20% 长尾
↓
【第四层:拒识与澄清】 <10ms 兜底 5~10%
↓
最终意图(含置信度、槽位、是否追问)1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
第一层:规则过滤(Rule-based)
目标:< 5ms、100% 确定性,处理高频固定模式。
技术方案
- AC 自动机 / Trie 树:海量关键词高效匹配(敏感词、命令词)
- 正则表达式:结构化文本(订单号、手机号、金额)
- 关键词词表:正/负关键词 + 同义词
- 模板匹配:固定话术
工程要点
- 规则全部配置化(YAML/JSON/数据库),运营可热更新
- 支持优先级、黑白名单、冲突投票
- 覆盖问候、退款、明确指令等强模式意图
第二层:轻量分类器(Small Model)
目标:10~30ms 内消化 70%~80% 常见业务意图。
技术选型对比
| 方案 | 原理 | 延迟 | 适合场景 |
|---|---|---|---|
| FastText | 词向量叠加 + 层次 Softmax | < 2ms | 类别极多、样本极大 |
| SVM/XGBoost | TF-IDF + 机器学习 | < 5ms | 样本较小、特征工程成熟 |
| TinyBERT | 蒸馏后的轻量 Transformer | 10~30ms | 绝大多数高频业务 |
| 向量检索 | Embedding + 相似度(BGE) | <50ms | 意图描述式匹配,新增方便 |
工程实践
- 模型蒸馏:Teacher Model 标数据 → 蒸馏出 3~6 层 TinyBERT,推理提升 5~10 倍
- 联合模型:JointBERT 同时输出意图 + 槽位(NER),一次 Forward 搞定
- 向量方案:每个意图写好"描述",用户 query embedding 后做 topK 检索
- 中文推荐 BGE 系列 embedding + Qdrant / Faiss 向量库
- 新增意图只要加描述,不用重训模型
第三层:LLM 复杂解析
目标:处理长尾、口语化、多意图交织、多轮上下文相关的复杂 Query。
核心能力
1. 多意图分解
"我想退昨天买的鞋子,另外帮我查下积分" →
[{intent: return_item}, {intent: query_points}]
2. 隐晦意图
"这衣服穿两次袖子就开线了,你们怎么处理?" → 传统模型:
product_review→ LLM:after_sales_complaint+ 负面情绪 → 优先补偿
3. 上下文补全
上一轮:"请问您想订哪天的机票?" 用户:"大后天吧" → LLM:
provide_date(date=2026-08-10)
实现方式
- Function Calling / Structured Outputs:强约束 JSON Schema 输出
- 候选意图辅助:把第二层的 topK 候选喂给 LLM,命中率大幅提升
- 本地化 SFT:Qwen-7B / Llama-3-8B 微调,兼顾成本与语义泛化
- RAG 增强:检索相似历史案例、注入多轮上下文
第四层:拒识与澄清(Fallback)
原则:宁可主动询问,也不盲目猜错。
三种触发状态
A. 完全越界(OOD)
电商问"怎么修火箭?" → 话术拒识 + 引导菜单:[退换货] [查物流] [人工]
B. 歧义(Top-2 接近)
intent_A: 0.45,intent_B: 0.42→ 澄清:"您是想查订单,还是改地址?"
C. 槽位缺失
意图明确但缺目的地 → 追问:"请问飞往哪个城市?"
置信度阈值工程
置信度
1.0 ├── [ 直行处理 ]
0.8 ├── [ T_high ] Top-2 接近 → 澄清
0.5 ├── [ T_low ] 低于此值 → 兜底拒识 / 转人工
0.0 └──1
2
3
4
5
2
3
4
5
- 高安全业务(金融):提高 T_high,宁可多问
- 高流畅业务(闲聊):降低 T_high,保对话连贯
用 PR 曲线 / ROC 曲线 在验证集找业务最佳平衡点。
路由与决策工程
- 不确定性路由:向量相似度接近、轻量模型熵高 → 强制走 LLM
- 多意图支持:第三层直接输出意图列表
- Fallback 策略:全部失败 → 默认意图或转人工
- A/B 测试与监控:实时监控每级命中率、准确率、延迟、成本
- 缓存:高频相似 query 直接命中结果
- 全链路日志:记录走了哪一级、为什么、最终结果,方便迭代 Bad Case
总结对照表
| 层级 | 流量占比 | 延迟 | 目标 | 技术手段 |
|---|---|---|---|---|
| 1. 规则过滤 | 10~20% | < 5ms | 强指令、敏感词 | AC 自动机、正则、精确 Map |
| 2. 轻量分类 | 60~70% | 10~30ms | 高频常见意图 | FastText、TinyBERT、向量检索 |
| 3. LLM 解析 | 10~20% | 300~1000ms | 长尾、多意图、复杂 | LLM + Function Call / SFT |
| 4. 拒识澄清 | 5~10% | < 10ms | 歧义、越界防护 | 阈值控流、澄清 Prompt、菜单 |
落地实践建议
- 先统计流量分布——用日志看哪些意图高频、表达是否固定,决定规则覆盖目标
- 意图描述先写好——这是向量层效果的关键
- 阈值必须业务调优——在验证集画 PR 曲线
- 全链路日志——必须记录走了哪级、为什么
- 渐进上线——先规则+向量,再加轻量模型,最后引入 LLM
中文推荐技术栈
- Embedding:BGE 系列
- 轻量模型:Chinese-BERT / RoBERTa-wwm
- LLM:Qwen 系列(性价比高)
- 向量库:Qdrant / Faiss
为什么这套架构能成?
- 简单请求被规则和向量极速解决,本身准确率就高
- 难请求走 LLM,且有候选意图辅助,接近纯 LLM 准确率
- 加权综合准确率 93%+
- 平均延迟被前两级拉低,很多请求几十毫秒完成
- LLM 成本降到 10~30%
- 扩展性好——新意图先加规则/向量描述,实在不行再微调