基于大模型接口实现用户意图识别:完整流程与实操

通过调用大模型(如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:验证与迭代优化

  1. 批量测试:准备50-100条标注好意图的用户输入,调用接口测试识别准确率;
  2. 优化Prompt
    • 若模型频繁归类错误,补充更多示例(如边缘场景:“能便宜点吗?”→商品查询);
    • 若模型返回格式混乱,强化“必须输出JSON”的指令,或增加“若无法输出JSON,返回错误”的约束;
  3. 调整分类体系:若某类意图识别率低,检查分类是否模糊(如“售后咨询”可拆分为“退款咨询”“换货咨询”)。

四、进阶技巧:提升意图识别准确率

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+结构化输出+容错解析」:

  1. 先定义清晰的意图分类;
  2. 设计包含「指令+分类+格式+示例」的Prompt;
  3. 调用接口时设置低温度保证结果稳定;
  4. 解析结果时增加容错,避免格式错误;
  5. 批量测试后迭代优化Prompt和分类体系。

这种方式相比传统的关键词匹配/机器学习(如TF-IDF+SVM),无需标注大量训练数据,适配性更强,尤其适合复杂语义、多轮对话的场景。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