AI 智能体实战:意图识别提升之道
概述
我们在构建AI智能体的过程中,意图识别和槽位抽取是自然语言理解(NLU)的两个关键部分,会直接影响智能体的交互质量和用户体验。
意图识别(Intent Detection)的核心作用在于准确判断用户的语义目的。系统能将用户输入映射到预定义的意图类别(如"查询天气"、"预订餐厅"),这一步骤决定了后续业务流程的正确走向。若意图识别错误,整个对话流程就会偏离用户真实需求。
槽位抽取(Slot Filling)则负责结构化关键信息。从语句中提取出时间、地点、数量等实体参数。这些槽位值构成了执行具体操作的必备参数。例如在订餐场景中,必须准确提取"菜品名称"、"送餐地址"等核心槽位。
二者共同构成语义解析的完整链路,直接影响对话状态的准确性。
我们团队在过去一年中,负责开发了十余个智能体,进行了上百次迭代开发任务,通过不断掉坑和爬坑的过程,逐步探索出一套完善的方法论,显著提升了意图识别和槽位抽取的准确性,并附上了详实的数据对比,以供大家参考。
初级方案A(提示词工程)
这是我们最初采用的方案,也是当前多数智能体所采用的常见方法。在单一模型节点中,通过精心设计的提示词优化,实现意图识别与槽位抽取任务。

提示词工程进行意图识别和槽位提取主要涵盖三个关键模块。
首先是 “定义意图槽位”,此处需精准框定智能体需识别的各类意图范畴,以及对应槽位的名称、数据类型与取值范围,如同为智能体打造详尽的任务字典。
其次是 “每个意图和槽位的 Few-Shot + CoT”,为每个意图搭配 Few-Shot 示例,就像给智能体提供典型范例,使其领会如何从输入文本精准抽取槽位信息;同时融入 CoT,引导智能体逐步剖析用户输入,剖析语义结构,定位关键信息。
最后是 “输出格式”,明确规定智能体以结构化格式(如 JSON、XML 等标准数据格式)输出识别结果,确保后续系统能便捷解析利用,提升交互流程的连贯性与效率。
提示词关键部分
(1)定义意图槽位
### 技能. 旅行相关的意图识别
你的任务是根据技能1理解的最新提问,在以下意图类型中进行分类,并抽取相应的参数:
1.交通出行
- 描述: 用户问题是需要网约车、地铁、出租车等交通服务推荐的问题,比如:“帮我要打个出租车”,“帮我要打个网约车”,“我要坐地铁去野生动物园”,“怎么做网约车”。
- 参数:
- 交通方式: 用户提问的交通类型,从用户历史提问中提取交通方式,只提取网约车、地铁、出租车、公交车、其它这几类,如果提问是打车去某个位置,提取为:网约车,坐几路车能去宋城,提取为:公交车,如果如果提问没明确,可为空。
- 位置意图: 附近位置/实际位置,提问包含"附近","旁边","周边",为附近位置,否则是实际位置。比如"附近的厕所/小卖部/便利店/寄存点/码头/售票处/吸烟区"。
- 出发地: 提问中的出发地名称/当前位置,如南大门附近洗手间,提取为南大门,如果是提问杭州东站6号上车点,提取为:6号上车点,如果未明确,默认是当前位置
- 目的地位置类型: 提问中的目的地名称/设施名,如带我去东方明珠电视台,提取为东方明珠电视台;我附近的停车场,提取为停车场,未明确,不返回该参数。
- 地铁线路:提问中包含地铁线路,只提取数字,不要提取汉字,如1号线,提取为1。可为空。
- 标签:提问中对网约车上车点的特殊要求标签,只提取人少、最近、其它三个类型。如:帮我找个人最少的网约车上车点,打个车去西湖。帮我在最近的上车点打个车去西湖,提取标签为最近。如果未明确,不返回该参数。
2. 美食导购
- 描述: 用户咨询茶饮,奶茶,火锅,小吃,咖啡,冰淇淋,西餐,美食、餐厅以及本地特色小吃,涉及“吃”相关的信息
- 参数:
- 问题类型: 附近推荐/非附近推荐,提问包含"附近","旁边","周边"相关的是附近推荐,否则非附近推荐
- 出发地: 用户提问中的出发地的地名,如东方明珠附近的美食推荐,提取出发地为东方明珠,提取不到则为当前位置
- 标签: 提问中的关键词,多个标签名用英文逗号‘,’分割开,如果没有明确,可为""。
(2)Few-Shot + CoT
### 下面是一些示例
#### case1
历史提问:空
最新提问:我要打车去杭州野生动物园
<回答>
```JSON
{ "意图类型": "交通出行","参数列表": {"交通方式":"网约车","位置意图": "实际位置", "目标位置": "杭州野生动物园"}}
```
#### case2
历史提问:
Human:我要打车 Assistant:为您查询到杭州东站以下网约车上车点,当前等候情况如下,请选择上车点 Human:帮我在6号上车点打车 Assistant:好的,请提供你要打车前往目的地的详细地址。
最新提问:蚂蚁a空间
思考过程:历史提问最后一条提问用户想去的目的地,用户最新提问是蚂蚁a空间,蚂蚁a空间是个地名,因此用户是想打车去蚂蚁a空间,提取意图类型为交通出行,交通方式为网约车,位置意图为实际位置,目的位置为蚂蚁a空间。
<回答>
```JSON
{ "意图类型": "交通出行","参数列表": {"交通方式":"网约车","位置意图": "实际位置","目标位置": "蚂蚁a空间"}}
```
#### case3
最新提问:附近有什么吃的
思考过程:判断用户意图是想要找美食,提取意图类型为美食导购。
<回答>
```JSON
{"意图类型": "美食导购","参数列表": {"问题类型": "附近推荐","出发地": "","标签": ""}}
```
(3)限制输出格式
### 输出格式
输出结果应严格遵循以下 JSON 格式:
```json
{"意图类型":"<意图类型>","参数列表":{"实体参数1":"实体参数1的取值","实体参数n":"实体参数n的取值"}}
```
方案特性
优点
此方法的优点在于简单高效。通过提示词设计,无需添加复杂的额外算法或模型架构,就可使 AI 智能体快速具备意图识别和槽位抽取能力。在意图数量较少的情况下,这种方法能以较低成本实现较好效果,能满足用户需求。
缺点
当意图数量增多时,为每个意图定义槽位以及编写相应数量的 Few - Shot + CoT 内容,会使提示词长度大幅膨胀。会给模型带来巨大的处理负担,使模型难以准确地捕捉和理解其中的关键内容,容易出现混淆和错误的关联,进而影响其对意图和槽位的准确识别和抽取。
适用场景
该方案更加适用于那些意图分支相对较少,且业务场景对识别准确性具有一定容错空间的场景。
中级方案B(意图和抽槽节点分离)
为应对复杂意图分支场景,方案A所导致的提示词(prompt)膨胀以及准确性不足的问题。经过一段时间的探索与实践,我们采用了意图识别与槽位提取分离的优化方案。

