Files
ailine/FEATURES.md
root 626bae54ff
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 18s
前端修改
2026-04-16 03:21:38 +08:00

302 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎯 AI Agent 新功能说明
## 新增功能概览
本次更新实现了三大核心功能:**用户登录隔离**、**对话历史管理**、**流式实时响应**。
---
## 一、用户登录系统
### 功能特性
-**可选登录**:用户可以选择输入用户名或直接使用默认用户
-**对话隔离**:不同用户的对话历史完全隔离,避免污染
-**默认用户**:未登录时使用 `default_user`,所有未登录用户共享对话
### 使用方式
1. 启动前端后,左侧栏显示登录界面
2. 输入用户名(可选),点击"进入"
3. 如需切换用户,点击"切换用户"按钮
### 技术实现
- 前端:`st.session_state.user_id``st.session_state.logged_in` 管理登录状态
- 后端:所有 API 请求携带 `user_id` 参数,用于数据隔离
- 数据库LangGraph checkpoint 的 `metadata` 字段存储 `user_id`
---
## 二、对话历史管理
### 功能特性
-**历史列表**:左侧栏显示用户的所有对话历史
-**摘要展示**:每个历史对话显示摘要(第一条消息或生成的 summary
-**一键加载**:点击历史对话,自动加载完整消息历史
-**新对话**:点击"新对话"按钮创建全新对话线程
-**实时更新**:每次对话结束后自动刷新历史列表
### 使用方式
1. 点击"刷新列表"按钮加载历史对话
2. 点击任意历史对话,自动加载完整消息历史
3. 点击"新对话"开始全新话题
### 技术实现
#### 后端新增接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/threads` | GET | 获取用户的对话历史列表 |
| `/thread/{thread_id}/messages` | GET | 获取指定线程的完整消息历史 |
| `/thread/{thread_id}/summary` | GET | 获取指定线程的摘要信息 |
#### 新增模块
- `app/history.py`: `ThreadHistoryService` 类,封装历史查询逻辑
- 直接查询 LangGraph 的 `checkpoints` 表,通过 `metadata->>'user_id'` 过滤
#### 前端实现
- 左侧栏显示历史列表,每个对话显示摘要、时间和消息数量
- 当前选中的对话高亮显示primary 按钮样式)
- 点击历史对话调用 `/thread/{thread_id}/messages` 加载完整历史
---
## 三、流式实时响应
### 功能特性
-**逐字输出**AI 回复实时逐字显示,提升用户体验
-**工具调用状态**:显示工具调用的开始和完成状态
-**Token 统计**:对话结束后显示消耗的 token 数量和耗时
-**错误处理**:流式响应异常时友好提示用户
### 使用方式
- 在输入框输入问题后AI 回复会逐字显示,无需等待完整响应
- 如果 AI 调用工具,会显示"🔧 调用工具: xxx..."的提示
- 工具调用完成后显示"✅ 工具 xxx 完成"
- 回复完成后显示 token 消耗和耗时统计
### 技术实现
#### 后端流式接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/chat/stream` | POST | 流式对话接口SSE |
#### SSE 事件类型
```json
{
"type": "token", // AI 逐字输出
"content": "你好"
}
{
"type": "tool_start", // 工具调用开始
"tool": "search_calendar"
}
{
"type": "tool_end", // 工具调用完成
"tool": "search_calendar"
}
{
"type": "done", // 对话完成
"reply": "完整回复内容",
"token_usage": {"total_tokens": 123},
"elapsed_time": 2.5
}
{
"type": "error", // 错误信息
"message": "错误详情"
}
```
#### Agent 流式处理
- `AIAgentService.process_message_stream()` 方法
- 使用 LangGraph 的 `astream_events()` API 获取流式事件
- 支持所有模型zhipu, deepseek, local
#### 前端流式消费
- 使用 `requests.post(..., stream=True)` 消费 SSE 流
- 逐行解析 `data: {...}` 格式的事件
- 实时更新 UI 显示 token 和工具状态
---
## 四、三栏布局设计
### 布局结构
```
┌──────────────┬──────────────────────────┬──────────────┐
│ 左侧栏 (1) │ 中间栏 (3) │ 右侧栏 (1) │
│ │ │ │
│ 👤 用户 │ 🤖 AI 个人助手 │ 📊 会话信息 │
│ [登录] │ │ │
│ │ [模型选择器] │ 当前对话 │
│ 📚 历史 │ ┌────────────────────┐ │ xxx... │
│ [刷新] │ │ │ │ │
│ [新对话] │ │ 聊天消息区域 │ │ 消息统计 │
│ │ │ │ │ 用户: 5 │
│ 💬 对话1 │ └────────────────────┘ │ AI: 4 │
│ 💬 对话2 │ │ │
│ 💬 对话3 │ [输入框] │ 💡 使用提示 │
│ │ │ │
└──────────────┴──────────────────────────┴──────────────┘
```
### 各栏功能
#### 左侧栏(宽度 1/5
- **用户登录**:输入用户名,切换用户
- **历史列表**:刷新、点击加载、新对话按钮
#### 中间栏(宽度 3/5
- **模型选择**:下拉框选择 AI 模型
- **聊天区域**:显示消息历史,支持流式输出
- **输入框**:输入用户问题
#### 右侧栏(宽度 1/5
- **会话信息**:显示当前线程 ID
- **消息统计**:用户消息和 AI 回复数量
- **使用提示**:功能说明
---
## 五、配置说明
### 环境变量
#### 本地开发(.env
```bash
# API 地址(注意:不需要 /chat 后缀)
API_URL=http://localhost:8083
# 日志调试配置(本地开发推荐 DEBUG
LOG_LEVEL=DEBUG
DEBUG=true
ENABLE_GRAPH_TRACE=true
```
#### Docker 部署(.env.docker
```bash
# API 地址Docker 内部网络)
API_URL=http://backend:8083
# 日志调试配置(生产环境推荐 WARNING
LOG_LEVEL=WARNING
DEBUG=false
ENABLE_GRAPH_TRACE=false
```
### 端口分配
| 服务 | 端口 | 说明 |
|------|------|------|
| llama.cpp LLM | 8081 | Gemma-4-E2B GGUF 模型 |
| llama.cpp Embedding | 8082 | embeddinggemma-300M GGUF 模型 |
| Backend (FastAPI) | 8083 | AI Agent 后端服务 |
| Frontend (Streamlit) | 8501 | Web 界面 |
---
## 六、文件变更清单
### 新增文件
| 文件 | 说明 |
|------|------|
| `app/history.py` | 历史查询服务 `ThreadHistoryService` |
### 修改文件
| 文件 | 修改内容 |
|------|---------|
| `app/agent.py` | • 添加 `process_message_stream()` 流式处理方法<br>`process_message()` 写入 `metadata` 支持历史查询 |
| `app/backend.py` | • 添加 `/threads``/thread/{id}/messages``/thread/{id}/summary` 接口<br>• 添加 `/chat/stream` 流式接口<br>• 注入 `history_service` |
| `frontend/frontend.py` | • 完全重写为三栏布局<br>• 实现用户登录和历史管理<br>• 支持流式响应消费 |
| `.env`, `.env.docker`, `.env.example` | • 移除 `API_URL` 中的 `/chat` 后缀 |
---
## 七、使用示例
### 1. 本地开发启动
```bash
# 启动后端和前端
./scripts/start.sh both
# 访问前端
open http://localhost:8501
```
### 2. Docker 部署
```bash
# 配置环境变量
cp .env.docker .env
# 编辑 .env 填入 API Key
# 启动服务
cd docker
docker compose up -d
```
### 3. API 测试
```bash
# 获取历史列表
curl "http://localhost:8083/threads?user_id=test_user"
# 获取线程消息
curl "http://localhost:8083/thread/{thread_id}/messages?user_id=test_user"
# 流式对话
curl -X POST "http://localhost:8083/chat/stream" \
-H "Content-Type: application/json" \
-d '{
"message": "你好",
"thread_id": "test-thread",
"model": "zhipu",
"user_id": "test_user"
}'
```
---
## 八、注意事项
### 1. 数据库查询性能
- 当前直接查询 `checkpoints` 表的 JSONB `metadata` 字段
- 如果用户对话数量很大,建议在 `checkpoints` 表上创建 GIN 索引:
```sql
CREATE INDEX idx_checkpoints_metadata_user_id
ON checkpoints USING GIN ((metadata->>'user_id'));
```
### 2. 流式响应缓冲
- 如果使用 Nginx 反向代理,需要关闭缓冲:
```nginx
location /chat/stream {
proxy_pass http://backend:8083;
proxy_buffering off;
proxy_cache off;
}
```
### 3. 历史列表分页
- 当前默认返回 50 条历史记录
- 如需支持更多历史,可在 `/threads` 接口添加 `offset` 参数实现分页
### 4. 用户认证增强
- 当前用户登录仅为前端输入,无密码验证
- 如需加强安全性,可集成 OAuth2 或 JWT 认证
---
## 九、下一步优化建议
1. **对话摘要生成**:在 `summarize` 节点中生成对话摘要,存入 checkpoint metadata
2. **历史记录搜索**:添加关键词搜索功能,快速定位历史对话
3. **对话导出**:支持导出对话历史为 Markdown 或 JSON 格式
4. **多设备同步**:同一用户的不同设备共享对话历史
5. **对话标签**:支持为对话添加标签和分类
6. **收藏功能**:支持收藏重要对话,方便快速访问
---
**🎉 新功能已全部实现并测试通过!**