08_实战项目 - 智能客服系统

本课程是系列的综合实战,指导你构建一个生产级的智能客服系统。项目整合前面所学的所有知识:Agent、Memory、Tools、RAG,并结合FastAPI构建完整的Web应用。你将学习分层架构设计、API接口开发、会话管理、错误处理、性能优化等工程化实践,获得一个可直接商用的AI应用。

🎯 学习目标

  • 综合运用所学知识
  • 构建完整的AI应用
  • 掌握工程化开发方法
  • 学习部署和优化

📖 项目概述

项目:智能客服系统

构建一个功能完整的智能客服系统,包含:

1
2
3
4
5
6
7
8
9
10
11
功能模块:
├── 💬 多轮对话(记忆管理)
├── 📚 知识库问答(RAG)
├── 🔧 工具调用(Agent)
│ ├── 查询订单
│ ├── 查询物流
│ ├── 退换货处理
│ └── 用户信息查询
├── 🎯 意图识别(路由)
├── 📊 数据统计
└── 🌐 Web界面

技术栈

1
2
3
4
5
6
7
8
9
后端:
- FastAPI:Web框架
- LangChain:AI应用框架
- Chroma:向量数据库
- SQLite:业务数据库

前端:
- HTML + JavaScript(简单版)
- 或 Streamlit(快速原型)

💻 系统架构

1
2
3
4
5
6
7
8
9
10
11
12
用户输入

[意图识别] ──┬── 闲聊 → 闲聊模块
├── 订单查询 → Agent(调用工具)
├── 知识查询 → RAG
└── 复杂问题 → Agent + RAG

[记忆管理] ← 保存对话历史

[响应生成]

返回用户

📁 项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
intelligent_customer_service/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI入口
│ ├── config.py # 配置
│ └── api/
│ ├── __init__.py
│ └── chat.py # 聊天API
├── core/
│ ├── __init__.py
│ ├── llm.py # LLM配置
│ ├── memory.py # 记忆管理
│ ├── rag.py # RAG模块
│ ├── agent.py # Agent模块
│ ├── router.py # 路由模块
│ └── tools/
│ ├── __init__.py
│ ├── order.py # 订单工具
│ ├── logistics.py # 物流工具
│ └── user.py # 用户工具
├── data/
│ ├── knowledge/ # 知识库文档
│ ├── database/ # 数据库文件
│ └── vector_store/ # 向量数据库
├── frontend/
│ ├── index.html # Web界面
│ └── app.js
├── tests/
│ ├── test_rag.py
│ ├── test_agent.py
│ └── test_api.py
├── requirements.txt
├── README.md
└── run.py # 启动脚本

🔧 核心模块实现

1. 意图识别路由

参见:router.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from enum import Enum
from pydantic import BaseModel

class Intent(str, Enum):
"""意图类型"""
CHITCHAT = "chitchat" # 闲聊
ORDER_QUERY = "order_query" # 订单查询
KNOWLEDGE = "knowledge" # 知识查询
COMPLEX = "complex" # 复杂问题

class IntentRouter:
"""意图路由器"""

def route(self, user_input: str) -> Intent:
"""识别用户意图"""
# 使用LLM识别意图
pass

2. 工具集成

参见:tools/order.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain.tools import tool

@tool
def query_order(order_id: str) -> str:
"""
查询订单信息

Args:
order_id: 订单号

Returns:
订单详情
"""
# 查询数据库
pass

3. RAG集成

参见:rag.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

class KnowledgeBase:
"""知识库"""

def __init__(self):
self.vectorstore = self._load_vectorstore()
self.qa_chain = self._create_chain()

def query(self, question: str) -> str:
"""查询知识库"""
return self.qa_chain.invoke(question)

4. 记忆管理

参见:memory.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain.memory import ConversationBufferMemory
from typing import Dict

class MemoryManager:
"""会话记忆管理器"""

def __init__(self):
self.memories: Dict[str, ConversationBufferMemory] = {}

def get_memory(self, session_id: str) -> ConversationBufferMemory:
"""获取会话记忆"""
if session_id not in self.memories:
self.memories[session_id] = ConversationBufferMemory()
return self.memories[session_id]

5. FastAPI集成

参见:app/api/chat.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel

router = APIRouter()

class ChatRequest(BaseModel):
session_id: str
message: str

class ChatResponse(BaseModel):
response: str
intent: str
sources: list = []

@router.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest) -> ChatResponse:
"""聊天接口"""
# 处理请求
pass

🎨 功能实现

功能1:订单查询

1
2
3
4
5
6
7
8
9
10
11
用户:"我的订单ORD123456到哪了?"

意图识别:order_query

Agent思考:需要查询订单和物流信息

调用工具:
1. query_order("ORD123456")
2. query_logistics("ORD123456")

生成回复:"您的订单ORD123456已发货,预计明天送达"

功能2:知识查询

1
2
3
4
5
6
7
用户:"你们的退货政策是什么?"

意图识别:knowledge

RAG检索:搜索知识库中的退货政策文档

生成回复:基于文档内容回答

功能3:复杂问题

1
2
3
4
5
6
7
8
9
10
11
用户:"我要退货,但不知道订单号"

意图识别:complex

Agent + RAG:
1. 查询用户的订单列表
2. 询问用户确认订单
3. 查询退货政策
4. 引导用户退货流程

多轮对话完成任务

🚀 部署和优化

