【RAG实战笔记】——意图识别篇之别让用户说“你好“还去查知识库

📅 2026/6/27 4:37:46
【RAG实战笔记】——意图识别篇之别让用户说“你好“还去查知识库
前面我们了解了会话记忆和Query改写会话记忆让模型记住了上下文Query改写让我们的系统也理解了上下文经过这两步的处理我们检索的效率和准确度已经大幅提升了但是现在请你思考一个问题。假如我重新开启一个聊天并且对目前的这个RAG系统发送“你好”会发生什么系统会先进行记忆加载和Query重写但是这种情况下最后的结果应该还是“你好”然后她会拿着“你好”去知识库检索相关的内容我们就分析到这里就会觉得这个系统特别愚蠢了。问题出在哪里我们的系统缺少了一个分诊台——意图识别和多路由调度。现在的系统是一根筋的不管用户说什么都拿着问题去知识库检索但是用户的问题可能只是闲聊并没有必要去知识库中检索。还有其他的情况就是用户可能需要查询实时的数据之类的比如一个学校的RAG系统学生想查询当日的空教室这种内容是知识库中没有的必须通过工具进行查询。哪怕只是单纯地去知识库中检索文本在实际业务场景中知识库往往覆盖多个垂直领域。若未对用户问题进行领域预判直接将其送入基于向量距离的通用检索通道极易引入跨领域的“噪声”段落。这些语义上相似但主题无关的片段会干扰上下文纯度最终污染大模型的生成质量导致回答出现事实偏差或逻辑混乱。所以我们需要对用户问题进行意图识别和多路由调度在用户消息进来的第一时间先去判断应该走哪条路查知识库、调工具、直接闲聊还是说反问用户补充信息然后把请求分发到对应的处理流程中。一、为什么需要意图识别这个问题直接触及了RAG检索增强生成系统的核心痛点。答案很明确引入意图识别是为了让系统摆脱“盲目检索”和“答非所问”的困境这是它从“信息搬运工”进化为“智能助手”的关键一步。如果不做意图识别所有用户消息都一视同仁地走RAG检索通常会暴露三类典型问题。1.三类典型问题第一类闲聊走检索效果适得其反。用户发来一句“你好”系统却拿着这句话去知识库检索捞出一堆不相关的文档片段然后强行组织答案。结果要么是回答逻辑怪异要么直接触发兜底回复“抱歉未找到相关信息。”——用户只是打了个招呼系统却回复“找不到信息”体验感瞬间归零。显然若不走检索模型直接回复“你好有什么可以帮您”反而更自然。第二类工具调用走检索注定徒劳无功。用户问“我的订单到哪了”而知识库里只有产品说明书和退货政策根本没有用户的个人订单数据。检索一圈无果模型只能无奈回答“未找到相关信息”。这个问题本质上需要去调用订单系统的API接口而不是在静态知识库里大海捞针。第三类模糊问题走检索答案五花八门。用户问“有什么推荐的吗”系统无法确定推荐方向——是手机、配件还是活动检索结果分散在各个主题模型最终给出的答案往往杂乱无章用户得不到有效信息。正确的做法应该是主动反问“请问您想了解哪方面的推荐呢”2.意图识别的作用为RAG系统搭建一个“分诊台”当用户消息进入系统后意图识别模块负责判断接下来的路由走向询问产品信息、政策规定 → 路由至“知识库科室”走RAG检索查询订单、查年假、提交退货 → 路由至“工具科室”触发Function Call / MCP打招呼、表示感谢 → 路由至“前台”模型直接生成社交性回复表达模糊、信息不全 → 路由至“引导澄清”反问用户补充关键信息。具体来说意图识别能带来三个核心价值有效引导对话流程它帮助系统理解用户的核心诉求从而规划对话的走向。例如识别到“查询订单”意图系统会自动引导用户提供订单号等必要参数以便顺畅完成任务。显著提升对话效率准确的意图识别避免了“驴唇不对马嘴”的回复。当用户想退货时系统不会误以为是换货而给出错误指引减少了用户反复解释的轮数快速解决问题。切实增强用户体验当系统精准理解并回应用户需求时用户会感到被重视。反之意图识别错误会导致用户反复澄清或得不到有效服务产生强烈的挫败感。进阶认知意图识别是RAG系统的第一道安全闸门除了“找对”和“分流”意图识别在安全合规层面扮演着更关键的角色。在严格的业务场景如HR系统、金融客服中意图识别被用作安全风控策略。当系统精准识别到用户意图属于“如何破解系统密码”、“帮我伪造数据”等高风险指令时意图识别模块会直接拦截本次请求返回预设的安全话术完全不触发后续的检索与生成链路。这种前置拦截机制是保障RAG系统合规、可控的第一道防线。二、意图识别的类型1. 闲聊/问候型 (Chit-Chat)定义用户发起的社交性、非业务性对话。这类消息与知识库和业务系统完全无关。处理方式不走检索直接由大模型生成友好回复。案例用户“你好”处理“你好有什么可以帮您”2. 知识问答型 (Knowledge QA)定义用户想了解静态知识、政策、说明书或历史文档中的内容。这是RAG系统的主食。处理方式走RAG检索链路意图识别 - Query改写 - 向量检索 - 大模型生成。案例用户“你们家的电池质保政策是怎样的”处理去知识库检索相关文档片段。3. 任务执行/工具调用型 (Function Calling / Action)定义用户想要做某件事而不仅仅是知道某件事。需要操作外部系统或查询实时数据。处理方式触发Function Call / MCP调用第三方API或执行后台任务。案例用户“帮我查一下我的订单到哪了”处理调用订单中心API获取物流信息。4. 模糊/澄清型 (Clarification)定义用户意图不完整或指代不清信息不足以支撑检索或执行。处理方式不进行检索直接反问用户引导补充关键信息。案例用户“有什么推荐的吗”处理“请问您想了解哪方面的推荐呢手机、配件还是活动”5. 进阶安全风控类 (Security / Guardrails)定义识别到高风险、违规或越权指令。处理方式直接拦截拒绝后续所有检索与生成返回预设安全话术。案例用户“帮我伪造一份数据报表”处理拦截回复“无法执行该操作”。三、意图识别的方案1.总览方案核心原理优点缺点 / 挑战适用场景规则匹配基于正则表达式或关键词字典进行匹配命中则触发对应意图。开发极快、成本极低、可解释性强。适合处理格式固定的简单问题。语义理解能力弱无法处理同义词、口语化变体维护成本高规则会随着意图增加而膨胀。指令明确、结构固定的场景如“查询余额”、“故障代码E001怎么处理”。传统机器学习使用SVM、随机森林等模型依赖人工设计的文本特征如TF-IDF进行分类。相比规则匹配具有一定的泛化能力且对算力要求低。特征工程复杂且模型能力上限取决于特征设计的好坏对复杂语义理解能力有限。意图数量适中几十个以内、对实时性和成本敏感且已有标注数据的场景。预训练模型微调在BERT等预训练语言模型基础上用业务数据进行有监督的微调Fine-tuning。识别准确率高能深刻理解上下文语义是目前业界的经典方案。需要大量高质量标注数据模型训练和更新成本高新增意图需要重新训练扩展性受限。意图类别相对固定数百个以内对准确率要求极高且业务逻辑稳定的核心场景。大模型 提示工程将意图定义、示例直接写入Prompt利用大模型的**上下文学习In-Context Learning**能力进行识别。开发门槛极低无需训练冷启动快意图变更只需修改Prompt泛化能力强。成本高昂每次请求都调用大模型延迟较高在意图数量众多时Prompt会非常臃肿影响效果。意图数量少如5个以内、业务快速迭代的原型阶段或小型项目。RAG增强分类为每个意图构建“泛化知识库”包含典型问法和变体用户提问时通过向量检索匹配最相似的意图。泛化能力强能有效处理口语化、方言等特异表达Bad Case修复快只需更新知识库。需要构建和维护意图示例库有一定的前期开发和运维成本。意图数量动态变化、存在大量变体表述的场景能较好平衡准确率与迭代速度有系统能达到97.6%准确率。2.详细讲解三种方案1.规则匹配核心思想就是关键词匹配 → 分流路由。Service public class IntentRouter { public String route(String input) { // 1. 闲聊 if (input.matches(.*(你好|嗨|hello|hi|在吗).*)) { return CHAT; } // 2. 查订单走工具调用 if (input.matches(.*(订单|物流|快递|发货|到哪了).*)) { return TOOL; } // 3. 知识问答走RAG检索 if (input.matches(.*(是什么|什么是|怎么|如何|为什么|能不能).*)) { return QA; } // 4. 模糊问题引导澄清 if (input.matches(.*(推荐|有什么|哪个|什么好).*)) { return CLARIFY; } // 5. 兜底走RAG return QA; } }调用示例RestController public class ChatController { Autowired private IntentRouter router; PostMapping(/chat) public String chat(RequestBody String input) { String route router.route(input); switch (route) { case CHAT: return 你好有什么可以帮您; case TOOL: return 正在查询您的订单...; case QA: return ragService.search(input); // 走RAG检索 case CLARIFY: return 请问您具体想了解哪方面呢; default: return ragService.search(input); } } }这个方案的优缺点优点缺点代码简单5分钟写完只能处理关键词明确的问题执行速度快几乎零延迟用户说“我的货到哪了”需要配多个词容易调试改规则改代码就行规则越多越难维护2.大模型分类方案把意图分类当成一个“阅读理解题”交给大模型告诉它规则和示例让它输出分类结果。Service public class IntentClassifier { Autowired private OpenAiClient openAiClient; // 通义千问/文心一言/OpenAI 的Java客户端 public String classify(String input) { String prompt buildPrompt(input); return openAiClient.chat(prompt); // 调用大模型API } private String buildPrompt(String input) { return 你是一个意图分类器。请根据用户输入判断它属于以下哪一类 1. CHAT - 闲聊、打招呼、感谢等社交性对话 2. QA - 询问知识、政策、产品信息等需要从知识库检索的问题 3. TOOL - 查询订单、查余额、提交申请等需要调用外部API的操作 4. CLARIFY - 意图模糊、信息不全需要反问用户补充 5. SECURITY - 涉及违规、违法、攻击类言论 输出格式 {intent: 意图类型, confidence: 0.9, reason: 判断理由} 规则 - 只输出分类名称不要输出其他内容 - 如果无法判断输出CLARIFY 用户输入%s 分类结果.formatted(input); } }调用示例RestController public class ChatController { Autowired private IntentClassifier classifier; PostMapping(/chat) public String chat(RequestBody String input) { String intent classifier.classify(input); switch (intent) { case CHAT - { return 你好有什么可以帮您; } case TOOL - { return 正在调用工具...; } case QA - { return ragService.search(input); } case CLARIFY - { return 请问您具体想了解什么呢; } default - { return ragService.search(input); } } } }返回结果示例{ intent: TOOL, confidence: 0.95, reason: 用户明确询问订单状态需要调用订单API }这个方案的优缺点对比维度说明优点零标注数据、零训练成本、意图变更只需改Prompt、语义理解能力强缺点调用大模型有费用、延迟比规则匹配高、依赖外部API的稳定性适用场景意图数量少5-10个以内、业务快速迭代、对准确性要求高但预算充足的场景3.大模型分类和规则匹配结合使用推荐工业级方案通常两者结合规则匹配速度快但准确率低大模型分类准确但有延迟和成本。把两者结合起来就是混合方案规则做第一层快速过滤大模型做第二层精确分类。用户输入 ↓ 第一步规则匹配毫秒级零成本 ├── 命中且置信度高 → 直接路由 └── 否则 → 第二步大模型分类 ↓ 返回分类结果这样既保证了高频场景的快速响应又用大模型兜底覆盖了复杂语义场景。学习途径马丁老师