2026-04-13 23:57:16 +08:00
|
|
|
|
# AI Agent - 智能助手系统
|
2026-04-12 01:42:34 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
基于 LangGraph + FastAPI 的智能对话助手,支持多模型切换、RAG 检索、联网搜索、子图系统等。
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-04-13 23:57:16 +08:00
|
|
|
|
---
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
## 目录
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
- [核心功能](#核心功能)
|
|
|
|
|
|
- [快速开始](#快速开始)
|
|
|
|
|
|
- [项目结构](#项目结构)
|
|
|
|
|
|
- [API 接口](#api-接口)
|
|
|
|
|
|
- [配置说明](#配置说明)
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
## 核心功能
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 对话能力
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
| 功能 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| 智能对话 | 多轮对话,自动记忆上下文 |
|
|
|
|
|
|
| 多模型切换 | 前端可选择不同 LLM |
|
|
|
|
|
|
| 流式响应 | SSE 流式输出,打字机效果 |
|
|
|
|
|
|
| 持久化记忆 | PostgreSQL 存储对话历史 |
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 工具系统
|
2026-04-26 12:33:25 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
| 工具 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| RAG 检索 | 知识库检索,带置信度评估 |
|
|
|
|
|
|
| 联网搜索 | DuckDuckGo 免费搜索 |
|
|
|
|
|
|
| 通讯录 | 联系人管理、邮件处理 |
|
|
|
|
|
|
| 词典 | 翻译、术语提取、生词本 |
|
|
|
|
|
|
| 资讯分析 | 新闻检索、关键词提取 |
|
2026-04-26 12:33:25 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 技术特性
|
2026-04-26 12:33:25 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
- **模块化架构**:清晰的代码分层,易于扩展
|
|
|
|
|
|
- **模型降级**:多模型自动降级,保证高可用
|
|
|
|
|
|
- **子图系统**:独立的工作流模块,按需调用
|
|
|
|
|
|
- **格式化输出**:统一的 Markdown 格式化,支持模板
|
2026-04-26 12:33:25 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
## 快速开始
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 环境要求
|
2026-04-26 12:33:25 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
- Python 3.10+
|
|
|
|
|
|
- PostgreSQL(远程或本地)
|
|
|
|
|
|
- Qdrant 向量数据库(远程或本地)
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 安装依赖
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-09 01:51:18 +08:00
|
|
|
|
cd backend
|
|
|
|
|
|
pip install -r requirements.txt
|
2026-04-26 12:33:25 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 配置环境变量
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-04-15 23:52:13 +08:00
|
|
|
|
```bash
|
2026-05-09 01:51:18 +08:00
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
# 编辑 .env 填写必要的配置
|
2026-04-13 23:57:16 +08:00
|
|
|
|
```
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 启动服务
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-04-15 23:52:13 +08:00
|
|
|
|
```bash
|
2026-05-09 01:51:18 +08:00
|
|
|
|
cd backend
|
|
|
|
|
|
python -m app.backend
|
|
|
|
|
|
# 服务运行在 http://localhost:8079
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
backend/app/
|
|
|
|
|
|
├── agent/ # Agent 服务层
|
|
|
|
|
|
│ ├── agent_service.py # 主服务
|
|
|
|
|
|
│ ├── service_config.py # 配置构建
|
|
|
|
|
|
│ ├── stream_handler.py # 流式处理
|
|
|
|
|
|
│ ├── stream_context.py # 流式上下文
|
|
|
|
|
|
│ ├── history.py # 历史查询
|
|
|
|
|
|
│ └── prompts.py # 提示词
|
|
|
|
|
|
│
|
|
|
|
|
|
├── main_graph/ # 主图(LangGraph 工作流)
|
|
|
|
|
|
│ ├── main_graph_builder.py # 图构建器
|
|
|
|
|
|
│ ├── state.py # 状态定义
|
|
|
|
|
|
│ └── nodes/ # 节点实现
|
|
|
|
|
|
│ ├── agent.py # 推理节点
|
|
|
|
|
|
│ ├── tools.py # 工具执行
|
|
|
|
|
|
│ ├── finalize.py # 后处理
|
|
|
|
|
|
│ ├── memory_trigger.py # 记忆触发
|
|
|
|
|
|
│ ├── retrieve_memory.py # 记忆检索
|
|
|
|
|
|
│ └── summarize.py # 记忆摘要
|
|
|
|
|
|
│
|
|
|
|
|
|
├── tools/ # 工具定义
|
|
|
|
|
|
│ ├── rag.py # RAG 检索工具
|
|
|
|
|
|
│ ├── web_search.py # 联网搜索工具
|
|
|
|
|
|
│ └── subgraph.py # 子图调用工具
|
|
|
|
|
|
│
|
|
|
|
|
|
├── subgraphs/ # 子图模块
|
|
|
|
|
|
│ ├── contact/ # 通讯录子图
|
|
|
|
|
|
│ ├── dictionary/ # 词典子图
|
|
|
|
|
|
│ └── news_analysis/ # 资讯分析子图
|
|
|
|
|
|
│
|
|
|
|
|
|
├── core/ # 核心工具
|
|
|
|
|
|
│ ├── formatter.py # 格式化工具
|
|
|
|
|
|
│ ├── stream_finalizer.py # 流式格式化
|
|
|
|
|
|
│ ├── web_search.py # 搜索工具类
|
|
|
|
|
|
│ ├── visualization.py # 可视化图表
|
|
|
|
|
|
│ └── human_review.py # 人工审核
|
|
|
|
|
|
│
|
|
|
|
|
|
├── rag/ # RAG 检索系统
|
|
|
|
|
|
│ ├── pipeline.py # 检索流水线
|
|
|
|
|
|
│ ├── retriever.py # 检索器
|
|
|
|
|
|
│ ├── rerank.py # 重排
|
|
|
|
|
|
│ ├── fusion.py # 结果融合
|
|
|
|
|
|
│ └── query_transform.py # 查询改写
|
|
|
|
|
|
│
|
|
|
|
|
|
├── model_services/ # 模型服务层
|
|
|
|
|
|
│ ├── chat_services.py # 对话服务
|
|
|
|
|
|
│ ├── embedding_services.py # 嵌入服务
|
|
|
|
|
|
│ └── rerank_services.py # 重排服务
|
|
|
|
|
|
│
|
|
|
|
|
|
├── memory/ # 记忆系统
|
|
|
|
|
|
│ └── mem0_client.py # Mem0 客户端
|
|
|
|
|
|
│
|
|
|
|
|
|
├── templates/ # 输出模板
|
|
|
|
|
|
│ ├── error_notification.md # 错误提示
|
|
|
|
|
|
│ ├── web_search_result.md # 搜索结果
|
|
|
|
|
|
│ ├── knowledge_summary.md # 知识总结
|
|
|
|
|
|
│ └── conversation_summary.md # 对话摘要
|
|
|
|
|
|
│
|
|
|
|
|
|
├── middleware/ # 中间件
|
|
|
|
|
|
│ └── response_formatter.py # 响应格式化
|
|
|
|
|
|
│
|
|
|
|
|
|
├── db/ # 数据库
|
|
|
|
|
|
│ ├── models.py # 数据模型
|
|
|
|
|
|
│ └── init_db.py # 初始化
|
|
|
|
|
|
│
|
|
|
|
|
|
├── mcp/ # MCP 协议
|
|
|
|
|
|
│ ├── mcp_client.py # MCP 客户端
|
|
|
|
|
|
│ ├── mcp_manager.py # MCP 管理器
|
|
|
|
|
|
│ └── adapters/ # 适配器
|
|
|
|
|
|
│
|
|
|
|
|
|
├── config.py # 配置管理
|
|
|
|
|
|
├── logger.py # 日志工具
|
|
|
|
|
|
└── backend.py # FastAPI 应用
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## API 接口
|
|
|
|
|
|
|
|
|
|
|
|
### 对话接口
|
|
|
|
|
|
|
|
|
|
|
|
#### 同步对话
|
|
|
|
|
|
|
|
|
|
|
|
```http
|
|
|
|
|
|
POST /chat
|
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
"message": "你好",
|
|
|
|
|
|
"thread_id": "可选的会话ID",
|
|
|
|
|
|
"model": "local",
|
|
|
|
|
|
"user_id": "default_user"
|
|
|
|
|
|
}
|
2026-04-21 00:00:56 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
响应:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"reply": "你好!有什么可以帮助你的?",
|
|
|
|
|
|
"thread_id": "生成的会话ID",
|
|
|
|
|
|
"model_used": "local",
|
|
|
|
|
|
"input_tokens": 100,
|
|
|
|
|
|
"output_tokens": 50,
|
|
|
|
|
|
"total_tokens": 150,
|
|
|
|
|
|
"elapsed_time": 1.23
|
2026-04-13 19:49:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
#### 流式对话
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
```http
|
|
|
|
|
|
POST /chat/stream
|
|
|
|
|
|
Content-Type: application/json
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
{
|
|
|
|
|
|
"message": "你好",
|
|
|
|
|
|
"model": "local"
|
|
|
|
|
|
}
|
2026-05-05 13:30:31 +08:00
|
|
|
|
```
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
响应为 SSE 流式数据:
|
2026-04-26 12:15:56 +08:00
|
|
|
|
```
|
2026-05-09 01:51:18 +08:00
|
|
|
|
data: {"type": "llm_token", "node": "agent", "token": "你"}
|
2026-04-26 12:15:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
data: {"type": "llm_token", "node": "agent", "token": "好"}
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
data: {"type": "done", "model_used": "local"}
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
data: [DONE]
|
2026-04-21 00:00:56 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 历史接口
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
```http
|
|
|
|
|
|
GET /threads?user_id=xxx&limit=10
|
|
|
|
|
|
GET /thread/{thread_id}/messages
|
|
|
|
|
|
GET /thread/{thread_id}/summary
|
2026-04-21 00:00:56 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 审核接口
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
```http
|
|
|
|
|
|
GET /reviews/pending
|
|
|
|
|
|
POST /reviews/{review_id}/approve
|
|
|
|
|
|
POST /reviews/{review_id}/reject
|
2026-04-21 00:00:56 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-05 13:30:31 +08:00
|
|
|
|
---
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
## 配置说明
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 环境变量
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
| 变量 | 说明 | 示例 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| `DB_URI` | PostgreSQL 连接串 | `postgresql://user:pass@host:5432/db` |
|
|
|
|
|
|
| `QDRANT_URL` | Qdrant 地址 | `http://localhost:6333` |
|
|
|
|
|
|
| `VLLM_BASE_URL` | 本地 LLM 地址 | `http://localhost:8000/v1` |
|
|
|
|
|
|
| `DEEPSEEK_API_KEY` | DeepSeek API Key | `sk-xxx` |
|
|
|
|
|
|
| `ZHIPUAI_API_KEY` | 智谱 API Key | `xxx` |
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 模板定制
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
输出模板位于 `app/templates/`,可直接编辑 `.md` 文件调整格式:
|
2026-04-21 00:00:56 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
```markdown
|
|
|
|
|
|
## ⚠️ 操作失败
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
**错误类型**: {{ error_type }}
|
|
|
|
|
|
**错误详情**: {{ error_message }}
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
### 💡 建议操作
|
2026-04-13 19:49:18 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
{{ suggestions }}
|
2026-04-13 19:49:18 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-06 04:26:06 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
## 格式化输出
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
项目提供统一的格式化工具:
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
```python
|
|
|
|
|
|
from backend.app.core import get_formatter
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
fmt = get_formatter()
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
# 渲染错误模板
|
|
|
|
|
|
error_out = fmt.render_error(
|
|
|
|
|
|
error_type="超时",
|
|
|
|
|
|
error_message="连接超时",
|
|
|
|
|
|
suggestions=["重试", "切换模型"]
|
|
|
|
|
|
)
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
# 渲染自定义模板
|
|
|
|
|
|
output = fmt.render("my_template", key="value")
|
2026-05-06 04:26:06 +08:00
|
|
|
|
|
2026-05-09 01:51:18 +08:00
|
|
|
|
# 流式结束后追加格式化内容
|
|
|
|
|
|
from backend.app.core import create_finalizer
|
|
|
|
|
|
finalizer = create_finalizer()
|
|
|
|
|
|
finalizer.add_table([{"姓名": "张三"}])
|
|
|
|
|
|
append_content = finalizer.build_append()
|
2026-05-06 04:26:06 +08:00
|
|
|
|
```
|