Agent 基于大模型接口实现用户意图识别:完整流程与实操
本文介绍了基于大模型API实现用户意图识别的完整流程。首先需要定义清晰的意图分类体系,确保分类互斥且覆盖核心场景。核心步骤包括设计精准Prompt(包含任务目标、意图列表、输出格式和示例)、调用大模型接口(以OpenAI和通义千问为例演示代码实现),以及解析返回结果。关键要点是:通过结构化Prompt引导大模型输出JSON格式结果,设置低temperature保证稳定性,并添加示例提升准确率。该方
基于大模型接口实现用户意图识别:完整流程与实操
通过调用大模型(如GPT-3.5/4、通义千问、文心一言等)的Agent/API接口识别用户意图,核心是让大模型理解用户输入的语义,并输出结构化的意图结果,核心流程为「定义意图体系→设计Prompt→调用接口→解析结果→优化迭代」,以下是详细落地方法:
一、核心原理
大模型的意图识别本质是语义理解+指令遵循:通过精准的Prompt引导大模型将非结构化的用户输入(自然语言),映射到你预定义的「意图分类体系」中,并返回结构化结果(如JSON),而非单纯的文本回复,方便后续业务逻辑调用。
二、前置准备:定义清晰的意图分类体系
意图识别的前提是明确「要识别哪些意图」,分类需满足「互斥、无重叠、覆盖核心场景」,避免模糊。
示例(电商场景):
| 意图分类 | 定义(清晰描述) | 典型用户输入 |
|---|---|---|
| 商品查询 | 询问商品信息(价格、库存、规格、功能) | “这款手机的内存有多大?”“XX商品还有货吗?” |
| 订单咨询 | 询问订单状态、物流、修改地址/退款 | “我的订单什么时候发货?”“怎么申请退款?” |
| 投诉/建议 | 反馈商品/服务问题、提出改进建议 | “收到的商品有破损”“希望增加退货上门服务” |
| 闲聊 | 无业务诉求,纯聊天 | “今天天气怎么样?”“你好呀” |
| 未知意图 | 无法归类到以上类型的输入 | “ABCD1234”(无意义字符) |
关键原则:
- 分类粒度适中:不要过细(如把“查价格”“查库存”拆成两个意图,可合并为“商品查询”),也不要过粗(如“业务咨询”涵盖所有,无实际意义);
- 明确「兜底意图」:如“未知意图”,避免模型无法归类时返回混乱结果。
三、核心步骤:调用大模型接口实现意图识别
步骤1:设计精准的Prompt(核心!决定识别准确率)
Prompt是引导大模型的“指令”,需明确告知模型:任务目标、意图分类列表、输出格式、示例(Few-shot),避免模糊。
通用Prompt模板(可直接复用):
你的任务是识别用户输入的意图,需严格按照以下要求执行:
1. 意图分类列表(仅允许从以下列表中选择):
- 商品查询:询问商品价格、库存、规格、功能等商品相关信息;
- 订单咨询:询问订单状态、物流、退款、改地址等订单相关问题;
- 投诉/建议:反馈商品/服务问题、提出改进建议;
- 闲聊:无业务诉求的纯聊天内容;
- 未知意图:无法归类到以上类型的内容。
2. 输出格式(必须是JSON,不要额外解释):
{
"user_input": "用户原始输入",
"intent": "识别出的意图(严格匹配分类列表)",
"confidence": "意图置信度(0-1,保留2位小数)",
"reason": "识别理由(简要说明为何归为该意图)"
}
3. 示例:
示例1:
用户输入:"我的订单2025XXXX什么时候发货?"
输出:{"user_input":"我的订单2025XXXX什么时候发货?","intent":"订单咨询","confidence":0.99,"reason":"用户询问订单发货时间,属于订单咨询范畴"}
示例2:
用户输入:"你好呀,今天心情不错"
输出:{"user_input":"你好呀,今天心情不错","intent":"闲聊","confidence":0.98,"reason":"用户无业务诉求,仅纯聊天"}
现在开始识别:
用户输入:{user_input}
Prompt优化技巧:
- 明确「禁止发散」:强调“仅从指定分类选择”“输出格式必须是JSON”,避免模型返回多余文本;
- 增加示例(Few-shot):3-5个示例可大幅提升准确率,覆盖核心场景+边缘场景;
- 控制温度(temperature):调用接口时设置
temperature=0.1~0.3(越低越稳定,避免模型返回随机结果)。
步骤2:调用大模型接口(以Python为例)
以调用OpenAI GPT-3.5接口为例(其他大模型如通义千问、文心一言接口逻辑类似,仅参数/域名不同):
前置依赖:
pip install openai # OpenAI官方库
# 国内模型(如通义千问):pip install dashscope
核心代码:
import openai
import json
# 1. 配置大模型接口(以OpenAI为例)
openai.api_key = "你的API_KEY"
openai.base_url = "https://api.openai.com/v1" # 国内需替换为代理地址
# 2. 定义意图识别函数
def recognize_user_intent(user_input):
# 构造Prompt(替换模板中的{user_input})
prompt = f"""
你的任务是识别用户输入的意图,需严格按照以下要求执行:
1. 意图分类列表(仅允许从以下列表中选择):
- 商品查询:询问商品价格、库存、规格、功能等商品相关信息;
- 订单咨询:询问订单状态、物流、退款、改地址等订单相关问题;
- 投诉/建议:反馈商品/服务问题、提出改进建议;
- 闲聊:无业务诉求的纯聊天内容;
- 未知意图:无法归类到以上类型的内容。
2. 输出格式(必须是JSON,不要额外解释):
{{
"user_input": "用户原始输入",
"intent": "识别出的意图(严格匹配分类列表)",
"confidence": "意图置信度(0-1,保留2位小数)",
"reason": "识别理由(简要说明为何归为该意图)"
}}
3. 示例:
示例1:
用户输入:"我的订单2025XXXX什么时候发货?"
输出:{{"user_input":"我的订单2025XXXX什么时候发货?","intent":"订单咨询","confidence":0.99,"reason":"用户询问订单发货时间,属于订单咨询范畴"}}
示例2:
用户输入:"你好呀,今天心情不错"
输出:{{"user_input":"你好呀,今天心情不错","intent":"闲聊","confidence":0.98,"reason":"用户无业务诉求,仅纯聊天"}}
现在开始识别:
用户输入:{user_input}
"""
# 3. 调用大模型接口
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # 模型版本,可替换为gpt-4
messages=[
{"role": "system", "content": "你是一个精准的用户意图识别助手,严格遵守输出格式要求"},
{"role": "user", "content": prompt}
],
temperature=0.2, # 低温度保证结果稳定
max_tokens=500, # 限制返回长度
timeout=10 # 超时时间
)
# 4. 提取模型返回的内容
result_text = response.choices[0].message["content"].strip()
return result_text
except Exception as e:
return f"接口调用失败:{str(e)}"
# 5. 测试调用
if __name__ == "__main__":
user_input = "这款T恤的尺码有哪些?"
intent_result = recognize_user_intent(user_input)
print("大模型返回结果:")
print(intent_result)
国内模型适配(以通义千问为例):
只需替换接口调用部分,Prompt模板不变:
from http import HTTPStatus
import dashscope
from dashscope import Generation
dashscope.api_key = "你的通义千问API_KEY"
def recognize_user_intent_qwen(user_input):
# 复用上述prompt变量
response = Generation.call(
model='qwen-turbo', # 通义千问轻量版,可替换为qwen-plus
messages=[
{'role': 'system', 'content': '你是精准的意图识别助手,严格输出JSON格式'},
{'role': 'user', 'content': prompt}
],
temperature=0.2,
result_format='text'
)
if response.status_code == HTTPStatus.OK:
return response.output.choices[0].message.content
else:
return f"调用失败:{response.code} - {response.message}"
步骤3:解析返回结果(结构化处理)
大模型返回的是JSON文本,需解析为字典,方便后续业务逻辑调用,并增加容错(避免模型返回格式错误):
def parse_intent_result(result_text):
try:
# 清理可能的多余字符(如模型返回的```json包裹)
result_text = result_text.replace("```json", "").replace("```", "").strip()
intent_dict = json.loads(result_text)
# 验证核心字段
required_fields = ["user_input", "intent", "confidence"]
for field in required_fields:
if field not in intent_dict:
return {"status": "error", "msg": f"缺少核心字段{field}", "data": None}
return {"status": "success", "msg": "解析成功", "data": intent_dict}
except json.JSONDecodeError:
return {"status": "error", "msg": "JSON解析失败", "data": None}
except Exception as e:
return {"status": "error", "msg": f"解析异常:{str(e)}", "data": None}
# 调用示例
intent_result = recognize_user_intent("这款T恤的尺码有哪些?")
parsed_result = parse_intent_result(intent_result)
if parsed_result["status"] == "success":
intent = parsed_result["data"]["intent"]
confidence = parsed_result["data"]["confidence"]
print(f"识别意图:{intent},置信度:{confidence}")
# 后续业务逻辑:根据intent执行不同操作
if intent == "商品查询":
# 调用商品查询接口
pass
elif intent == "订单咨询":
# 调用订单接口
pass
else:
print(f"解析失败:{parsed_result['msg']}")
步骤4:验证与迭代优化
- 批量测试:准备50-100条标注好意图的用户输入,调用接口测试识别准确率;
- 优化Prompt:
- 若模型频繁归类错误,补充更多示例(如边缘场景:“能便宜点吗?”→商品查询);
- 若模型返回格式混乱,强化“必须输出JSON”的指令,或增加“若无法输出JSON,返回错误”的约束;
- 调整分类体系:若某类意图识别率低,检查分类是否模糊(如“售后咨询”可拆分为“退款咨询”“换货咨询”)。
四、进阶技巧:提升意图识别准确率
1. 多轮上下文意图识别
若用户意图需要结合历史对话,需在Prompt中带上上下文:
# 构造带上下文的Prompt
context = [
{"role": "user", "content": "我想买一件T恤"},
{"role": "assistant", "content": "请问你想要什么尺码的?"},
{"role": "user", "content": "有XL码吗?"} # 本轮输入
]
prompt = f"""
你的任务是识别用户本轮输入的意图,结合上下文:
上下文:{json.dumps(context, ensure_ascii=False)}
本轮用户输入:{user_input}
# 以下复用原意图分类、输出格式、示例...
"""
2. 意图消歧(解决歧义输入)
针对模糊输入(如“苹果”),通过Prompt引导模型结合上下文/场景消歧:
额外要求:若用户输入存在歧义,需结合场景(电商)判断意图:
- 若“苹果”指商品(如苹果手机、苹果水果)→ 商品查询;
- 若无上下文,无法判断 → 未知意图,并在reason中说明歧义点。
3. 领域适配(垂直场景)
针对专业领域(如金融、医疗),在Prompt中加入领域知识:
补充领域知识:
- 金融场景中,“平仓”“建仓”属于「交易操作」意图;
- “查持仓”“查盈亏”属于「资产查询」意图。
五、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 模型返回非JSON格式 | Prompt指令不清晰/温度过高 | 强化“必须输出JSON”指令,设置temperature≤0.3,增加格式错误惩罚提示 |
| 意图识别准确率低 | 分类模糊/示例不足 | 优化意图分类体系,补充更多Few-shot示例 |
| 接口调用超时/失败 | 网络问题/模型并发限制 | 增加重试机制(最多3次),设置超时时间,监控接口QPS |
| 歧义输入识别错误 | 未结合上下文/场景 | 加入上下文、领域知识,引导模型消歧 |
总结
调用大模型接口做意图识别的核心是「精准Prompt+结构化输出+容错解析」:
- 先定义清晰的意图分类;
- 设计包含「指令+分类+格式+示例」的Prompt;
- 调用接口时设置低温度保证结果稳定;
- 解析结果时增加容错,避免格式错误;
- 批量测试后迭代优化Prompt和分类体系。
这种方式相比传统的关键词匹配/机器学习(如TF-IDF+SVM),无需标注大量训练数据,适配性更强,尤其适合复杂语义、多轮对话的场景。
更多推荐



所有评论(0)