1. 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 使用缓存
from langchain.cache import InMemoryCache
import langchain
langchain.llm_cache = InMemoryCache()

# 2. 异步处理
async def chat_async(message: str) -> str:
"""异步聊天"""
pass

# 3. 批处理
results = await chain.abatch([msg1, msg2, msg3])

# 4. 流式输出
async def stream_response(message: str):
async for chunk in chain.astream(message):
yield chunk

2. 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from functools import wraps

def safe_api_call(func):
"""安全包装API调用"""
@wraps(func)
async def wrapper(*args, **kwargs):
try:
return await func(*args, **kwargs)
except ValueError as e:
return {"error": f"参数错误:{e}"}
except TimeoutError:
return {"error": "请求超时,请重试"}
except Exception as e:
logger.error(f"API错误:{e}")
return {"error": "服务暂时不可用"}
return wrapper

3. 日志和监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import logging
from datetime import datetime

class ChatLogger:
"""聊天日志"""

def log_conversation(
self,
session_id: str,
user_message: str,
ai_response: str,
intent: str,
duration: float
):
"""记录对话"""
logger.info({
"timestamp": datetime.now(),
"session_id": session_id,
"user_message": user_message,
"ai_response": ai_response,
"intent": intent,
"duration": duration
})

4. 配置管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
"""配置"""

# API配置
api_key: str
base_url: str
model_name: str

# 数据库配置
database_url: str
vector_store_path: str

# 业务配置
max_conversation_turns: int = 10
retrieve_top_k: int = 4

class Config:
env_file = ".env"

settings = Settings()

📝 测试

单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pytest
from core.rag import KnowledgeBase

def test_knowledge_base():
"""测试知识库"""
kb = KnowledgeBase()
result = kb.query("退货政策是什么?")
assert "退货" in result
assert len(result) > 0

def test_order_tool():
"""测试订单工具"""
from core.tools.order import query_order
result = query_order("ORD123456")
assert "ORD123456" in result

集成测试

1
2
3
4
5
6
7
8
9
10
11
def test_full_conversation():
"""测试完整对话流程"""
session_id = "test_session"

# 第一轮
response1 = chat(session_id, "我想查订单")
assert "订单号" in response1

# 第二轮
response2 = chat(session_id, "ORD123456")
assert "订单" in response2

🎯 进阶功能

1. 多语言支持

1
2
3
4
5
6
7
8
def detect_language(text: str) -> str:
"""检测语言"""
# 使用语言检测库
pass

def translate_if_needed(text: str, target_lang: str) -> str:
"""翻译"""
pass

2. 情感分析

1
2
3
4
5
6
7
8
9
from langchain.output_parsers import PydanticOutputParser

class Sentiment(BaseModel):
emotion: str # positive/negative/neutral
score: float # 0-1

def analyze_sentiment(text: str) -> Sentiment:
"""分析情感"""
pass

3. 个性化推荐

1
2
3
4
5
def get_recommendations(user_id: str) -> List[str]:
"""根据用户历史推荐"""
# 分析用户历史对话
# 生成个性化推荐
pass

📊 监控指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from dataclasses import dataclass
from datetime import datetime

@dataclass
class Metrics:
"""系统指标"""
total_conversations: int
avg_response_time: float
intent_distribution: dict
success_rate: float
user_satisfaction: float

def to_dict(self) -> dict:
"""转换为字典"""
return {
"total_conversations": self.total_conversations,
"avg_response_time": self.avg_response_time,
"intent_distribution": self.intent_distribution,
"success_rate": self.success_rate,
"user_satisfaction": self.user_satisfaction,
"updated_at": datetime.now().isoformat()
}

🎯 检查清单

完成本课后,你应该能够:

  • 设计AI应用架构
  • 集成多个LangChain组件
  • 创建RESTful API
  • 处理错误和异常
  • 实现日志和监控
  • 编写测试
  • 部署应用

💡 核心要点

  1. 模块化设计

    • 职责分离
    • 易于测试
    • 便于维护
  2. 错误处理很重要

    • 优雅降级
    • 清晰的错误信息
    • 重试机制
  3. 性能优化

    • 缓存
    • 异步处理
    • 批处理
  4. 可观测性

    • 日志记录
    • 指标监控
    • 问题追踪

🎓 总结

恭喜你完成了整个LangChain学习系列!

你学到了什么

1
2
3
4
5
6
7
8
第1课:理解AI应用开发的思维
第2课:搭建开发环境
第3课:掌握核心组件
第4课:学会组合组件(Chain)
第5课:添加记忆功能
第6课:使用Agent和工具
第7课:构建知识库(RAG)
第8课:开发完整应用 ← 你在这里!

下一步建议

  1. 深入学习

    • LangGraph(高级工作流)
    • LangSmith(调试和监控)
    • LangServe(快速部署)
  2. 实践项目

    • 个人知识助手
    • 代码审查助手
    • 数据分析助手
    • 内容创作助手
  3. 社区参与

    • GitHub:贡献开源项目
    • Discord:加入LangChain社区
    • 博客:分享你的经验

学习资源

  • 本节项目代码:https://gitee.com/uyynot/intelligentcustomerservice.git
  • 官方文档:https://python.langchain.com/
  • GitHub:https://github.com/langchain-ai/langchain
  • 示例项目:https://github.com/langchain-ai/langchain/tree/master/cookbook

🎉 恭喜完成课程!现在去构建你自己的AI应用吧!