构建生产级 LLM 聊天机器人:两阶段架构与意图识别实战

生产环境下的聊天机器人不能仅靠 LLM 直接生成。本文介绍“理解-生成”两阶段架构,通过意图识别将用户请求分类,再精准路由到对应模型或工具。文中提供基于 Oxlo.ai 的 Python 代码示例,涵盖分类、上下文生成及复杂推理模型路由。
构建生产级 LLM 聊天机器人:两阶段架构与意图识别实战
在 AI 应用开发中,直接向大模型(LLM)发送提示词往往被视为“银弹”。然而,在构建面向真实用户的生产级聊天机器人时,这种简单粗暴的方式往往会带来严重的隐患:请求路由错误、政策幻觉以及高昂的算力浪费。
要解决这些问题,我们需要引入意图识别机制,并采用两阶段架构来解耦理解与生成。本文将深入探讨这一架构的设计思路,并提供基于 Oxlo.ai 的实战代码。
为什么需要意图识别?
意图识别的核心任务是将用户非结构化的自然语言输入,映射为一个结构化的目标标签。
想象一下,用户说“我被多扣费了”,如果没有意图识别层,模型只能盲目猜测用户是想咨询余额、投诉还是查看账单。引入意图识别后,这个输入会被精准归类为 billing_dispute(账单争议),从而确保后续处理逻辑的准确性。
其价值在于:
- 确定性钩子:为路由提供明确的依据。
- 护栏与安全:防止模型在未授权的领域胡乱输出。
- 数据分析:便于统计用户行为和优化服务。
两阶段架构设计
生产级聊天机器人的核心在于将“理解用户意图”和“生成回答”两个过程分离。
流程如下:
- 接收消息:获取用户输入。
- 分类与提取:识别意图并提取关键信息(如日期、ID、分类)。
- 路由分发:根据意图调用不同的处理程序,例如特定的 Prompt 模板、API 工具或检索步骤。
- 生成回复:由 LLM 根据处理结果生成最终回复。
这种设计将 LLM 限制在它最擅长的语言任务上,而复杂的业务逻辑和规则则由应用程序代码来执行,从而保证了系统的稳定性。
实战:意图分类
我们可以利用 LLM 本身来实现意图分类。这里推荐使用 Oxlo.ai,它采用请求定价模式,无论 Prompt 中包含多少示例或长定义,成本都是固定的,非常适合将其作为第一类 API 调用。
我们使用 OpenAI 兼容的接口,调用 Qwen 3 32B 模型,并开启 JSON 模式,以确保输出结构化且易于解析。
import os
import json
from openai import OpenAI
# 初始化客户端
client = OpenAI(
base_url="https://api.oxlo.ai/v1",
api_key=os.environ["OXLO_API_KEY"]
)
# 定义意图列表
INTENTS = [
"billing_question", "technical_support",
"account_management", "general_chat"
]
def classify_intent(user_message: str) -> dict:
"""将用户消息分类为结构化意图"""
response = client.chat.completions.create(
model="qwen-3-32b",
messages=[
{
"role": "system",
"content": (
f"Classify the user message into one of these intents: {', '.join(INTENTS)}. "
"Respond with a JSON object containing 'intent' and 'confidence'."
)
},
{"role": "user", "content": user_message}
],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
技术要点:
- JSON Mode:避免了使用脆弱的正则表达式提取数据,确保了输出的稳定性。
- 模型选择:Qwen 3 32B 在 Oxlo 平台上对多语言支持良好。
实战:基于意图的上下文生成
一旦意图被识别,我们就可以为该意图选择专门的系统提示词。这能显著减少幻觉,让模型专注于特定领域的任务。
SYSTEM_PROMPTS = {
"billing_question": "You are a billing assistant. Cite policy ID 402. Be concise.",
"technical_support": "You are a tier-1 support engineer. Ask one clarifying question.",
"account_management": "You are an account coordinator. Never delete data.",
"general_chat": "You are a helpful assistant."
}
def generate_response(intent: str, user_message: str) -> str:
"""根据意图生成定制化回复"""
system = SYSTEM_PROMPTS.get(intent, SYSTEM_PROMPTS["general_chat"])
response = client.chat.completions.create(
model="llama-3.3-70b",
messages=[
{"role": "system", "content": system},
{"role": "user", "content": user_message}
]
)
return response.choices[0].message.content
在这个例子中,如果是技术支持请求,模型被设定为“一级工程师”并被告知“只提一个问题”,这比通用的提示词更能引导模型输出有用的信息。
高级:复杂推理模型路由
对于简单的分类和生成任务,通用模型即可胜任。但对于需要深度推理的任务(如复杂的代码故障排查),我们可以利用 Oxlo.ai 提供的强大模型池进行动态路由。
代码无需变更,只需在生成阶段切换模型即可。例如,遇到技术支持中的代码调试请求,可以自动路由至 DeepSeek R1 671B MoE 或 Kimi K2.6 等推理能力更强的模型,从而大幅提升答案的准确度。
总结
构建生产级聊天机器人,关键在于控制。通过引入意图识别和两阶段架构,我们不仅提高了对话的准确率,还使得系统的延迟和成本变得可预测,同时极大地简化了审计和调试工作。
对于开发者而言,将 LLM 视为一个可调用的“工具箱”,而非全能的“上帝”,才是构建可靠 AI 应用的正确姿势。