242 lines
5.3 KiB
Markdown
242 lines
5.3 KiB
Markdown
# LangChain 对话机器人技术架构文档
|
||
|
||
## 1. 架构设计
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[用户/命令行] --> B[FastAPI 应用]
|
||
A --> C[命令行对话程序]
|
||
B --> D[LangGraph 工作流引擎]
|
||
C --> E[LangChain Chain]
|
||
D --> F[意图分析节点]
|
||
D --> G[订单诊断节点]
|
||
D --> H[自然对话节点]
|
||
E --> I[Ollama 本地模型]
|
||
F --> I
|
||
G --> I
|
||
H --> I
|
||
B --> J[LangSmith 监控]
|
||
D --> J
|
||
|
||
subgraph "应用层"
|
||
B
|
||
C
|
||
end
|
||
|
||
subgraph "业务逻辑层"
|
||
D
|
||
E
|
||
F
|
||
G
|
||
H
|
||
end
|
||
|
||
subgraph "模型服务层"
|
||
I
|
||
end
|
||
|
||
subgraph "监控层"
|
||
J
|
||
end
|
||
```
|
||
|
||
## 2. 技术描述
|
||
- **前端**: 命令行界面 (CLI)
|
||
- **后端**: FastAPI + LangChain + LangGraph
|
||
- **模型服务**: Ollama 本地部署
|
||
- **监控**: LangSmith
|
||
|
||
核心依赖:
|
||
- Python 3.8+
|
||
- FastAPI 0.104.1
|
||
- LangChain 0.3.27
|
||
- LangGraph 0.6.6
|
||
- LangChain-Ollama 0.3.7
|
||
- LangSmith >= 0.1.0
|
||
|
||
## 3. 路由定义
|
||
| 路由 | 用途 |
|
||
|------|------|
|
||
| /chat/stream | 流式对话接口,支持意图分析和多轮对话 |
|
||
| /health | 健康检查接口,验证服务状态 |
|
||
|
||
## 4. API 定义
|
||
|
||
### 4.1 核心 API
|
||
|
||
流式对话接口
|
||
```
|
||
POST /chat/stream
|
||
```
|
||
|
||
请求参数:
|
||
| 参数名 | 参数类型 | 是否必需 | 描述 |
|
||
|--------|----------|----------|------|
|
||
| message | string | true | 用户输入的消息内容 |
|
||
| session_id | string | false | 会话ID,用于多轮对话上下文 |
|
||
|
||
响应格式 (Server-Sent Events):
|
||
| 字段名 | 字段类型 | 描述 |
|
||
|--------|----------|------|
|
||
| type | string | 消息类型:intent_analysis, thinking, order_info, diagnosis, chat_response |
|
||
| content | string | 消息内容 |
|
||
| timestamp | string | 时间戳 |
|
||
|
||
请求示例:
|
||
```json
|
||
{
|
||
"message": "我的订单有问题,帮我看看",
|
||
"session_id": "session_123"
|
||
}
|
||
```
|
||
|
||
响应示例:
|
||
```
|
||
data: {"type": "intent_analysis", "content": "检测到订单诊断意图", "timestamp": "2024-01-01T10:00:00Z"}
|
||
|
||
data: {"type": "thinking", "content": "正在分析订单问题...", "timestamp": "2024-01-01T10:00:01Z"}
|
||
|
||
data: {"type": "order_info", "content": "{\"order_id\": \"12345\", \"status\": \"processing\"}", "timestamp": "2024-01-01T10:00:02Z"}
|
||
|
||
data: {"type": "diagnosis", "content": "订单状态正常,预计明天发货", "timestamp": "2024-01-01T10:00:03Z"}
|
||
```
|
||
|
||
## 5. 服务架构图
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[FastAPI 应用] --> B[路由层]
|
||
B --> C[业务逻辑层]
|
||
C --> D[LangGraph 状态机]
|
||
D --> E[意图分析服务]
|
||
D --> F[订单诊断服务]
|
||
D --> G[对话服务]
|
||
E --> H[Ollama 模型接口]
|
||
F --> H
|
||
G --> H
|
||
C --> I[LangSmith 监控服务]
|
||
|
||
subgraph 服务层
|
||
A
|
||
B
|
||
C
|
||
end
|
||
|
||
subgraph 业务层
|
||
D
|
||
E
|
||
F
|
||
G
|
||
end
|
||
|
||
subgraph 外部服务
|
||
H
|
||
I
|
||
end
|
||
```
|
||
|
||
## 6. 数据模型
|
||
|
||
### 6.1 数据模型定义
|
||
|
||
```mermaid
|
||
erDiagram
|
||
ChatSession ||--o{ Message : contains
|
||
Message ||--|| IntentAnalysis : has
|
||
Message ||--o| OrderDiagnosis : may_have
|
||
|
||
ChatSession {
|
||
string session_id PK
|
||
datetime created_at
|
||
datetime updated_at
|
||
string status
|
||
}
|
||
|
||
Message {
|
||
string message_id PK
|
||
string session_id FK
|
||
string content
|
||
string message_type
|
||
datetime timestamp
|
||
string intent
|
||
}
|
||
|
||
IntentAnalysis {
|
||
string analysis_id PK
|
||
string message_id FK
|
||
string detected_intent
|
||
float confidence
|
||
string reasoning
|
||
}
|
||
|
||
OrderDiagnosis {
|
||
string diagnosis_id PK
|
||
string message_id FK
|
||
string order_info_json
|
||
string diagnosis_result
|
||
string thinking_process
|
||
}
|
||
```
|
||
|
||
### 6.2 数据定义语言
|
||
|
||
由于这是一个演示项目,主要使用内存存储,不需要持久化数据库。以下是主要的数据结构定义:
|
||
|
||
消息数据结构
|
||
```python
|
||
# 聊天消息模型
|
||
class ChatMessage(BaseModel):
|
||
message_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||
session_id: str
|
||
content: str
|
||
message_type: str # user, assistant, system
|
||
timestamp: datetime = Field(default_factory=datetime.now)
|
||
intent: Optional[str] = None
|
||
|
||
# 意图分析结果
|
||
class IntentAnalysis(BaseModel):
|
||
detected_intent: str # order_diagnosis, natural_chat
|
||
confidence: float
|
||
reasoning: str
|
||
|
||
# 订单信息模拟数据
|
||
class OrderInfo(BaseModel):
|
||
order_id: str
|
||
customer_name: str
|
||
product_name: str
|
||
status: str
|
||
order_date: str
|
||
estimated_delivery: str
|
||
|
||
# 流式响应数据
|
||
class StreamResponse(BaseModel):
|
||
type: str # intent_analysis, thinking, order_info, diagnosis, chat_response
|
||
content: str
|
||
timestamp: str
|
||
```
|
||
|
||
初始化模拟数据
|
||
```python
|
||
# 模拟订单数据
|
||
MOCK_ORDERS = {
|
||
"12345": {
|
||
"order_id": "12345",
|
||
"customer_name": "张三",
|
||
"product_name": "iPhone 15 Pro",
|
||
"status": "processing",
|
||
"order_date": "2024-01-01",
|
||
"estimated_delivery": "2024-01-05"
|
||
},
|
||
"67890": {
|
||
"order_id": "67890",
|
||
"customer_name": "李四",
|
||
"product_name": "MacBook Pro",
|
||
"status": "shipped",
|
||
"order_date": "2023-12-28",
|
||
"estimated_delivery": "2024-01-03"
|
||
}
|
||
}
|
||
|
||
# 会话存储 (内存)
|
||
chat_sessions: Dict[str, List[ChatMessage]] = {}
|
||
``` |