12-实战:智能客服Agent完整实现
实战:智能客服 Agent 完整实现
系列收尾实战篇。把前面讲的 ReAct 循环、工具调用、RAG 知识库、记忆系统、安全护栏全部串起来,从零设计一个完整的智能客服 Agent:整体架构、工具设计、Prompt 设计、对话流程、转人工逻辑、测试优化。
大家好,我是黒漂技术佬。
前面 11 篇把 Agent 的核心组件都讲了:ReAct 架构、工具调用、记忆系统、规划能力、多 Agent、RAG、框架、评估、安全、工程化。
这篇作为系列收尾,做一个完整的实战项目:智能客服 Agent。把所有知识串起来,从架构设计到具体实现,走一遍完整流程。
一、项目目标
做什么
一个企业级智能客服 Agent,能:
- 回答产品相关问题(查知识库)
- 查询订单状态(调用订单系统 API)
- 创建工单(提交到工单系统)
- 解决不了的问题转人工
- 记住用户信息和历史对话
能力范围
| 能力 | 说明 |
|---|---|
| 知识库问答 | 产品使用、常见问题、操作指南 |
| 订单查询 | 根据订单号查状态、物流 |
| 工单创建 | 记录用户问题,生成工单 |
| 转人工 | 复杂问题或用户要求时转接 |
| 多轮对话 | 记住上下文,连续对话 |
二、整体架构设计
架构图
用户 → 聊天前端
↓
客服 Agent 服务
↓
┌───┴──────────────────┐
│ 大模型(大脑) │
│ 系统提示词 + 工具 │
└───┬──────────────────┘
↓
工具层:
├── 知识库检索(RAG)→ 向量数据库
├── 订单查询 → 订单系统 API
├── 创建工单 → 工单系统 API
└── 转人工 → 客服系统
↓
记忆层:
├── 短期记忆:当前对话上下文
├── 长期记忆:用户信息、历史对话
└── 向量记忆:产品知识库
核心组件
- 对话管理:维护会话状态、上下文
- Agent 核心:ReAct 循环 + 工具调用
- 知识库检索:RAG,产品文档和 FAQ
- 业务工具:订单查询、工单创建
- 转人工判断:什么时候转人工
- 记忆系统:用户画像、历史对话
三、工具设计
工具 1:知识库检索
{
"name": "search_knowledge_base",
"description": "从产品知识库中搜索答案,回答产品使用、功能介绍、常见问题、操作指南等问题时使用。
涉及产品相关问题必须先调用此工具,禁止仅凭记忆回答。",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "搜索关键词,尽量用简洁的关键词或问题"
}
},
"required": ["query"]
}
}
工具 2:查询订单
{
"name": "query_order",
"description": "根据订单号查询订单状态、物流信息、收货地址等。
用户提供了订单号并且询问订单相关问题时使用。",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "订单号,一般是字母数字组合"
}
},
"required": ["order_id"]
}
}
工具 3:创建工单
{
"name": "create_ticket",
"description": "创建客服工单,当问题无法通过知识库解答、需要人工处理时使用。
创建前必须确认用户的问题描述和联系方式。",
"parameters": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "工单标题,简要概括问题"
},
"description": {
"type": "string",
"description": "问题详细描述"
},
"contact": {
"type": "string",
"description": "用户联系方式,手机号或邮箱"
},
"priority": {
"type": "string",
"enum": ["low", "normal", "high"],
"description": "优先级,默认normal"
}
},
"required": ["title", "description", "contact"]
}
}
工具 4:转人工
{
"name": "transfer_to_human",
"description": "转接人工客服。当用户明确要求人工、问题超出能力范围、
多次尝试无法解决时使用。",
"parameters": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "转接原因"
}
},
"required": ["reason"]
}
}
四、系统提示词设计
你是XX公司的智能客服助手,名叫小X。
【你的职责】
回答用户关于XX产品的问题、查询订单信息、帮助创建工单。
友好、专业、简洁。
【可用工具】
1. search_knowledge_base:搜索产品知识库,回答产品问题必须用
2. query_order:查询订单状态,需要用户提供订单号
3. create_ticket:创建工单,问题解决不了时用
4. transfer_to_human:转人工客服
【工作规则】
1. 产品相关问题必须先调用 search_knowledge_base 检索知识库,再根据结果回答。
禁止仅凭自己的知识回答产品问题。
2. 查订单必须要有订单号,没有就先问用户要。
3. 创建工单前必须确认:问题描述、联系方式。
4. 以下情况转人工:
- 用户明确要求人工
- 知识库查不到且你也无法解答
- 涉及退款、赔偿、投诉等敏感问题
- 连续2次尝试仍无法解决用户问题
5. 不知道的就说不知道,不要编造。
6. 回答尽量简洁,不要说废话。
7. 始终保持礼貌友好。
【回答格式】
直接用自然语言回答用户,不要暴露你是AI,不要提到工具调用。
如果引用知识库内容,可以标注来源。
【用户信息】
用户ID:{user_id}
用户名:{user_name}
用户等级:{user_level}
历史问题摘要:{history_summary}
关键点:
- 明确职责和边界
- 强调产品问题必须检索知识库(防幻觉)
- 明确转人工的条件
- 注入用户信息(个性化)
五、对话流程设计
典型对话流程
场景 1:产品问答(知识库)
用户:怎么开通企业版?
↓
Agent:(判断是产品问题 → 调用知识库检索)
↓
工具返回:开通流程...
↓
Agent:整理成自然语言回答用户
场景 2:订单查询
用户:我的订单到哪了?
↓
Agent:(需要订单号,先问用户)
↓
用户:订单号是 ABC123
↓
Agent:(调用 query_order 工具)
↓
工具返回:订单状态已发货,物流信息...
↓
Agent:告诉用户订单状态
场景 3:创建工单
用户:我的产品坏了,怎么办?
↓
Agent:(查知识库,没有相关解决方案)
↓
Agent:(建议创建工单,询问联系方式)
↓
用户:好的,电话138xxxx
↓
Agent:(调用 create_ticket 创建工单)
↓
Agent:工单已创建,工单号xxx,会有人联系你
场景 4:转人工
用户:我要投诉!
↓
Agent:(涉及投诉,属于敏感问题 → 转人工)
↓
Agent:好的,马上为您转接人工客服,请稍候...
转人工判断逻辑
满足任一条件就转人工:
- 用户明确说「转人工」「找客服」「要人处理」
- 涉及退款、赔偿、投诉、法律等敏感问题
- 连续 2 轮知识库检索仍无法回答
- 用户表达不满情绪(可以用情感分类判断)
- 超出预设能力范围的问题
六、记忆系统设计
短期记忆
- 当前对话的所有消息,存在会话上下文里
- 对话太长了做摘要,只保留最近几轮 + 历史摘要
长期记忆(用户画像)
{
"user_id": "xxx",
"name": "张三",
"level": "VIP",
"phone": "138xxxx",
"preferences": {
"language": "中文",
"style": "简洁"
},
"recent_issues": [
"问过开通流程",
"查询过订单ABC123"
],
"open_tickets": ["TICKET-001"]
}
每次对话前把用户信息拼进系统提示词,Agent 就认识用户了。
向量记忆(知识库)
- 产品文档、FAQ、操作指南
- 分块向量化存向量数据库
- 混合检索 + rerank 优化召回
七、安全护栏
输入侧
- 敏感词检测
- Prompt 注入检测
- 频率限制(每个用户每分钟最多多少条)
输出侧
- 内容审核(涉政、涉黄、敏感信息)
- 内部信息泄露检测
- 回答必须有知识库来源(产品类问题)
工具侧
- 工具权限:普通用户只能查自己的订单
- 敏感操作(创建工单、转人工)记录日志
- 工具参数校验
人在回路
- 投诉、退款等敏感问题直接转人工
- 工单创建后人工审核(可选)
八、代码骨架(伪代码)
class CustomerServiceAgent:
def __init__(self, user_id):
self.user_id = user_id
self.user_profile = load_user_profile(user_id)
self.conversation_history = []
self.max_steps = 5
self.tools = {
"search_knowledge_base": search_kb,
"query_order": query_order_api,
"create_ticket": create_ticket_api,
"transfer_to_human": transfer_to_human,
}
def chat(self, user_message):
# 1. 输入检测
if is_sensitive_input(user_message):
return "抱歉,这个问题需要人工客服处理,为您转接..."
# 2. 加入对话历史
self.conversation_history.append({"role": "user", "content": user_message})
# 3. Agent 循环
for step in range(self.max_steps):
# 构造 prompt
system_prompt = self.build_system_prompt()
messages = [{"role": "system", "content": system_prompt}] + self.conversation_history
# 调用大模型
response = llm.chat(messages=messages, tools=TOOLS_DEFINITION)
# 判断是工具调用还是直接回答
if response.tool_calls:
# 执行工具
tool_result = self.execute_tool(response.tool_calls[0])
# 加入历史
self.conversation_history.append(response)
self.conversation_history.append({
"role": "tool",
"tool_call_id": response.tool_calls[0].id,
"content": tool_result
})
# 如果是转人工,直接结束
if response.tool_calls[0].function.name == "transfer_to_human":
return "已为您转接人工客服,请稍候..."
else:
# 直接回答
answer = response.content
self.conversation_history.append({"role": "assistant", "content": answer})
# 更新用户画像
self.update_user_profile(answer)
return answer
# 超出步数,转人工
return "抱歉,这个问题比较复杂,为您转接人工客服..."
def execute_tool(self, tool_call):
name = tool_call.function.name
args = json.loads(tool_call.function.arguments)
# 权限校验
if not self.check_permission(name, args):
return "错误:没有权限执行此操作"
# 执行工具
try:
return self.tools[name](**args)
except Exception as e:
return f"工具调用失败:{str(e)}"
九、测试和优化
测试用例设计
准备一批测试用例,覆盖各种场景:
| 分类 | 测试用例 | 预期结果 |
|---|---|---|
| 知识库问答 | "怎么开通企业版" | 调用知识库,返回开通流程 |
| 订单查询 | "订单ABC123状态" | 调用订单查询,返回状态 |
| 多轮对话 | 先问产品,再问价格 | 记住上下文,正确回答 |
| 转人工 | "我要投诉" | 转接人工 |
| 工单创建 | "产品有问题帮我记录" | 创建工单 |
| 边界 | "你们老板电话多少" | 拒绝回答,引导正常渠道 |
优化方向
- 知识库质量:Bad Case 补充到知识库,持续完善
- Prompt 调优:根据实际对话调整系统提示词
- 工具描述优化:工具选错就改 description
- 转人工阈值:转多了浪费人力,转少了用户体验差,找到平衡点
- 个性化:根据用户等级、历史问题调整回答策略
持续迭代
- 每天看转人工率、解决率
- 抽样看对话质量
- 收集用户反馈(点赞/点踩)
- 每周分析 Bad Case,优化一轮
十、系列总结
这个系列 12 篇,把 AI Agent 从入门到实战完整讲了一遍:
- 基础概念:Agent 是什么、跟普通对话的区别、核心能力
- 核心架构:ReAct 思考-行动-观察循环
- 工具调用:Function Calling、工具定义、最佳实践
- 记忆系统:短期、长期、向量三层记忆
- 规划能力:CoT、任务分解、Plan-and-Execute
- 多 Agent 协作:角色分工、通信方式、常见模式
- RAG + Agent:知识库增强、检索优化
- 框架对比:LangChain、CrewAI、LlamaIndex 等
- 评估调试:评估维度、调试方法、Bad Case 分析
- 安全可控:输出校验、权限控制、人在回路、护栏设计
- 工程化:部署、监控、成本优化、版本管理
- 实战项目:智能客服 Agent 完整设计
Agent 开发的核心要点
- Prompt 是灵魂:系统提示词写得好不好,直接决定 Agent 表现
- 工具设计很关键:工具描述清楚、粒度合适,Agent 才能用得好
- RAG 质量是知识库场景的瓶颈:检索准不准决定回答对不对
- 安全不能忽视:能调用工具就有风险,护栏要做好
- 持续迭代:Agent 不是上线就完事了,要靠 Bad Case 持续优化
- 人是最后一道防线:复杂的、有风险的,转人工就对了
未来展望
Agent 还在快速发展:
- 模型能力越来越强,工具调用更准、规划更好
- 多模态 Agent:不仅文字,还能看图片、视频
- 端侧 Agent:本地小模型跑 Agent,隐私好、成本低
- 更成熟的工程化工具:调试、监控、评估体系越来越完善
现在是入局的好时机,从简单的 Agent 做起,逐步迭代,积累经验。
十一、本篇小结
- 智能客服 Agent 架构:对话管理 + Agent 核心 + 工具层 + 记忆层
- 四个核心工具:知识库检索、订单查询、创建工单、转人工
- 系统提示词明确职责、规则、边界,是 Agent 的灵魂
- 对话流程:知识库问答、订单查询、工单创建、转人工四大场景
- 记忆系统:短期上下文 + 长期用户画像 + 向量知识库
- 安全护栏:输入检测、输出审核、工具权限、人在回路
- 测试用例覆盖各场景,靠 Bad Case 持续迭代优化
AI Agent 应用开发实战系列到这里就全部结束了。12 篇从基础概念到完整实战,把 Agent 开发需要的知识体系梳理了一遍。Agent 是大模型落地的重要方向,值得深入学习。动手做一个自己的 Agent 吧,光看没用,踩过坑才是自己的。
我是黒漂技术佬,我们下个系列见。

浙公网安备 33010602011771号