方案特性
优点
从系统结构层面来看,一个意图关联一个抽槽节点的配置方式,使得系统架构在逻辑上更为清晰简洁,极大地降低了结构的复杂程度,为后续的系统维护与功能迭代提供了极大的便利。这种对应关系确保了每个抽槽节点的职责单一且明确,仅专注于对应意图所关联信息的抽取任务,避免了多意图抽槽任务交叉可能带来的干扰与冲突。
同时,这种设计允许 prompt 长度支持更大,因为模型在对单意图进行语义解析时,不会受到其他无关意图信息的干扰,能够更加专注于对复杂文本语境中的关键要素进行捕捉与解读。
这种解耦架构在面对复杂多变的业务场景和不断变化的用户需求时,展现出了较强的适应能力。当需要新增或修改某个意图及其对应的抽槽规则时,只需针对相应的抽槽节点进行调整,而无需对整个系统架构进行大规模的重构,大大提高了系统的可维护性和可扩展性,确保了智能体能够快速响应业务变化,持续保持高效的语义理解与信息抽取能力,为各种应用场景提供精准、可靠的服务支持。
缺点
这种架构下,每个意图和抽槽都是独立的节点,这意味着在实际运行中,系统需要分别调用AI来处理意图识别和抽槽任务,这无疑增加了系统的调用次数。每一次调用都需要消耗一定的计算资源和时间,这就导致了整体系统的延迟增大。
这种延迟对于一些对实时性要求较高的应用场景来说,可能会成为一个明显的问题,影响用户体验。
适用场景
该方案更加适用于那些意图分支较为复杂且繁多,同时对延迟敏感度较低的业务场景,在这些场景下,其优势能够得到更充分发挥。
进阶方案C(意图识别优化:前置意图Rag召回)
进阶背景
按照前面的方案,我们研发并上线了一些 AI 智能体。客户用下来之后,反馈智能体不够智能,主要问题集中在智能体不能准确识别出客户想要表达的意思。
通过我们和业主、客户多次沟通交流,发现客户真正想要的是智能体能够理解准确各种各样、形式各异但意思相近的问题(比如方言类、反问语气、情绪化语气等),这就要求 LLM 节点得有很强的泛化和识别能力。
采用参数大、满血的大语言模型会比参数小的模型泛化能力强,固然准确性会有所提升。但这种大模型节点存在一些局限性,无法通过人工方式进行有效控制,难以快速修复 Bad Case,且满血模型的使用成本和响应时长也会升高。
所以,如何将特异的问题问题对应到准确的意图上,是阶段性的重点任务。经过研究,最后采用了LLM提前泛化意图的方法,再通过 RAG 召回的方式,来解决之前那些智能体意图识别不准确的问题。
方案说明

