Skip to content

Repository files navigation

🤖 AI 客服 Agent

基于 DeepSeek API 的智能电商客服系统,支持订单查询、物流追踪、地址修改、退款申请。从零手写 Agent 核心逻辑,不依赖 LangChain 等框架。

✨ 核心亮点

  • Tool Calling 双轮调用:LLM 决定工具 → 执行工具 → LLM 生成回复,完整闭环
  • DSML Fallback 机制:处理 DeepSeek 非标准工具调用输出,保证可靠性
  • 多用户会话隔离:每个用户独立对话历史,支持并发访问,15 分钟超时自动清理
  • 数据持久化:SQLite 数据库存储订单数据,支持并发读写
  • LLM 自动重试:API 超时/限流时指数退避重试,生产环境稳定性保障
  • 结构化日志:JSON 格式输出,支持对接 ELK/Loki,全链路可追溯
  • Token 消耗追踪:自动记录每次调用的 prompt/completion tokens,成本可控
  • 输入安全过滤:Prompt Injection 基础检测,关键词/长度/特殊字符多层防护
  • API 限流保护:基于 slowapi 的 per-user 限流,防止接口滥用
  • 完整测试覆盖:41 个单元测试,覆盖工具函数、Agent 逻辑、API 接口、安全过滤
  • 零配置部署:Docker Compose 一键启动

🏗️ 架构

┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│   Client    │─────▶│  FastAPI    │─────▶│  DeepSeek   │
│ (CLI / HTTP)│◀─────│   Agent     │◀─────│    API      │
└─────────────┘      └──────┬──────┘      └─────────────┘
                            │
                     ┌──────┴──────┐
                     │   SQLite    │
                     │   Orders    │
                     └─────────────┘

🚀 快速开始

方式 1:Docker(推荐)

git clone https://github.com/yourname/customer-agent.git
cd customer-agent
cp .env.example .env
# 编辑 .env,填入你的 DEEPSEEK_API_KEY
docker-compose up

服务启动后访问 http://localhost:8000/docs 查看交互式 API 文档。

方式 2:本地运行

# 1. 克隆项目
git clone https://github.com/yourname/customer-agent.git
cd customer-agent

# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 3. 安装依赖
pip install -r requirements.txt

# 4. 配置环境变量
cp .env.example .env
# 编辑 .env,填入 DEEPSEEK_API_KEY

# 5. 启动服务
# Web API 模式
uvicorn app.api:app --reload

# 或 CLI 模式
python -m app.main

📡 API 接口

发送消息

curl -X POST http://localhost:8000/chat \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "u001",
    "message": "查询订单 1001"
  }'

响应示例

{
  "reply": "订单 1001 的商品是机械键盘,状态为已发货,收货地址是北京市朝阳区。",
  "tool_called": "get_order"
}

重置会话

curl -X POST http://localhost:8000/reset \
  -H "Content-Type: application/json" \
  -d '{"user_id": "u001"}'

健康检查

curl http://localhost:8000/health

💬 CLI 使用示例

$ python -m app.main
Agent 客服已启动!输入 quit 退出。

你: 查询订单 1001
AI: 订单 1001 的商品是机械键盘,当前状态为已发货,物流单号为 SF123456789,收货地址为北京市朝阳区。

你: 把 1002 的地址改成深圳市南山区
AI: 地址修改成功!订单 1002 的收货地址已更新为深圳市南山区。

你: 我要退款
AI: 请提供订单号

你: 1002
AI: 已为您提交退款申请,预计 1-3 个工作日到账。

你: quit
客服系统已关闭

🧪 测试

# 运行全部测试
pytest tests/ -v

# 运行特定测试文件
pytest tests/test_tools.py -v
pytest tests/test_agent.py -v
pytest tests/test_api.py -v
pytest tests/test_security.py -v

🛠️ 技术栈

技术 用途
Python 3.11 编程语言
DeepSeek API (OpenAI SDK) 大语言模型
FastAPI Web API 框架
SQLAlchemy + SQLite ORM 与数据库
Pydantic / Pydantic-Settings 数据校验与配置管理
Tenacity LLM 调用自动重试
python-json-logger 结构化 JSON 日志
slowapi API 限流保护
Pytest 单元测试
Docker / Docker Compose 容器化部署
GitHub Actions CI 持续集成

🤔 为什么不用 LangChain?

本项目选择手写 Agent 核心逻辑,而非使用 LangChain,原因如下:

  1. 可控性:完全掌握 Tool Calling 的每一轮交互,便于调试和优化
  2. 学习价值:深入理解 Agent 的工作机制,而非依赖框架封装
  3. 轻量级:当前只有 4 个工具,LangChain 的抽象层反而增加复杂度
  4. 优势:手写 Agent 能展示对 LLM 调用链的深入理解

📁 项目结构

customer-agent/
├── app/
│   ├── __init__.py
│   ├── main.py          # CLI 入口
│   ├── api.py           # FastAPI Web 接口(限流、日志)
│   ├── agent.py         # Agent 核心逻辑(重试、日志、Token 追踪、安全过滤)
│   ├── tools.py         # 工具函数(SQLite 数据库操作)
│   ├── prompts.py       # System Prompt
│   ├── state.py         # 对话状态管理
│   ├── schemas.py       # Tool Schema 定义
│   ├── config.py        # 配置管理(Pydantic Settings)
│   ├── logger.py        # 结构化 JSON 日志配置
│   └── security.py      # 输入安全过滤(Prompt Injection 检测)
├── tests/
│   ├── conftest.py      # Pytest fixtures(内存数据库隔离)
│   ├── test_tools.py    # 工具函数测试
│   ├── test_agent.py    # Agent 逻辑测试(Mock LLM、安全过滤)
│   ├── test_api.py      # API 接口测试
│   └── test_security.py # 安全过滤规则测试
├── data/
│   ├── orders.json      # 初始数据
│   └── orders.db        # SQLite 数据库(运行时生成)
├── .github/workflows/
│   └── ci.yml           # GitHub Actions CI
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env.example
└── README.md

📝 开发日志

本项目是从零学习 AI Agent 开发的实战记录,完整保留了迭代过程:

  1. 单文件原型:最初只有 400+ 行的 main.py,硬编码订单数据
  2. 模块化重构:拆分为 6 个模块,数据迁移到 JSON
  3. DSML Fallback:解决 DeepSeek 非标准工具调用输出问题
  4. SQLite 持久化:支持并发读写,数据不丢失
  5. FastAPI 服务化:支持多用户并发会话
  6. 测试覆盖:41 个单元测试,Mock 外部 API
  7. 生产级优化:重试机制、结构化日志、Token 追踪、安全过滤、API 限流

📄 许可证

MIT License

About

客服机器人

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages