星辰科技智能客服系统
基于 LangChain/LangGraph 的完整智能客服解决方案。本系统整合了原教程 11 个章节的所有核心功能,包括对话记忆、RAG 知识库、情绪识别、意图分类、工单系统、监控评价、计划执行、多 Agent 系统、MCP 技能系统等。本系统目的是为了让skill能够变成公开服务。
系统参考了: https://mp.weixin.qq.com/s/YlfCokFQ7l6QNFYUIHcGqw (图解AI系列)
📋 目录
🏗️ 系统架构
┌─────────────────────────────────────────────────────────────────────────┐
│ 星辰科技智能客服系统 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Web 界面 │ │ API 服务 │ │ 终端交互 │ │
│ │ (Streamlit) │ │ (FastAPI) │ │ (CLI) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────────────────┼────────────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ CustomerService │ │
│ │ Agent │ │
│ └──────────┬──────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 智能路由 │ │ 情绪识别 │ │ 意图分类 │ │
│ │ (Router) │ │ (Emotion) │ │ (Intent) │ │
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 功能模块 │ │
│ ├──────────────┬──────────────┬──────────────┬──────────────┤ │
│ │ 对话记忆 │ RAG 知识库 │ 工单系统 │ 工具函数 │ │
│ │ (Memory) │ (RAG) │ (Ticket) │ (Tools) │ │
│ └──────────────┴──────────────┴──────────────┴──────────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 监控评价 │ │ 计划执行 │ │ 多Agent │ │
│ │ (Monitor) │ │ (Planner) │ │(MultiAgent) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
✨ 功能特性
核心功能
| 功能 | 说明 | 模块 |
|---|---|---|
| 🤖 智能对话 | 基于 LLM 的自然语言理解,支持多轮对话 | agent.py |
| 📚 知识库检索 (RAG) | 向量知识库检索,结合上下文精准回答 | rag.py |
| 😊 情绪识别 | 识别愤怒、焦虑、不满、开心等7种情绪 | classifier.py |
| 🎯 意图分类 | 精准识别咨询、投诉、退款、退货等16种意图 | classifier.py |
| 🎫 工单系统 | 自动创建、跟踪、管理工单 | ticket.py |
| 👤 转人工 | 情绪激动时自动转接人工客服 | ticket.py |
| 💾 对话记忆 | 多轮上下文记忆,支持滑动窗口 | memory.py |
| 🔧 工具函数 | 订单查询、物流查询、库存查询、退款政策 | tools.py |
高级功能
| 功能 | 说明 | 模块 |
|---|---|---|
| 📊 监控评价 | 对话复盘分析、质量评分、监控仪表盘 | monitor.py |
| 📈 计划执行 | LangGraph 状态机、任务规划与执行 | planner.py |
| 👥 多 Agent 系统 | 接待员、售后、技术支持、主管分工 | multi_agent.py |
| 🎯 MCP 技能系统 | 工具注册、技能管理、动态选择 | mcp.py |
接口服务
| 功能 | 说明 | 模块 |
|---|---|---|
| 🌐 Web 界面 | Streamlit 可视化聊天界面 | web.py |
| 🔌 REST API | FastAPI RESTful 接口 | api.py |
| 💻 终端模式 | 命令行交互模式 | main.py |
📁 项目结构
智能客服系统/
├── src/ # 源代码目录
│ ├── __init__.py # 包初始化
│ ├── config.py # 配置模块(LLM、Embeddings、目录)
│ ├── models.py # 数据模型(枚举、消息、工单)
│ ├── memory.py # 对话记忆(SessionManager、ConversationLogger)
│ ├── rag.py # RAG 知识库(KnowledgeBase、RAGQASystem)
│ ├── classifier.py # 情绪识别 + 意图分类 + 智能路由
│ ├── ticket.py # 工单系统 + 转人工管理
│ ├── tools.py # 工具函数(查订单、物流、库存、退款政策)
│ ├── agent.py # 核心 Agent(整合所有功能)
│ ├── api.py # FastAPI 服务
│ ├── web.py # Streamlit Web 界面
│ ├── monitor.py # 监控评价系统
│ ├── planner.py # 计划执行系统(LangGraph)
│ ├── multi_agent.py # 多 Agent 系统
│ └── mcp.py # MCP 技能系统
├── data/ # 数据存储目录(会话、工单)
├── logs/ # 日志文件目录
├── knowledge_base/ # 知识库文档目录
│ └── *.md # Markdown 格式知识文档
├── main.py # 终端入口文件
├── test_all.py # 全面功能测试
├── test_rag.py # RAG功能测试
├── README.md # 项目说明文档
└── requirements.txt # Python 依赖列表
🚀 快速开始
1. 克隆项目
git clone <repository-url>
cd 智能客服系统
2. 创建虚拟环境(推荐)
# 使用 conda
conda create -n customer_service python=3.10
conda activate customer_service
# 或使用 venv
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
3. 安装依赖
pip install -r requirements.txt
4. 配置环境变量
在项目根目录创建 .env 文件:
# ========== 智谱 GLM 模型配置 ==========
# 智谱开放平台: https://open.bigmodel.cn/
OPENAI_API_KEY=your-zhipu-api-key-here
OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4/
OPENAI_MODEL=glm-5v-turbo
# ========== Embeddings 模型 ==========
# 使用智谱 embedding-3 (2048维向量)
EMBEDDINGS_MODEL=embedding-3
# ========== 阿里云 Milvus 向量数据库(生产环境)==========
# Zilliz Cloud: https://zilliz.com.cn/
MILVUS_HOST=https://your-cluster.zillizcloud.com
MILVUS_TOKEN=your-token-here
获取配置信息的步骤
智谱 API Key:
- 访问 智谱开放平台
- 注册/登录账号
- 进入「API 开放平台」
- 创建 API Key并复制到配置中
Zilliz Milvus:
- 访问 Zilliz Cloud
- 注册/登录Zilliz账号
- 创建免费集群(Free Tier)
- 获取集群连接信息(Public Endpoint 和 Token)
本地开发(可选)
如果需要本地测试向量数据库,可以使用本地文件模式:
# ========== 本地 Milvus(仅开发测试,不推荐生产使用)==========
MILVUS_URI=./milvus_data.db
⚠️ 重要提示:
- 本地模式不支持生产环境
- 推荐使用Zilliz Milvus(免费配额足够测试使用)
- 确保
.env文件不要提交到版本控制系统
5. 验证配置
运行测试脚本验证配置是否正确:
python test_all.py
应该看到类似输出:
======================================================================
测试结果汇总
======================================================================
config.py: ✅ 通过
tools.py: ✅ 通过
rag.py: ✅ 通过
mcp.py: ✅ 通过
monitor.py: ✅ 通过
classifier.py: ✅ 通过
memory.py: ✅ 通过
ticket.py: ✅ 通过
agent.py: ✅ 通过
models.py: ✅ 通过
总计: 10/10 测试通过
6. 启动系统
方式一:终端对话模式
python main.py
方式二:API 服务模式
# 启动 API 服务(默认端口 8000)
python -m src.api
# 或
cd src
python api.py
方式三:Web 界面模式
# 安装 streamlit(如果未安装)
pip install streamlit
# 终端1: 启动 API 服务
python -m src.api
# 终端2: 启动 Web 界面(会自动打开浏览器)
streamlit run src/web.py
Web 界面功能说明
启动后访问 http://localhost:8501(Streamlit 默认端口),界面功能包括:
| 功能 | 说明 |
|---|---|
| 💬 聊天窗口 | 支持多轮对话,自动显示历史消息 |
| 😊 情绪显示 | 显示检测到的用户情绪(😊😐🤔😤😡😰😢) |
| 🎯 意图显示 | 显示识别的用户意图(问候/咨询/投诉等) |
| 📋 工单提示 | 创建工单后显示工单号 |
| 🚨 转人工提示 | 需要转人工时显示转接状态 |
| ⏱️ 处理时间 | 显示每轮对话的处理耗时 |
| 🔄 新会话 | 侧边栏按钮可开始新对话 |
| 💡 快捷输入 | 侧边栏提供常见问题快速输入 |
配置 API 地址
如果 API 服务不在本机或使用了不同端口,可以在侧边栏修改 API 地址:
API 地址: http://localhost:8000
📖 模块详解
1. 配置模块 (config.py)
负责系统配置管理,包括 LLM、Embeddings、Milvus 等组件的初始化。
from src.config import get_llm, get_embeddings, get_llm_config, llm, embeddings
# 获取 LLM 实例
llm = get_llm(temperature=0.7)
# 获取 Embeddings 实例
embeddings = get_embeddings()
# 获取配置信息
config = get_llm_config()
print(f"模型: {config['model_name']}")
print(f"API地址: {config['base_url']}")
# 使用延迟加载(推荐)
# 首次调用时才真正创建实例,节省资源
lazy_llm = llm(temperature=0.5)
2. 数据模型 (models.py)
定义系统中使用的所有数据模型和枚举类型。
from src.models import (
# 情绪类型
EmotionType,
# 意图类型
IntentType,
# 路由动作
RouteAction,
# 消息角色
MessageRole,
# 工单状态
TicketStatus,
# 工单优先级
TicketPriority,
# 工单分类
TicketCategory,
# 聊天消息
ChatMessage,
# 会话
ConversationSession,
# 工单
Ticket,
)
# 使用示例
msg = ChatMessage(
role=MessageRole.USER,
content="你好"
)
3. 对话记忆 (memory.py)
提供会话管理和对话日志功能。
from src.memory import SimpleMemory, SessionManager, ConversationLogger
from src.models import MessageRole
# 简单内存(滑动窗口)
memory = SimpleMemory(k=5)
memory.save_context(
{"input": "用户消息"},
{"output": "AI回复"}
)
messages = memory.messages
# 会话管理器(带过期清理)
manager = SessionManager(window_size=5, timeout_minutes=30)
manager.save_context(session_id, user_msg, agent_msg)
session = manager.get_session(session_id)
# 对话日志(持久化)
logger = ConversationLogger()
logger.create_session(session_id, user_id="U001", user_name="张三")
logger.add_message(session_id, MessageRole.USER, "你好")
logger.add_message(session_id, MessageRole.AGENT, "您好!")
sessions = logger.list_sessions(limit=10)
4. RAG 知识库 (rag.py)
基于向量检索的知识库问答系统。
from src.rag import RAGQASystem, RAGCustomerServiceBot, KnowledgeBase
# 方式1:简单问答系统
rag = RAGQASystem()
answer = rag.answer("StarPods Pro有什么特点?")
print(answer)
# 方式2:完整客服机器人(带记忆)
bot = RAGCustomerServiceBot(window_size=5)
response = bot.chat("我想买耳机")
print(response)
# 方式3:直接使用知识库
kb = KnowledgeBase()
kb.initialize() # 初始化并构建索引
results = kb.similarity_search("耳机的保修期是多久?", k=3)
for doc in results:
print(doc)
5. 情绪与意图 (classifier.py)
情绪识别、意图分类和智能路由。
from src.classifier import (
IntentClassifier,
EmotionDetector,
SmartRouter
)
from src.models import EmotionType, IntentType, RouteAction
# 意图分类
classifier = IntentClassifier()
result = classifier.classify("我想退货")
print(f"意图: {result.primary_intent.value}") # return
print(f"置信度: {result.confidence}")
print(f"实体: {result.entities}")
# 情绪检测
detector = EmotionDetector()
result = detector.analyze("你们的东西太差了,我要投诉!")
print(f"情绪: {result.emotion_type.value}") # angry
print(f"强度: {result.intensity}") # 8-10
print(f"建议转人工: {result.should_escalate}") # True
# 智能路由
router = SmartRouter()
decision = router.route("我的订单等了好久都没到!")
print(f"动作: {decision.action.value}") # escalate 或 create_ticket
print(f"理由: {decision.reason}")
print(f"优先级: {decision.priority}") # normal/high/urgent
6. 工单系统 (ticket.py)
工单创建、跟踪和管理。
from src.ticket import TicketSystem, EscalationManager
from src.models import TicketStatus, TicketPriority, TicketCategory
# 工单系统
ticket_sys = TicketSystem()
# 创建工单
ticket = ticket_sys.create_ticket(
user_id="U001",
category=TicketCategory.REFUND,
title="退款申请",
description="申请退款,订单号ORD-123456",
user_name="张三",
priority=TicketPriority.HIGH
)
print(f"工单号: {ticket.ticket_id}")
# 更新状态
ticket_sys.update_ticket_status(
ticket.ticket_id,
TicketStatus.PROCESSING
)
# 添加备注
ticket_sys.add_ticket_message(
ticket.ticket_id,
role="agent",
content="已联系财务部门处理"
)
# 查询工单
all_tickets = ticket_sys.list_tickets(user_id="U001")
stats = ticket_sys.get_ticket_stats()
print(f"总工单: {stats['total']}")
print(f"按状态: {stats['by_status']}")
# 转人工管理
esc_mgr = EscalationManager()
escalation = esc_mgr.create_escalation(
session_id="sess-001",
user_id="U001",
reason="用户情绪激动",
context_summary="投诉订单延迟,态度不满",
emotion_type="angry",
priority="high"
)
print(f"转人工单号: {escalation.request_id}")
7. 工具函数 (tools.py)
可被 Agent 调用的工具函数。
from src.tools import (
get_all_tools,
get_tool_map,
ToolAgent,
query_order,
query_logistics,
query_inventory,
check_refund_policy
)
# 获取所有工具
tools = get_all_tools()
for tool in tools:
print(f"{tool.name}: {tool.description}")
# 使用工具映射
tool_map = get_tool_map()
result = tool_map["query_order"].invoke({"order_id": "ORD-001"})
# 使用 ToolAgent(自动选择工具)
agent = ToolAgent(max_tool_rounds=5)
result = agent.chat("帮我查一下订单 ORD-001 的状态")
print(result["reply"])
print(f"调用工具: {result['tool_calls']}")
8. 核心 Agent (agent.py)
整合所有模块的核心 Agent。
from src.agent import CustomerServiceAgent
# 创建 Agent(可配置功能开关)
agent = CustomerServiceAgent(
use_llm=True, # 使用 LLM
use_rag=True, # 使用知识库
use_tools=True, # 使用工具
use_memory=True, # 使用记忆
)
# 处理对话
response = agent.process(
session_id="sess-001",
user_message="我想查询订单状态",
user_id="U001"
)
print(f"回复: {response.reply}")
print(f"情绪: {response.emotion}")
print(f"意图: {response.intent}")
print(f"动作: {response.action}")
print(f"工单: {response.ticket_id}")
9. 监控评价 (monitor.py)
对话质量监控和复盘分析。
from src.monitor import (
ReviewAnalyzer,
QualityScorer,
Dashboard
)
# 复盘分析
analyzer = ReviewAnalyzer()
messages = [
{"role": "user", "content": "我的订单什么时候到?"},
{"role": "agent", "content": "抱歉,我理解您很着急。已为您查询,快递已在途中,预计明天送达。"}
]
review = analyzer.analyze_conversation(messages)
print(f"综合评分: {review.overall_score:.1f}")
print(f"共情得分: {review.empathy_score:.1f}")
print(f"解决得分: {review.resolution_score:.1f}")
# 质量评分
scorer = QualityScorer()
scorer.record_metrics({
"session_id": "sess-001",
"user_id": "U001",
"total_messages": 10,
"ticket_id": "TKT-001"
})
report = scorer.generate_report(days=7)
print(f"报告: {report}")
# 监控仪表盘
dashboard = Dashboard()
# 使用示例数据
sample_data = [
{"total_messages": 10, "emotion": "neutral", "intent": "query"},
{"total_messages": 15, "emotion": "positive", "intent": "complaint", "ticket_id": "TKT-001"},
]
output = dashboard.generate_dashboard(sample_data, days=7)
print(output)
# 数据导出导入
export_result = dashboard.export_data(format="json")
import_result = dashboard.import_data("backup.json")
stats = dashboard.get_statistics(days=30)
10. MCP 技能系统 (mcp.py)
基于 MCP 协议的工具和技能管理。
from src.mcp import (
SimpleMCPServer,
SimpleMCPClient,
Skill,
SkillManager,
MCPSkillsAgent,
create_mcp_skills_system
)
# 创建 MCP Server
server = SimpleMCPServer(
name="order_server",
description="订单服务"
)
server.register_tool(
name="query_order",
description="查询订单状态",
handler=lambda order_id: f"订单 {order_id} 状态: 已发货",
parameters={"order_id": "订单号"}
)
# 创建技能
skill = Skill(
name="order_query",
description="处理订单相关问题",
system_prompt="你是订单客服专家",
required_tools=["query_order"],
knowledge="订单知识..."
)
# 使用技能管理器
manager = SkillManager()
manager.register_skill(skill)
manager.register_server(server)
# LLM智能选择技能
selected_skill = manager.select_skill("我的订单到哪了?")
print(f"选中技能: {selected_skill.name}")
# 使用 MCP Agent
agent = MCPSkillsAgent(manager)
result = agent.chat("帮我查一下订单 ORD-001")
print(result["reply"])
🔌 API 接口
接口列表
| 接口 | 方法 | 说明 |
|---|---|---|
/ |
GET | 根路径,健康检查 |
/health |
GET | 健康检查 |
/api/chat |
POST | 发送消息 |
/api/session/{id} |
GET | 获取会话 |
/api/sessions |
GET | 列出所有会话 |
/api/tickets |
GET | 列出工单 |
/api/tickets/{id} |
GET | 工单详情 |
/api/ticket-stats |
GET | 工单统计 |
Chat API 使用示例
# 发送消息
curl -X POST http://localhost:8000/api/chat \
-H "Content-Type: application/json" \
-d '{
"session_id": "sess-001",
"user_message": "我想退货",
"user_id": "U001"
}'
响应示例:
{
"reply": "您好!非常理解您想要退货的心情...",
"session_id": "sess-001",
"emotion": "neutral",
"intent": "return",
"action": "create_ticket",
"ticket_id": "TKT-20240513-001",
"escalation_id": null,
"confidence": 0.92,
"processing_time_ms": 1250
}
Python SDK 方式
import requests
# 发送消息
response = requests.post(
"http://localhost:8000/api/chat",
json={
"session_id": "sess-001",
"user_message": "我的订单到哪了",
"user_id": "U001"
}
)
result = response.json()
print(result["reply"])
💻 使用示例
示例 1:基础对话
from src.agent import CustomerServiceAgent
agent = CustomerServiceAgent()
response = agent.process(
session_id="",
user_message="你好,我想了解一下你们的产品"
)
print(response.reply)
示例 2:带工具调用的对话
agent = CustomerServiceAgent(use_tools=True)
response = agent.process(
session_id="sess-001",
user_message="帮我查一下订单 ORD-001 的状态"
)
print(response.reply)
# 输出:订单 ORD-001 当前状态为已发货,预计明天送达。
示例 3:多轮对话
session_id = "sess-001"
agent = CustomerServiceAgent(use_memory=True)
# 第一轮
r1 = agent.process(session_id, "我想买耳机")
print(r1.reply)
# 第二轮(带上下文)
r2 = agent.process(session_id, "有什么推荐的吗?")
print(r2.reply)
# 第三轮
r3 = agent.process(session_id, "StarPods Pro 多少钱?")
print(r3.reply)
示例 4:使用 RAG 知识库
from src.rag import RAGQASystem
rag = RAGQASystem()
# 直接问答
answer = rag.answer("StarPods Pro有什么特点?")
print(answer)
# 使用完整机器人(带记忆)
from src.rag import RAGCustomerServiceBot
bot = RAGCustomerServiceBot(window_size=5)
response = bot.chat("我想买耳机")
print(response)
response = bot.chat("有什么颜色可选?") # 自动带上前文上下文
print(response)
示例 5:工单处理流程
from src.ticket import TicketSystem
from src.models import TicketCategory, TicketPriority, TicketStatus
system = TicketSystem()
# 创建工单
ticket = system.create_ticket(
user_id="U001",
category=TicketCategory.REFUND,
title="退款申请",
description="订单ORD-123456已收货,申请全额退款",
priority=TicketPriority.HIGH
)
print(f"工单已创建: {ticket.ticket_id}")
# 模拟处理流程
system.update_ticket_status(ticket.ticket_id, TicketStatus.PROCESSING)
system.add_ticket_message(
ticket.ticket_id,
role="agent",
content="已联系财务,预计3个工作日到账"
)
# 完成工单
system.update_ticket_status(ticket.ticket_id, TicketStatus.RESOLVED)
🛠️ 技术栈
| 类别 | 技术 |
|---|---|
| LLM 框架 | LangChain, LangGraph |
| LLM | 智谱 GLM-5 (glm-5v-turbo) |
| 向量存储 | 阿里云 Milvus (Zilliz Cloud) |
| Embeddings | 智谱 embedding-3 (2048维) |
| API 框架 | FastAPI |
| Web 界面 | Streamlit |
| 数据验证 | Pydantic |
| 环境管理 | python-dotenv |
⚙️ 配置说明
知识库配置
在 knowledge_base/ 目录下添加 Markdown 文件,系统启动时会自动加载。
示例 knowledge_base/products.md:
## 产品信息
### StarPods Pro 智能耳机
- 价格: ¥799
- 特点: 主动降噪、30小时续航、Hi-Fi音质
- 颜色: 白色、黑色、蓝色
- 保修: 1年官方保修
### StarWatch X 智能手表
- 价格: ¥1299
- 特点: 14天续航、健康监测、50米防水
- 保修: 2年官方保修
### StarBox 智能音箱
- 价格: ¥399
- 特点: 360°环绕声、语音控制、智能家居
- 保修: 1年官方保修
## 常见问题
### 耳机有保修吗?
所有星辰科技产品均提供官方保修服务,具体见各产品保修期限。
### 如何申请退换货?
7天内无理由退换,15天内质量问题换货。请联系客服或前往官网申请。
### 快递多久能到?
默认顺丰快递,一般1-2个工作日送达,偏远地区3-5天。
工具函数扩展
在 src/tools.py 中添加新的工具函数:
from langchain_core.tools import tool
@tool
def your_new_tool(param: str) -> str:
"""工具描述,会自动被 Agent 发现和使用"""
# 实现逻辑
return result
📦 依赖
langchain>=0.1.0
langchain-core>=0.1.0
langchain-openai>=0.0.5
langchain-community>=0.0.10
langchain-text-splitters>=0.0.1
langgraph>=0.0.20
pymilvus>=2.4.0
fastapi>=0.104.0
uvicorn>=0.24.0
streamlit>=1.28.0
pydantic>=2.5.0
python-dotenv>=1.0.0
requests>=2.31.0
🧪 测试指南
运行全部测试
python test_all.py
运行 RAG 测试
python test_rag.py
测试特定模块
# 测试配置
python -c "from src.config import get_llm; print(get_llm())"
# 测试工具
python -c "from src.tools import get_all_tools; print(len(get_all_tools()))"
# 测试知识库
python -c "from src.rag import RAGQASystem; r=RAGQASystem(); print(r.answer('耳机保修多久?'))"
🚀 部署说明
生产环境部署清单
-
配置
.env文件- 获取智谱API Key:在 智谱开放平台 注册并获取
- 配置阿里云Milvus:在 Zilliz Cloud 创建集群
-
知识库准备
- 在
knowledge_base/目录下添加产品文档(Markdown格式) - 系统启动时会自动构建向量索引
- 在
-
启动服务
# API服务(推荐使用 uvicorn) uvicorn src.api:app --host 0.0.0.0 --port 8000 --workers 4 # 或使用 gunicorn gunicorn src.api:app -w 4 -k uvicorn.workers.UvicornWorker
Docker 部署(可选)
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENV PYTHONPATH=/app
EXPOSE 8000
CMD ["uvicorn", "src.api:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t customer-service .
docker run -d -p 8000:8000 --env-file .env customer-service
❓ 常见问题
Q1: 启动时报错 "OPENAI_API_KEY not found"
解决: 确保在项目根目录创建了 .env 文件,并包含正确的 OPENAI_API_KEY
Q2: Milvus 连接失败
解决:
- 检查
MILVUS_HOST和MILVUS_TOKEN是否正确 - 确保网络可以访问阿里云 Milvus
- 本地开发可以使用
MILVUS_URI=./milvus_data.db
Q3: 知识库检索没有结果
解决:
- 检查
knowledge_base/目录下是否有 Markdown 文件 - 确保文件编码为 UTF-8
- 可以删除
data/目录下的向量索引文件重新构建
Q4: API 响应很慢
解决:
- 首次调用需要初始化 LLM 和向量索引,会有延迟
- 检查网络连接
- 考虑增加缓存或使用更快的模型
Q5: 如何添加新的工具函数?
解决: 在 src/tools.py 中使用 @tool 装饰器添加新函数,参考现有示例
Q6: 如何自定义知识库内容?
解决:
- 在
knowledge_base/目录添加 Markdown 文件 - 使用
##和###标题组织内容 - 重启服务后自动重新加载
🤝 许可证
MIT License
📞 支持
如有问题,请提交 Issue 或联系维护者。
特别感谢
文档更新时间: 2024-05-13
