多意图并发识别(用户真实意图是什么?)
1️⃣ 考察意图
面试官想考察你能否跳出“单意图分类”的舒适区,处理真实对话中“用户一句话包含多个诉求”的复杂场景。这是P1进阶题,刁钻点在于:模型输出多个标签后,如何判断哪个是核心意图、哪个是附带意图? 答好了能展示你对多标签分类、序列标注、对话状态跟踪(DST)的工程取舍,以及从模型到对话管理的整条链路落地能力。考察类型是系统设计+工程取舍。
2️⃣ 标准答
多意图并发识别,核心是解决“用户一句话里藏了多个意图”的问题。比如“帮我订明天去北京的机票和酒店”,不能只识别“订机票”或“订酒店”,必须同时识别并处理。我分四步走:
- 模型选型:多标签分类 vs. 序列标注
- 多标签分类:用BERT微调,输出层用sigmoid激活,每个意图独立二分类。优点是简单,适合意图数量固定(如10-20个)的场景。缺点是无法捕捉意图间的顺序或依赖关系(如“先订机票再订酒店”)。
- 序列标注:用BERT+CRF,对每个token打标签(如B-订机票、I-订机票、B-订酒店)。优点是能提取意图对应的槽位(如“明天”是时间,“北京”是目的地),适合复杂对话。缺点是训练数据要求高,需要token级标注。
- 工程取舍:我倾向先用多标签分类快速上线,因为标注成本低;如果用户反馈意图混淆(如“取消订单”和“修改订单”同时出现),再引入序列标注做细粒度解析。
- 意图消歧:上下文+槽位填充
- 用户说“帮我退票”,但历史对话显示刚订了“北京-上海”的票,那“退票”意图明确。如果用户说“帮我改一下”,需要结合当前槽位(如“改时间”还是“改目的地”)来区分。
- 实际落地的坑:多意图中,槽位可能共享。比如“订明天去北京的机票和后天去上海的酒店”,时间槽“明天”和“后天”分别对应机票和酒店。解法是用指针网络或基于span的模型,让每个意图独立抽取槽位,避免混淆。
- 优先级排序:业务规则+模型置信度
- 用户说“帮我取消订单,再重新订一个”,两个意图冲突。我采用两阶段策略:
- 模型置信度排序:取sigmoid输出>0.5的意图,按置信度降序排列。
- 业务规则覆盖:如果“取消”和“预订”同时出现,优先执行“取消”,因为不取消就无法预订。规则写在对话管理层的if-else中,避免模型误判。
- trade-off:完全依赖模型置信度可能导致业务逻辑错误(如高置信度的“取消”但用户实际想“修改”),所以规则兜底是必须的。
- 对话管理:多轮确认 vs. 并行处理
- 多轮确认:适合高风险场景(如金融交易)。用户说“转1000给张三,再查余额”,系统先确认“是否要转1000给张三?”,再执行“查余额”。优点是安全,缺点是对话冗长。
- 并行处理:适合低风险场景(如信息查询)。用户说“北京天气和上海天气”,系统同时查询并返回。优点是快,缺点是如果意图冲突(如“开空调”和“关空调”),需要合并处理。
- 实际落地的坑:并行处理时,多个意图可能依赖同一资源(如查询数据库)。我用异步任务队列(如Celery)并行执行,但设置超时和熔断,避免一个意图失败拖垮整个流程。
- 评估:构建多意图测试集
- 不能用单意图的准确率,必须用多标签F1(每个意图独立计算,再宏平均)。同时,引入意图混淆率:统计用户实际意图和系统识别意图的差异,比如用户说“订机票和酒店”,系统只识别了“订机票”,算一次混淆。
- 具体数字:在订票Agent中,多标签F1达到0.92以上才上线,混淆率控制在5%以内。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从模型选型、意图消歧、优先级排序、对话管理四个层面回答。模型层面,先用多标签分类快速上线,复杂场景用序列标注;消歧层面,结合上下文和槽位填充,用指针网络避免槽位混淆;优先级排序,用模型置信度+业务规则兜底;对话管理,高风险用多轮确认,低风险用并行处理。总结一句:多意图识别不是模型单点问题,而是从标注到对话管理的整条链路工程取舍。”
4️⃣ 高频追问 & 应对
追问 1:如果用户说“帮我订机票和酒店”,但系统只识别出“订机票”,怎么排查问题?
排查三步走:1)检查模型输出:看sigmoid输出中“订酒店”的置信度是否低于阈值(如0.5),如果是,降低阈值或调整训练数据中多意图样本比例。2)检查训练数据:统计训练集中“订机票+订酒店”共现的样本数,如果太少,用数据增强(如随机组合单意图样本)或few-shot学习。3)检查槽位冲突:如果“订酒店”的槽位(如“入住时间”)被“订机票”的槽位(如“出发时间”)覆盖,用指针网络分离槽位抽取。
追问 2:多意图场景下,如何做在线推理优化?模型推理时间太长怎么办?
核心是模型蒸馏+缓存。1)蒸馏:用BERT-large蒸馏成TinyBERT或DistilBERT,推理速度提升3-5倍,F1下降不到1%。2)缓存:对高频意图组合(如“订机票+订酒店”)做结果缓存,命中率可达30%。3)异步处理:如果用户意图可并行(如“查天气+查新闻”),用异步推理,主线程先返回部分结果。trade-off是缓存可能过期(如“查今天天气”),所以设置TTL(如5分钟)。
追问 3:如果用户意图是模糊的,比如“帮我看看”,怎么处理?
用主动学习+多轮澄清。1)模型输出“查看”意图,但置信度低(<0.6),触发澄清轮:系统反问“您想查看订单、余额还是其他?”。2)如果用户历史有“查看订单”的倾向,用上下文优先假设。3)如果用户连续3次模糊,降级到人工客服。trade-off是澄清轮增加对话轮次,所以设置最大澄清次数(如2次),超过则默认执行最高置信度意图。
5️⃣ 避坑 · 常见错误答法
- ❌ “用BERT做多分类,输出一个意图就行。” → ✅ “多意图场景必须用多标签分类(sigmoid输出),否则会丢失信息。比如‘订机票和酒店’只输出‘订机票’,用户会投诉。”
- ❌ “模型识别出多个意图后,直接并行执行。” → ✅ “并行执行前必须做优先级排序,比如‘取消订单’和‘重新预订’冲突,需要先取消再预订,否则业务逻辑出错。”
- ❌ “评估用单意图准确率就行。” → ✅ “必须用多标签F1和意图混淆率,因为单意图准确率会掩盖多意图漏检问题。”
6️⃣ 简历呼应
- 如果你有RAG项目:从“多意图查询分解”角度切入,比如用户问“北京天气和上海天气”,RAG系统需要拆成两个子查询,分别检索后合并结果。强调你用过LangChain的MultiQueryRetriever。
- 如果你只做过传统NLP:用“意图分类+槽位填充”的pipeline类比,比如用CRF做序列标注,但指出多意图场景下需要多标签分类+指针网络,展示你对模型升级的理解。
- 如果你是校招无项目:聚焦论文复现,比如读过《Multi-Intent Natural Language Understanding》或《A Survey on Multi-Intent Detection》,用公开数据集(如MultiWOZ)做demo,展示你对多标签F1和混淆率的理解。
- 《Multi-Intent Natural Language Understanding: A Survey》 - 综述多意图识别方法
- 《BERT for Multi-label Text Classification》 - 多标签分类实战
- 《Pointer Networks for Slot Filling in Multi-Intent Scenarios》 - 槽位分离技术
- 《MultiWOZ: A Large-Scale Multi-Domain Wizard-of-Oz Dataset》 - 多意图对话数据集
- 《LangChain MultiQueryRetriever: Decomposing Complex Queries》 - RAG场景下的多意图分解