168 lines
5.2 KiB
Markdown
168 lines
5.2 KiB
Markdown
# 智能聊天助手性能优化实施报告
|
||
|
||
## 📊 优化完成情况
|
||
|
||
### ✅ 已完成的优化
|
||
|
||
#### 1. 删除 llm-format 节点 ⭐⭐⭐⭐⭐
|
||
- **状态**:✅ 已完成
|
||
- **优化内容**:
|
||
- 删除了 `llm-format` 节点(原第14个节点)
|
||
- 优化了 `llm-question` 节点的 prompt,直接生成格式化好的回复
|
||
- 更新了工作流边连接:`cache-update` 直接连接到 `end-1`
|
||
- **效果**:减少 1 个 LLM 调用,节省 **1-2 秒**
|
||
|
||
#### 2. 优化 max_tokens 配置 ⭐⭐⭐⭐
|
||
- **状态**:✅ 已完成
|
||
- **优化内容**:
|
||
- `llm-intent`: 1000 → **200** (减少 80%)
|
||
- `llm-greeting`: 500 → **200** (减少 60%)
|
||
- `llm-question`: 2000 → **1000** (减少 50%)
|
||
- `llm-emotion`: 1000 → **500** (减少 50%)
|
||
- `llm-request`: 1500 → **800** (减少 47%)
|
||
- `llm-goodbye`: 300 → **150** (减少 50%)
|
||
- `llm-general`: 1000 → **500** (减少 50%)
|
||
- **效果**:减少 token 生成时间,节省 **0.5-1 秒**,降低 **30-40%** token 消耗
|
||
|
||
#### 3. 对话历史截断 ⭐⭐⭐⭐
|
||
- **状态**:✅ 已完成
|
||
- **优化内容**:
|
||
- 在 `workflow_engine.py` 中添加了对话历史截断逻辑
|
||
- 自动保留最近 **20 条**对话记录
|
||
- 在 `cache-update` 节点执行后自动截断
|
||
- **效果**:
|
||
- 减少 prompt 长度,节省 **0.2-0.5 秒**
|
||
- 降低 token 消耗
|
||
- 提升 LLM 响应速度
|
||
|
||
## 📈 性能提升预期
|
||
|
||
### 优化前
|
||
- **平均响应时间**:5-6 秒
|
||
- **LLM 调用次数**:3 次(意图理解 + 问题回答 + 格式化)
|
||
- **Token 消耗**:约 3500-4500 tokens/对话
|
||
- **节点数量**:15 个
|
||
|
||
### 优化后
|
||
- **平均响应时间**:**3-4 秒**(提升 **40%**)
|
||
- **LLM 调用次数**:**2 次**(意图理解 + 问题回答)
|
||
- **Token 消耗**:约 **2000-2800 tokens/对话**(减少 **30-40%**)
|
||
- **节点数量**:**14 个**(减少 1 个)
|
||
|
||
## 🔧 技术实现细节
|
||
|
||
### 1. 工作流结构优化
|
||
|
||
**优化前流程**:
|
||
```
|
||
开始 → 查询记忆 → 合并上下文 → 意图理解 → 意图路由 →
|
||
[5个分支] → 合并回复 → 更新记忆 → 格式化回复 → 结束
|
||
```
|
||
|
||
**优化后流程**:
|
||
```
|
||
开始 → 查询记忆 → 合并上下文 → 意图理解 → 意图路由 →
|
||
[5个分支,直接生成最终回复] → 合并回复 → 更新记忆 → 结束
|
||
```
|
||
|
||
### 2. LLM 节点 Prompt 优化
|
||
|
||
**llm-question 节点优化**:
|
||
- 添加了"确保回复格式自然、完整,无需额外格式化"的指令
|
||
- 让 LLM 直接生成最终格式的回复,避免二次格式化
|
||
|
||
### 3. 对话历史截断实现
|
||
|
||
**位置**:`backend/app/services/workflow_engine.py`
|
||
|
||
**实现逻辑**:
|
||
```python
|
||
# 确保conversation_history只保留最近的20条(性能优化)
|
||
if isinstance(value, dict) and 'conversation_history' in value:
|
||
if isinstance(value['conversation_history'], list):
|
||
max_history_length = 20
|
||
if len(value['conversation_history']) > max_history_length:
|
||
value['conversation_history'] = value['conversation_history'][-max_history_length:]
|
||
logger.info(f"[rjb] 对话历史已截断,保留最近 {max_history_length} 条")
|
||
```
|
||
|
||
## 📋 优化清单
|
||
|
||
| 优化项 | 状态 | 预期效果 | 实际效果 |
|
||
|--------|------|----------|----------|
|
||
| 删除 llm-format 节点 | ✅ 完成 | 节省 1-2 秒 | 待测试 |
|
||
| 优化 max_tokens | ✅ 完成 | 节省 0.5-1 秒 | 待测试 |
|
||
| 对话历史截断 | ✅ 完成 | 节省 0.2-0.5 秒 | 待测试 |
|
||
|
||
## 🚀 下一步建议
|
||
|
||
### 中优先级优化(可选)
|
||
|
||
1. **使用 WebSocket 替代轮询** ⭐⭐⭐⭐
|
||
- 实施难度:中
|
||
- 效果:提升实时性,减少服务器负载
|
||
- 预计时间:2-3 小时
|
||
|
||
2. **智能轮询(如果不用 WebSocket)** ⭐⭐⭐
|
||
- 实施难度:低
|
||
- 效果:减少 30-50% 无效请求
|
||
- 预计时间:1 小时
|
||
|
||
### 高级优化(可选)
|
||
|
||
3. **流式响应** ⭐⭐⭐⭐⭐
|
||
- 实施难度:高
|
||
- 效果:首字响应时间降低 50-70%
|
||
- 预计时间:4-6 小时
|
||
|
||
4. **LLM 响应缓存** ⭐⭐⭐
|
||
- 实施难度:中
|
||
- 效果:重复问题响应时间 < 100ms
|
||
- 预计时间:2-3 小时
|
||
|
||
## 📝 测试建议
|
||
|
||
1. **性能测试**:
|
||
- 测试优化前后的响应时间对比
|
||
- 监控 LLM API 调用次数和耗时
|
||
- 检查对话历史是否正确截断
|
||
|
||
2. **功能测试**:
|
||
- 验证删除 llm-format 节点后,回复格式是否正常
|
||
- 验证各分支节点的回复质量
|
||
- 验证记忆功能是否正常
|
||
|
||
3. **压力测试**:
|
||
- 测试长时间对话(超过20条)时的性能
|
||
- 测试并发请求的处理能力
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **向后兼容**:优化后的配置已更新到数据库,现有对话会使用新配置
|
||
2. **对话历史**:超过20条的旧对话历史会被自动截断
|
||
3. **回复格式**:由于删除了格式化节点,需要确保各分支节点生成的回复格式正确
|
||
|
||
## 📊 监控指标
|
||
|
||
建议监控以下指标以验证优化效果:
|
||
|
||
1. **响应时间**:
|
||
- P50(中位数)
|
||
- P95(95% 分位数)
|
||
- P99(99% 分位数)
|
||
|
||
2. **LLM 调用**:
|
||
- 各节点的平均调用时间
|
||
- Token 消耗统计
|
||
|
||
3. **系统资源**:
|
||
- CPU 使用率
|
||
- 内存使用率
|
||
- 数据库连接数
|
||
|
||
---
|
||
|
||
**优化完成时间**:2024年
|
||
**优化版本**:v1.0
|
||
**维护人员**:AI Assistant
|