Files
ailine/README.md

285 lines
6.9 KiB
Markdown
Raw Normal View History

# 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 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-05-09 01:51:18 +08:00
### 对话能力
2026-05-09 01:51:18 +08:00
| 功能 | 说明 |
|------|------|
| 智能对话 | 多轮对话,自动记忆上下文 |
| 多模型切换 | 前端可选择不同 LLM |
| 流式响应 | SSE 流式输出,打字机效果 |
| 持久化记忆 | PostgreSQL 存储对话历史 |
2026-05-09 01:51:18 +08:00
### 工具系统
2026-05-09 01:51:18 +08:00
| 工具 | 说明 |
|------|------|
| RAG 检索 | 知识库检索,带置信度评估 |
| 联网搜索 | DuckDuckGo 免费搜索 |
| 通讯录 | 联系人管理、邮件处理 |
| 词典 | 翻译、术语提取、生词本 |
| 资讯分析 | 新闻检索、关键词提取 |
2026-05-09 01:51:18 +08:00
### 技术特性
2026-05-09 01:51:18 +08:00
- **模块化架构**:清晰的代码分层,易于扩展
- **模型降级**:多模型自动降级,保证高可用
- **子图系统**:独立的工作流模块,按需调用
- **格式化输出**:统一的 Markdown 格式化,支持模板
---
2026-05-09 01:51:18 +08:00
## 快速开始
2026-05-09 01:51:18 +08:00
### 环境要求
2026-05-09 01:51:18 +08:00
- Python 3.10+
- PostgreSQL远程或本地
- Qdrant 向量数据库(远程或本地)
2026-05-09 01:51:18 +08:00
### 安装依赖
```bash
2026-05-09 01:51:18 +08:00
cd backend
pip install -r requirements.txt
```
2026-05-09 01:51:18 +08:00
### 配置环境变量
2026-04-13 19:49:18 +08:00
```bash
2026-05-09 01:51:18 +08:00
cp .env.example .env
# 编辑 .env 填写必要的配置
```
2026-04-13 19:49:18 +08:00
2026-05-09 01:51:18 +08:00
### 启动服务
2026-04-13 19:49:18 +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-05-09 01:51:18 +08:00
```http
POST /chat/stream
Content-Type: application/json
2026-05-09 01:51:18 +08:00
{
"message": "你好",
"model": "local"
}
2026-05-05 13:30:31 +08:00
```
2026-05-09 01:51:18 +08:00
响应为 SSE 流式数据:
```
2026-05-09 01:51:18 +08:00
data: {"type": "llm_token", "node": "agent", "token": "你"}
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
```