是否做过意图识别?如果要做意图识别,可以怎么实现
1️⃣ 考察意图
面试官想看的不是你会不会调一个分类模型,而是你对意图识别技术栈的演进有全局认知,能根据业务场景(延迟、数据量、成本)做出工程取舍。刁钻点在于:候选人常只背一种方案(比如BERT微调),但实际生产中规则+小模型+LLM的混合pipeline才是常态。答好了能展示你从传统NLP到LLM时代的系统设计能力,以及处理冷启动、长尾意图、bad case迭代的实战经验。
2️⃣ 标准答
意图识别本质是分类问题,但实现路径随技术演进分三代,选型取决于业务约束。
第一代:规则与统计方法
- 规则引擎:用正则、关键词(如“查余额”匹配“余额”)加槽位提取。优点是零样本、延迟<1ms;缺点是维护成本高,长尾意图覆盖差。
- 传统分类模型:SVM、FastText、TextCNN。需要标注数据,特征工程靠TF-IDF或词向量。FastText在工业界常用,训练快(几分钟),但语义理解弱,对同义表达(“查余额”vs“看看还剩多少钱”)泛化差。
- 工程取舍:规则兜底+模型预测是经典组合。规则处理高频确定意图(如“退订”),模型处理模糊意图,平衡准确率和召回。
第二代:预训练语言模型微调
- BERT/RoBERTa微调:在分类头加一个线性层,用[CLS]向量做分类。数据量建议每类至少200条,5000条可达到90%+准确率。多标签场景用sigmoid+阈值,细粒度分类用层次softmax(如先分“查询”再分“余额查询”)。
- 实战坑与解法:
- 坑1:类别不平衡。客服场景“查询”占70%,“投诉”占5%。解法:Focal Loss或重采样,但重采样可能导致过拟合,推荐用类别权重+数据增强(EDA:同义词替换、回译)。
- 坑2:长尾意图。新意图出现时模型无法识别。解法:设一个“其他”类,并定期用主动学习(如不确定性采样)补充标注。
- 坑3:延迟。BERT推理约50-100ms,无法满足实时场景。解法:蒸馏为TinyBERT或使用ONNX Runtime加速,延迟可压到10ms内。
第三代:基于LLM的零样本/少样本
- Prompt分类:用GPT-4或DeepSeek,通过系统提示定义意图列表,让模型输出类别。例如:“你是一个客服意图分类器,类别有[查询、投诉、退订、其他],请输出最匹配的类别。” 零样本准确率可达80-90%,但成本高(每请求约0.01-0.1元)。
- 思维链(CoT):对复杂意图(如“我昨天买的手机今天降价了,能退差价吗?”),让模型先推理再分类,提升准确率但增加延迟。
- 工程取舍:LLM适合冷启动和长尾意图,但延迟高(1-3秒)、成本贵。实际落地常用“规则→小模型→LLM”三级pipeline:规则先拦截高频意图,小模型处理常见意图,LLM兜底处理模糊或新意图。这样90%请求走规则+小模型,延迟<10ms,仅10%走LLM,成本可控。
系统设计示例:客服对话意图识别系统
- 意图体系:10个类别(查询、投诉、退订、改签、支付、物流、售后、闲聊、其他、转人工)。
- 数据:5000条标注,每类至少200条,人工校验一致性(Kappa>0.8)。
- 方案对比:
- 规则:准确率70%,召回率40%,延迟<1ms。
- BERT微调:准确率92%,召回率88%,延迟50ms。
- GPT-4零样本:准确率88%,召回率85%,延迟2s。
- 混合pipeline:准确率94%,召回率91%,平均延迟15ms。
- 迭代:每周分析bad case,补充规则或微调模型。例如“退款”常被误判为“投诉”,加入正则“退款|退钱”提升召回。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从规则、预训练模型、LLM三个层面回答。规则层用正则和FastText处理高频意图,延迟低但覆盖有限;BERT微调层做主力分类,用Focal Loss解决类别不平衡,蒸馏模型压延迟;LLM层用GPT-4零样本兜底长尾意图,三级pipeline平衡准确率和成本。总结一句:意图识别没有银弹,必须根据业务场景做混合方案,并持续迭代bad case。”
4️⃣ 高频追问 & 应对
追问 1:如果只有100条标注数据,你怎么做意图识别?
冷启动场景。先用规则引擎(正则+关键词)覆盖高频意图,准确率可达70-80%。然后利用LLM零样本能力,通过提示模板生成伪标签(self-training),再用伪标签微调小模型(如DistilBERT)。注意:LLM生成标签需人工校验,否则噪声会放大。最后用主动学习,每次选不确定性最高的样本让人工标注,迭代3-5轮后模型可达到80%+准确率。
追问 2:意图识别中,如何处理“其他”类?它经常误召回。
“其他”类本质是开放集问题。解法:设一个阈值,模型输出概率低于阈值(如0.5)时归为“其他”。但阈值需调优,用验证集找F1最高点。另一种方案是训练一个二分类器(是否属于已知意图),再对已知意图做细分类。实战中,定期分析“其他”类中的高频误判,补充为新意图或加入规则。例如客服场景“其他”类中30%是“转人工”,可单独设一个意图。
追问 3:多语言场景下,意图识别怎么做?
方案一:用多语言BERT(mBERT或XLM-R)微调,数据需覆盖各语言。方案二:先翻译成英文,再用英文模型分类,但翻译延迟高且可能丢失语义。方案三:用LLM零样本,提示模板支持多语言(如“Classify the intent: [中文/英文/日文]”)。工程取舍:mBERT微调准确率最高但需多语言数据;LLM零样本成本高但冷启动快。推荐混合:高频语言用mBERT,低频语言用LLM兜底。
5️⃣ 避坑 · 常见错误答法
- ❌ “我直接用BERT微调,准确率95%以上。” → ✅ 没有银弹,必须说明数据量、类别分布、延迟约束。95%在实验室可能,生产环境常有长尾意图和bad case,准确率会掉到80%以下。
- ❌ “LLM可以完全替代传统方法。” → ✅ LLM成本高、延迟高,不适合高频实时场景。混合pipeline才是工业界主流,规则和小模型处理90%流量,LLM只兜底10%。
- ❌ “意图识别就是分类,用softmax就行。” → ✅ 多标签、层次分类、开放集问题都需要不同策略。例如客服场景“查询+投诉”可能同时出现,需用sigmoid多标签。
6️⃣ 简历呼应
- 如果你有RAG项目:从意图识别作为RAG前置模块切入,说明如何用意图分类决定检索策略(如“查询”走知识库,“操作”走API),并分享你如何用LLM零样本处理冷启动意图。
- 如果你只做过传统NLP:用文本分类经验迁移,强调从SVM到BERT的演进,以及如何处理类别不平衡和长尾意图,展示你对工程取舍的理解。
- 如果你是校招无项目:聚焦论文复现,比如用BERT微调做ATIS数据集(航空订票意图),对比规则、FastText、BERT的效果,并讨论蒸馏模型在延迟上的优化。
- 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
- 《FastText: Enriching Word Vectors with Subword Information》
- 《A Survey on Intent Detection and Slot Filling in Task-Oriented Dialogue Systems》
- 《Zero-Shot Intent Classification with Large Language Models》
- 《Active Learning for Intent Classification: A Practical Guide》