Skip to content

智能客服机器人

开发一个能够自动回答用户问题、查询订单、处理退款的智能客服系统。

项目目标

功能:
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个工作日处理完成。

您: 退出

小智: 感谢您的咨询,再见!

扩展方向

  1. 接入真实API - 连接真实的订单系统
  2. 添加情感分析 - 识别用户情绪,及时安抚
  3. 多渠道支持 - 微信、网页、APP
  4. 知识库集成 - RAG增强FAQ能力

小结

本项目实现了:

  • Agent自主决策能力
  • 多种业务工具
  • 对话记忆
  • 模拟业务流程

下一步

继续学习 代码助手开发,了解多Agent协作。