know-engine

意图识别如何实现?如何优化?

意图识别是很多Agent中的核心任务,主要目的从用户输入中准确判断其背后的语义目标(如“查询订单”、“订机票”、“退货申请”等)。 往往很多智能体中,在意图识别之后,会把用户请求路由给不同的子agent来处理,所以意图识别至关重要,…

TL;DR

意图识别是很多Agent中的核心任务,主要目的从用户输入中准确判断其背后的语义目标(如“查询订单”、“订机票”、“退货申请”等)。 往往很多智能体中,在意图识别之后,会把用户请求路由给不同的子agent来处理,所以意图识别至关重要,…

意图识别是很多Agent中的核心任务,主要目的从用户输入中准确判断其背后的语义目标(如“查询订单”、“订机票”、“退货申请”等)。 往往很多智能体中,在意图识别之后,会把用户请求路由给不同的子agent来处理,所以意图识别至关重要,一旦意图识别识别错了,那么最终的执行结果往往也会错。 我们介绍下通常的意图识别方案。(项目中不一定都会用,但是还是给大家讲下。) 意图识别最简单也是最常用的方案,就是提示词工程。

提示词工程

在意图识别的提示词工程中,主要会用到角色定义、fow-shot 以及结构化输出。如:

## 角色定义

你是一个专业的客服意图识别专家。请分析用户的输入,判断是否与汽车相关,并识别其意图和关键信息。为了确保高准确率,请在输出最终结果前,先进行逻辑推理和分析。

## 相关性判断
  首先判断用户输入是否与“汽车”相关(如买车、用车、修车、投诉等)。
  如果不相关,直接输出:{"related": false}
  如果相关,继续执行以下步骤。
## 意图分类体系

1.  **售前咨询与购买**
    - 涵盖:车型配置询问、价格/优惠/购车政策、试驾预约、经销商/门店查询、库存查询。
    - 特征:用户处于“看车/买车”阶段。
2.  **售后维修与保养**
    - 涵盖:进店维修预约、故障报修(明确要求去店里)、保养服务、维修进度查询、配件价格询问。
    - 特征:用户处于“修车/养车”阶段,有明确的进店或人工服务需求。
3.  **车辆使用与技术指导**
    - 涵盖:车辆功能操作(如“怎么开天窗”)、仪表盘/故障灯解读、用车技巧、零部件更换教程(DIY)、技术原理咨询。
    - 特征:用户处于“用车”阶段,需求是“学习如何操作”或“了解原理”,而非直接要求进店维修。
    - *辨析:* “雨刮器怎么换”属于此类(教程);“雨刮器坏了去换一下”属于售后维修。
4.  **投诉与维权**
    - 涵盖:产品质量投诉(异响、死机等)、服务态度投诉、维修争议、法律/安全诉求。
    - 特征:用户带有负面情绪,表达不满或追责意愿。
5.  **客户关怀与运营**
    - 涵盖:会员权益、活动邀约、满意度回访、积分兑换。
6.  **闲聊与通用问答**
    - 涵盖:打招呼、无意义字符、与汽车无关的闲聊(如天气、育儿)。
    - 注意:此类 `related` 字段应为 `false`。
7.  **其他**
    - 涵盖:无法归类到以上任何一项的汽车相关模糊意图。


## 输出格式示例

{
  "related": true,
  "intent": "技术支持与使用"
}

这种方案的优点在于简单高效。通过提示词设计,无需添加复杂的额外算法或模型架构,就可使 AI 智能体快速具备意图识别。比较适合意图数量较少的情况(如10个以内)。 但是缺点也比较明显,就是当意图数量增多的时候,需要给每一个意图都编写对应的fowshot、cot等内容,不仅提示词会迅速膨胀,而且也会导致模型很难精准的捕捉到准确的意图而导致识别失败。 而且,对于方言、口语化等特异表达的识别效果不稳定,出现Bad Case后,只能通过修改提示词来修复,过程繁琐且效果难以保证。

提示词工程+槽位

在提示词工程的方案的基础上,引入槽位抽取的手段。槽位抽取就是让LLM从用户的问题中抽取的特定信息(即“槽位”),例如“订机票”意图需要抽取“出发地”、“目的地”、“时间”等。 比如,上面的提示词可以优化如下:

## 角色定义

你是一个专业的客服意图识别专家。请分析用户的输入,判断是否与汽车相关,并识别其意图和关键信息。为了确保高准确率,请在输出最终结果前,先进行逻辑推理和分析。

## 相关性判断
  首先判断用户输入是否与“汽车”相关(如买车、用车、修车、投诉等)。
  如果不相关,直接输出:{"related": false}
  如果相关,继续执行以下步骤。

## 意图分类体系

1.  **售前咨询与购买**
    - 涵盖:车型配置询问、价格/优惠/购车政策、试驾预约、经销商/门店查询、库存查询。
    - 特征:用户处于“看车/买车”阶段。
2.  **售后维修与保养**
    - 涵盖:进店维修预约、故障报修(明确要求去店里)、保养服务、维修进度查询、配件价格询问。
    - 特征:用户处于“修车/养车”阶段,有明确的进店或人工服务需求。
3.  **车辆使用与技术指导**
    - 涵盖:车辆功能操作(如“怎么开天窗”)、仪表盘/故障灯解读、用车技巧、零部件更换教程(DIY)、技术原理咨询。
    - 特征:用户处于“用车”阶段,需求是“学习如何操作”或“了解原理”,而非直接要求进店维修。
    - *辨析:* “雨刮器怎么换”属于此类(教程);“雨刮器坏了去换一下”属于售后维修。