在前期方案基础上,我们加入了 RAG 召回能力,专门解决垂类领域和特异性表达Query的意图识别。在知识库里上传大量意图分类知识,用户提问时,先用 RAG 召回找到相似的 query 和意图对应关系,作为案例提交给 LLM 处理,让大模型更好地理解垂类或个性化分类判定逻辑。
这个方案对模型推理和泛化能力要求不高,建议选用性价比高的 qwen-turbo、qwen-plus 等模型。
意图知识库工作
(1)意图语料种子
首先,我们要根据具体的垂类行业来确定意图分类,以及对每个意图进行精准的描述。
接下来,通过人工构造和收集线上的 Query 来获取意图语料。由于下一步要进行模型泛化,所以这里的种子语料数量最好能多一些,尽量达到 30~50 个左右。
(2)意图数据泛化
利用 LLM 对种子语料生成一批同义句,运用基模理解强化机制进行同义替换,实现全面覆盖。
每个意图都需要包含多种句式变体,涵盖口语化表达、地域化表达以及反问句转化训练等内容。例如,将「难道没有坐车的码吗?」这样的反问句,准确映射至「打卡乘车码」这一意图。
泛化意图query代码示例
from datetime import datetime
from openai import OpenAI
base_url = "xxxxx"
api_key = "xxxxx"
client = OpenAI(
base_url=base_url,
api_key=api_key,
)
if __name__ == "__main__":
from datetime import datetime
now = datetime.now()
intent = "查线路途经站点"
desc = "咨询某条公交线路或者某些公交线路路过哪些站点的问题"
file_path = f"./data/{intent}.txt" ## 待扩充的原始语料
with open(file_path,'r',encoding='utf-8') as file:
data_raw = file.readlines()
data_raw = [data.strip() for data in data_raw]
data_pre = data_raw[:100]
prefix = "我们是一个提供上海公交查询服务的一个应用平台,用户会在线上对我们进行提问.不同的问题,对应不同的意图.请你模拟线上真实用户,生成10条意图为<{}>的不同用户指令或提问,此意图含义为<{}>,生成时风格要口语化、简洁.避免礼貌用语."
styles = ["下面给你一些例子:",
"你的提问风格应该是直接命令式的,直接了当,用词简短,可省略部分信息,不超过12个字,下面给你一些例子:",
"你的提问风格应该是询问式的,用户以疑问句的形式提出问题,语言简短.不超过15个字,下面给你一些例子:",
"你的提问风格应该是描述性的,提问时提供一些背景信息或需求描述,下面给你一些例子:"]
input_data = []
prefix = prefix.format(intent, desc)
for style in styles:
for i in range(len(data_pre)):
if i<len(data_pre)-2:
prompt = prefix + style + data_pre[i] +','+data_pre[i+1]+','+data_pre[i+2]
input_data.append(prompt)
input_data = input_data[:100]
print(len(input_data))
for item in input_data:
completion = client.chat.completions.create(
model="Bailing-4.0-80B-64K-Chat-20250108",
messages=[
{"role": "user", "content": item}
]
)
result = completion.choices[0].message.content
print(result)
示例:泛化后【打开乘车码】意图的query列表
打开乘车码意图(泛化后的query)
把我的地铁乘车码调出来。
把我的地铁乘车码展示一下。
帮我扫码进地铁站。
帮我显示上海地铁乘车码
乘车码
乘车码给我
乘车码在哪
乘车码怎么用
乘地铁扫码
乘地铁怎么扫码
出地铁站
出地铁站扫码
出站二维码
出站口在哪儿,扫码出站
出站扫码
出站扫码,地铁码拉出来。
出站扫码怎么弄
出站需要扫码
出站需要扫码,帮我看看
出站需要扫码,我现在要出站。
出站要扫码,地铁码在哪?
出站用二维码
出站用哪个二维码
出站用扫码,怎么弄
出站用扫码吗?
出站怎么扫码
打开乘车码
打开乘车码,进地铁站
打开乘车码,我要进地铁站
打开我的乘车码,我要坐地铁
打开我的地铁乘车码
打开我的地铁二维码。
地铁乘车码
地铁乘车码在哪
地铁乘车码怎么弄
地铁乘车码怎么生成?
地铁乘车码怎么用
地铁出站扫码
地铁二维码
地铁进站
地铁进站二维码
地铁进站码
地铁进站扫码
地铁进站扫码在哪?
地铁卡扫码
地铁卡怎么扫码
地铁扫码
地铁扫码乘车
地铁扫码乘车,怎么弄?
地铁扫码乘车步骤
地铁扫码乘车步骤是什么?
地铁扫码乘车流程
地铁扫码乘车码怎么弄
地铁扫码乘车怎么操作
地铁扫码乘车怎么弄?
地铁扫码出站
地铁扫码出站怎么操作
地铁扫码进站
地铁扫码进站怎么操作?
地铁扫码流程
地铁扫码怎么弄
地铁扫码怎么弄?
地铁扫码怎么用
二维码乘车码在哪
给我乘车码
给我打开地铁乘车码
给我打开地铁扫码乘车
给我地铁乘车码
给我地铁的二维码
给我调出地铁乘车码
给我调出上海地铁的乘车码。
给我个乘车码
给我个地铁乘车二维码
给我个地铁乘车二维码。
给我个地铁乘车码
给我个一号线的地铁乘车码
给我看看乘车二维码
给我看看乘车码
给我看看地铁乘车码
给我看看地铁的乘车码。
给我看看我的地铁乘车码
给我看看我的地铁乘车码。