智能客服机器人
开发一个能够自动回答用户问题、查询订单、处理退款的智能客服系统。
项目目标
功能:
1. 自动回答常见问题
2. 查询订单状态
3. 处理退款申请
4. 转接人工客服
特点:
- 使用Agent自主决策
- 调用模拟的业务API
- 支持多轮对话技术架构
┌──────────────┐
│ 用户消息 │
└──────┬───────┘
↓
┌──────────────┐
│ Agent决策 │ 分析意图,选择工具
└──────┬───────┘
↓
┌──────────────┐
│ 工具执行 │ FAQ查询/订单查询/退款处理
└──────┬───────┘
↓
┌──────────────┐
│ 生成回复 │
└──────────────┘完整代码
项目结构
customer-service/
├── app.py # 主程序
├── tools.py # 工具定义
├── agent.py # Agent配置
├── requirements.txt
└── data/
└── faq.json # FAQ数据tools.py
python
"""客服工具定义"""
from langchain_core.tools import tool
from typing import Optional
from datetime import datetime
import json
# 模拟数据库
ORDERS_DB = {
"ORD001": {"status": "已发货", "items": ["商品A"], "amount": 199, "ship_date": "2024-01-15"},
"ORD002": {"status": "配送中", "items": ["商品B", "商品C"], "amount": 599, "ship_date": "2024-01-16"},
"ORD003": {"status": "待付款", "items": ["商品D"], "amount": 299, "ship_date": None},
}
REFUNDS_DB = []
FAQ_DATA = {
"退货政策": "购买后7天内可无理由退货,商品需保持原包装完好。",
"配送时间": "一般1-3个工作日送达,偏远地区可能需要5-7天。",
"支付方式": "支持支付宝、微信支付、银行卡支付。",
"发票问题": "可在订单详情页申请电子发票,1-3个工作日内发送到邮箱。",
}
@tool
def query_order(order_id: str) -> str:
"""查询订单状态
Args:
order_id: 订单编号,如ORD001
Returns:
订单状态信息
"""
order = ORDERS_DB.get(order_id)
if not order:
return f"未找到订单 {order_id},请检查订单号是否正确。"
response = f"""
订单号: {order_id}
状态: {order['status']}
商品: {', '.join(order['items'])}
金额: ¥{order['amount']}
"""
if order['ship_date']:
response += f"发货日期: {order['ship_date']}"
return response
@tool
def apply_refund(order_id: str, reason: str) -> str:
"""申请退款
Args:
order_id: 订单编号
reason: 退款原因
Returns:
退款申请结果
"""
order = ORDERS_DB.get(order_id)
if not order:
return f"未找到订单 {order_id}"
if order['status'] == '已退款':
return f"订单 {order_id} 已经退款"
if order['status'] == '待付款':
return f"订单 {order_id} 尚未付款,无需退款"
# 创建退款记录
refund_id = f"RF{len(REFUNDS_DB)+1:03d}"
REFUNDS_DB.append({
"refund_id": refund_id,
"order_id": order_id,
"reason": reason,
"status": "处理中",
"create_time": datetime.now().strftime("%Y-%m-%d %H:%M")
})
# 更新订单状态
ORDERS_DB[order_id]['status'] = '退款中'
return f"""
退款申请已提交!
退款编号: {refund_id}
订单号: {order_id}
退款金额: ¥{order['amount']}
退款原因: {reason}
预计1-3个工作日处理完成。
"""
@tool
def query_refund(refund_id: str) -> str:
"""查询退款状态
Args:
refund_id: 退款编号
Returns:
退款状态信息
"""
for refund in REFUNDS_DB:
if refund['refund_id'] == refund_id:
return f"""
退款编号: {refund_id}
订单号: {refund['order_id']}
状态: {refund['status']}
申请时间: {refund['create_time']}
"""
return f"未找到退款记录 {refund_id}"
@tool
def get_faq(keyword: str) -> str:
"""查询常见问题
Args:
keyword: 问题关键词,如退货、配送、支付
Returns:
相关FAQ答案
"""
results = []
for key, value in FAQ_DATA.items():
if keyword in key or keyword in value:
results.append(f"【{key}】\n{value}")
if not results:
return f"未找到关于'{keyword}'的常见问题,请咨询人工客服。"
return "\n\n".join(results)
@tool
def transfer_to_human(reason: str) -> str:
"""转接人工客服
Args:
reason: 转接原因
Returns:
转接信息
"""
return f"""
正在为您转接人工客服...
转接原因: {reason}
请稍候,预计等待时间1-2分钟。
客服工作时间: 周一至周日 9:00-21:00
"""
# 工具列表
CUSTOMER_SERVICE_TOOLS = [
query_order,
apply_refund,
query_refund,
get_faq,
transfer_to_human
]agent.py
python
"""Agent配置"""
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent, AgentExecutor
from tools import CUSTOMER_SERVICE_TOOLS
def create_customer_service_agent():
"""创建客服Agent"""
model = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的客服机器人,名叫小智。
你的职责:
1. 友好、专业地回答用户问题
2. 使用工具查询订单、处理退款
3. 遇到无法解决的问题,转接人工客服
注意事项:
- 语气亲切友好,使用"您"称呼用户
- 查询订单需要订单号,如果用户没提供请询问
- 退款需要订单号和原因
- 遇到投诉或复杂问题,主动转接人工
- 不要编造信息,不确定时说"让我帮您查询一下"
当前时间: {current_time}"""),
("placeholder", "{chat_history}"),
("user", "{input}"),
("placeholder", "{agent_scratchpad}")
])
agent = create_tool_calling_agent(model, CUSTOMER_SERVICE_TOOLS, prompt)
return AgentExecutor(
agent=agent,
tools=CUSTOMER_SERVICE_TOOLS,
verbose=True,
max_iterations=5,
handle_parsing_errors=True
)app.py
python
"""主程序"""
from datetime import datetime
from agent import create_customer_service_agent
from langchain_core.messages import HumanMessage, AIMessage
from langchain.memory import ConversationBufferMemory
def main():
"""主函数"""
print("=" * 50)
print("智能客服机器人 - 小智")
print("输入'退出'结束对话")
print("=" * 50)
agent = create_customer_service_agent()
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
while True:
user_input = input("\n您: ").strip()
if user_input.lower() in ['退出', 'exit', 'quit']:
print("小智: 感谢您的咨询,再见!")
break
if not user_input:
continue
# 获取对话历史
chat_history = memory.chat_memory.messages
# 调用Agent
result = agent.invoke({
"input": user_input,
"chat_history": chat_history,
"current_time": datetime.now().strftime("%Y-%m-%d %H:%M")
})
# 保存到记忆
memory.chat_memory.add_user_message(user_input)
memory.chat_memory.add_ai_message(result["output"])
print(f"小智: {result['output']}")
if __name__ == "__main__":
main()运行效果
==================================================
智能客服机器人 - 小智
输入'退出'结束对话
==================================================
您: 你好
小智: 您好!我是客服小智,很高兴为您服务。有什么可以帮您的吗?
您: 我想查询订单ORD001
小智: 您的订单信息如下:
订单号: ORD001
状态: 已发货
商品: 商品A
金额: ¥199
发货日期: 2024-01-15
还有什么可以帮您的吗?
您: 我想退款,因为商品有质量问题
小智: 好的,我帮您处理退款。请问您的订单号是多少?
您: ORD001
小智:
退款申请已提交!
退款编号: RF1
订单号: ORD001
退款金额: ¥199
退款原因: 商品有质量问题
预计1-3个工作日处理完成。
您: 退出
小智: 感谢您的咨询,再见!扩展方向
- 接入真实API - 连接真实的订单系统
- 添加情感分析 - 识别用户情绪,及时安抚
- 多渠道支持 - 微信、网页、APP
- 知识库集成 - RAG增强FAQ能力
小结
本项目实现了:
- Agent自主决策能力
- 多种业务工具
- 对话记忆
- 模拟业务流程
下一步
继续学习 代码助手开发,了解多Agent协作。