4.  **投诉与维权**
    - 涵盖:产品质量投诉(异响、死机等)、服务态度投诉、维修争议、法律/安全诉求。
    - 特征:用户带有负面情绪,表达不满或追责意愿。
5.  **客户关怀与运营**
    - 涵盖:会员权益、活动邀约、满意度回访、积分兑换。
6.  **闲聊与通用问答**
    - 涵盖:打招呼、无意义字符、与汽车无关的闲聊(如天气、育儿)。
    - 注意:此类 `related` 字段应为 `false`。
7.  **其他**
    - 涵盖:无法归类到以上任何一项的汽车相关模糊意图。


## 关键信息提取

  提取以下信息,如果没有提到则填 null:
  car_model:车型(如 "A6L")
  order_id:订单号/合同号
  dealer:经销商/门店名称
  fault_description:故障现象描述
  appointment_time:预约时间
  part_name:配件名称(如 "轮胎")
  function_name:功能名称(如 "自动泊车")
  warning_light:故障灯名称(如 "发动机灯")

## 输出格式示例

{
  "related": true,
  "intent": "用户意图",
  "entities": {
    "car_model": "...",
    "order_id": "...",
    "dealer": "...",
    "fault_description": "...",
    "appointment_time": "...",
    "part_name": "...",
    "function_name": "...",
    "warning_light": "..."
  }
}

这个方案会让后置的处理更加方便,因为在意图分析节点中可以直接做关键信息提取了,但是有个缺点,那就是如果意图太多,或者槽位太多的话,需要不断的调整提示词,并且也会影响输出效果。 那么,可以的优化手段是,把意图分析提示词,和槽位提取提示词做分离。

提示词、槽位分离

即整个意图识别分为两个节点:意图识别、槽位抽取。 1. 意图识别节点:提示词只包含所有意图的简要描述,负责快速判断用户输入的意图类别。 2. 槽位抽取节点:一旦意图被识别,系统会路由到该意图专属的槽位抽取节点。这个节点的提示词只关注当前意图需要抽取的特定信息(即“槽位”),例如“订机票”意图需要抽取“出发地”、“目的地”、“时间”等。 这个方案的优点是,架构清晰,易于维护,新增或修改某个意图时,只需调整对应的槽位抽取节点,不影响其他部分。而且每个抽槽节点的职责单一且明确,仅专注于对应意图所关联信息的抽取任务,避免了多意图抽槽任务交叉可能带来的干扰与冲突。 同时,这种设计使得槽位提取的LLM节点不会受到其他无关意图信息的干扰,能够更加专注于对复杂文本语境中的关键要素进行捕捉与解读。 这个方案最大的缺点就是,由于需要串联调用两次或多次LLM,总的响应时间会变长,可能不适合对实时性要求极高的场景。 此方案适合意图分支较多(如10-20个)、业务逻辑复杂,但对响应延迟有一定容忍度的场景,例如企业内部的业务咨询系统。

前置RAG召回

前面的方案如果你用了,还是发现有不准确,效果不好等问题的话,那么说明你的业务场景比较复杂了,因为如果用户的提问涉及到大量方言、口语化或非常规表达时,前两种依赖模型实时泛化的方案可能力不从心。 有一种解决办法,那就是引入参数量更大,更强大的模型,因为他们的泛化能力会更强,往往可以提升召回效果。但是成本和响应时长也扛不住。所以并不是长久之计。 于是,有了一种引入RAG技术来增强系统的泛化能力的方案,那就是靠RAG做前置召回。 1. 构建意图语料库:为每个意图预先收集和生成大量的用户问法(Query),包括标准问法、同义句、口语化表达、方言等,形成一个“意图泛化知识库”。 2. 检索辅助识别:当用户提问时,系统首先将用户输入与“意图泛化知识库”进行语义相似度检索,找出最相似的几条问法及其对应的意图。 3. LLM辅助决策:将检索到的相似问法作为示例(Few-shot),连同用户的原始问题一起提交给LLM,让模型基于这些参考示例来做出更准确的意图判断。 这个方案的优点是,泛化能力可控,对于无法识别的特异表达,只需将其添加到知识库中即可,无需反复调试提示词,修复Bad Case速度快。而且成本与准确率更优,由于有知识库的辅助,可以选用性价比更高的小模型,同时意图识别的准确率也能得到显著提升。 缺点首先是研发成本高,需要单独搞一套RAG,其次的话就是不擅处理多轮对话,此方案主要基于单轮用户输入进行检索,难以结合历史对话上下文来综合判断意图。 所以一般适用于以单轮对话为主,但存在大量特异表达的垂直领域场景,如地铁公交查询、地域化客服系统等。

多轮对话上下文关联

现实中的用户需求往往是多轮的。例如,用户先说“我要打车”,接着补充“去公司”。此时,必须结合历史对话才能准确识别出完整的意图是“打车去公司”。 一个常见的优化手段是,在意图识别时,将用户的历史对话、近期操作的文档或数据作为辅助信息输入给模型,帮助模型理解当前请求的完整上下文。高阶方案会将意图识别与槽位抽取合并,并升级为多轮RAG召回,以同时兼顾多轮理解和效率。

问题澄清

前面我们也讲过问题澄清,其实当用户的需求非常模糊或关键信息缺失时,与其猜测,不如主动询问。 设计一个澄清机制。当模型判断意图置信度不高或关键槽位缺失时,不是直接执行或报错,而是通过引导式提问让用户补充信息。例如,用户说“安排下周的会议”,系统可以反问“请问会议的主题和预计时长是?”。

版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。