11 KiB
11 KiB
后端模块 (backend/app/)
这是一个基于 LangGraph 的个人助手系统,提供对话、工具调用、记忆管理、RAG 检索和子图功能。
📂 目录结构
backend/app/
├── agent/ # Agent 服务层
│ ├── service.py # AIAgentService - 主服务类
│ ├── rag_initializer.py # RAG 工具初始化
│ ├── history.py # 对话历史管理
│ └── prompts.py # 提示词模板
├── agent_subgraphs/ # 子图模块 ✅ 已实现
│ ├── common/ # 公共工具
│ │ ├── state_base.py # 状态基类
│ │ ├── intent.py # 意图理解(React 模式)
│ │ ├── formatter.py # 格式化输出工具
│ │ └── human_review.py # 人工审核节点
│ ├── contact/ # 通讯录子图
│ ├── dictionary/ # 词典子图
│ ├── news_analysis/ # 资讯分析子图
│ ├── research/ # 研究分析子图(规划中)
│ └── README.md
├── graph/ # LangGraph 主图构建
│ ├── graph_builder.py # 图构建器
│ ├── graph_tools.py # 工具定义
│ ├── state.py # 状态定义
│ ├── retrieve_memory.py # 记忆检索节点
│ ├── rag_nodes.py # RAG 集成节点
│ └── visualize_graph.py # 图可视化
├── memory/ # 记忆模块
│ └── mem0_client.py # Mem0 客户端
├── model_services/ # 模型服务层 ✅ 已重构
│ ├── __init__.py
│ ├── base.py # 基类和降级机制
│ ├── chat_services.py # 生成式大模型服务
│ ├── embedding_services.py # 嵌入服务
│ └── rerank_services.py # 重排服务
├── nodes/ # LangGraph 节点实现
│ ├── llm_call.py # LLM 调用节点
│ ├── tool_call.py # 工具调用节点
│ ├── router.py # 路由节点
│ ├── summarize.py # 摘要节点
│ ├── finalize.py # 最终节点
│ └── memory_trigger.py # 记忆触发节点
├── rag/ # RAG 检索模块 ✅ 已重构
│ ├── pipeline.py # RAG 流水线
│ ├── tools.py # RAG 工具
│ ├── rerank.py # 重排业务逻辑
│ ├── retriever.py # 检索器
│ ├── query_transform.py # 查询转换
│ └── fusion.py # 结果融合
├── utils/ # 工具函数
├── __init__.py
├── backend.py # FastAPI 后端入口
├── config.py # 配置管理
└── logger.py # 日志模块
✅ 已实现功能
1. Agent 服务 (agent/)
- AIAgentService - 主服务类
- 接收外部 checkpointer,管理图生命周期
- 支持多模型动态切换
- 提供流式和非流式接口
- 多模型支持 - 通过 chat_services
- 智谱 AI (glm-4.7-flash)
- DeepSeek (deepseek-reasoner)
- 本地模型 (vLLM/llama.cpp)
- 对话历史 - 基于 LangGraph 状态持久化
2. LangGraph 主图 (graph/)
- GraphBuilder - 图构建器
- 模块化节点创建,依赖注入
- 支持 Mem0 客户端集成
- 状态管理
- MessagesState - 对话状态(消息、token、时间、摘要轮数)
- GraphContext - 执行上下文(用户 ID)
- 工具定义
- get_current_temperature - 示例温度工具
- read_local_file - 读取本地文件
- read_pdf_summary - 读取 PDF
- read_excel_as_markdown - 读取 Excel
- fetch_webpage_content - 抓取网页
- React 模式 - 循环推理 + 超时重试 + 结构化错误处理
3. 节点实现 (nodes/)
- llm_call - LLM 调用节点
- tool_call - 工具调用节点
- router - 路由节点(should_continue)
- summarize - 记忆摘要节点
- finalize - 最终响应节点
- memory_trigger - 记忆触发节点
4. 记忆管理 (memory/)
- Mem0Client - Mem0 记忆客户端
- 异步初始化和连接测试
- 支持记忆检索和添加
- 可集成到 LangGraph 中
5. 模型服务层 (model_services/)
架构:纯服务层 + 业务逻辑分离
5.1 基类与公共机制 (base.py)
- BaseServiceProvider - 服务提供者基类
- 统一接口:is_available() 和 get_service()
- FallbackServiceChain - 链式降级机制
- 优先尝试主服务,失败自动尝试备用服务
- SingletonServiceManager - 单例管理器
- 全局单例,避免重复创建
5.2 生成式大模型 (chat_services.py)
- LocalVLLMChatProvider - 本地 VLLM 服务(gemma-4-E4B-it)
- ZhipuChatProvider - 智谱 AI 服务(glm-4.7-flash)
- DeepSeekChatProvider - DeepSeek 服务(deepseek-reasoner)
- get_chat_service() - 默认服务(自动降级)
- get_all_chat_services() - 获取所有可用模型
5.3 嵌入服务 (embedding_services.py)
- LocalLlamaCppEmbeddingProvider - 本地 llama.cpp 嵌入
- ZhipuEmbeddingProvider - 智谱 AI 嵌入
- get_embedding_service() - 统一接口,自动降级
5.4 重排服务 (rerank_services.py)
- LocalLlamaCppRerankProvider - 本地 llama.cpp 重排
- ZhipuRerankProvider - 智谱 AI 重排
- get_rerank_service() - 统一接口,自动降级
6. RAG 检索模块 (rag/)
架构:业务逻辑层 + 服务层分离
- RAGPipeline - RAG 流水线
- 查询改写 → 并行检索 → RRF 融合 → 重排 → 返回结果
- DocumentReranker - 重排业务逻辑(rag/rerank.py)
- ParentDocumentRetriever - 父文档检索器
- 查询转换 - MultiQueryGenerator
- 结果融合 - Reciprocal Rank Fusion
7. 子图模块 (agent_subgraphs/) ✅ 已实现
7.1 公共工具 (common/)
- state_base.py - TypedDict 类型安全的状态基类
- intent.py - 意图理解(React 模式)- 是否调用 RAG、是否重新检索
- formatter.py - 格式化输出工具(Jinja2 + Markdown)
- human_review.py - 人工审核节点(LangGraph interrupt)
7.2 通讯录子图 (contact/)
- 联系人管理(CRUD)
- 邮件读取与审核
- 外发邮件
- 智能嗅探
- API 客户端
- 精美格式化展示
7.3 词典子图 (dictionary/)
- 翻译、查词
- 每日一词
- 专业名词提炼
- 生词本管理
- API 客户端
- 精美格式化展示
7.4 资讯分析子图 (news_analysis/)
- 资讯获取
- 内容分析
- API 客户端
- 精美格式化展示
7.5 研究分析子图 (research/)
- 规划中
8. FastAPI 后端 (backend.py)
- POST /chat - 非流式对话
- POST /chat/stream - 流式对话
- 子图 API 端点
- 人工审核交互端点(确定/取消/继续)
9. 配置管理 (config.py)
- 集中管理环境变量
- 智谱 AI 配置
- ZHIPUAI_API_KEY
- ZHIPU_EMBEDDING_MODEL(默认 embedding-3)
- ZHIPU_RERANK_MODEL(默认 rerank-2)
- ZHIPU_API_BASE
- DeepSeek 配置
- DEEPSEEK_API_KEY
- 本地模型配置
- VLLM_BASE_URL(主 LLM)
- LLAMACPP_EMBEDDING_URL(嵌入)
- LLAMACPP_RERANKER_URL(重排)
- LLM_API_KEY / LLAMACPP_API_KEY
- 数据库和 Qdrant 配置
🚧 待完善功能
1. 子图模块
- research/ - 研究分析子图(联网搜索、报告生成、引用溯源、可视化)
2. 其他
- 更完善的错误处理和日志
- 监控和指标收集
- API 文档完善(OpenAPI/Swagger)
- 单元测试和集成测试
🛠️ 技术栈
| 层级 | 组件 | 技术选型 |
|---|---|---|
| Agent 框架 | 工作流编排 | LangGraph + LangChain |
| LLM 服务 | 模型调用 | 智谱 AI / DeepSeek / 本地模型 (llama.cpp/vLLM) |
| Embedding | 向量嵌入 | 本地 llama.cpp / 智谱 AI |
| Rerank | 重排序 | 本地 llama.cpp / 智谱 AI |
| 向量数据库 | 语义检索 | Qdrant |
| 关系数据库 | 结构化存储 | PostgreSQL |
| 后端框架 | API 服务 | FastAPI + Uvicorn |
| 记忆服务 | 长期记忆 | Mem0 |
📝 使用指南
快速开始
-
配置环境变量 复制
.env文件并配置:- 数据库配置(PostgreSQL)
- Qdrant 配置
- LLM 配置(智谱/DeepSeek/本地)
- 嵌入和重排服务配置
-
启动后端
cd backend python -m app.backend -
API 接口
- POST /chat - 非流式对话
- POST /chat/stream - 流式对话
配置说明
必需配置
# 数据库
DB_HOST=your_db_host
DB_PORT=5432
DB_USER=your_db_user
DB_PASSWORD=***
DB_NAME=langgraph_db
# Qdrant
QDRANT_URL=http://your_qdrant_host:6333
QDRANT_API_KEY=your_qdrant_api_key
# 至少配置一个 LLM
ZHIPUAI_API_KEY=***
DEEPSEEK_API_KEY=***
可选配置
# 本地模型服务
VLLM_BASE_URL=http://localhost:8000/v1
LLAMACPP_EMBEDDING_URL=http://localhost:8001/v1
LLAMACPP_RERANKER_URL=http://localhost:8002/v1
LLM_API_KEY=***
LLAMACPP_API_KEY=***
# 智谱其他配置
ZHIPU_EMBEDDING_MODEL=embedding-3
ZHIPU_RERANK_MODEL=rerank-2
使用模型服务
生成式大模型
from app.model_services import get_chat_service, get_all_chat_services
# 自动选择可用服务(优先本地,降级智谱,再降级 DeepSeek)
llm = get_chat_service()
# 获取所有可用模型(用于多模型切换)
all_llms = get_all_chat_services() # Dict[str, BaseChatModel]
嵌入服务
from app.model_services import get_embedding_service
# 自动选择可用服务(优先本地,降级智谱)
embeddings = get_embedding_service()
# 使用
vector = embeddings.embed_query("hello")
重排服务
from app.model_services import get_rerank_service
from app.rag.rerank import create_document_reranker
# 获取原始重排服务(仅计算分数)
rerank_service = get_rerank_service()
scores = rerank_service.compute_scores("query", ["doc1", "doc2"])
# 使用业务逻辑层(完整的文档重排)
reranker = create_document_reranker()
sorted_docs = reranker.compress_documents(docs, "query", top_n=5)
📁 架构说明
模型服务层架构
model_services/
├── base.py # 基类:BaseServiceProvider, FallbackServiceChain, SingletonServiceManager
├── chat_services.py # 生成式大模型(纯服务层)
├── embedding_services.py # 嵌入服务(纯服务层)
└── rerank_services.py # 重排服务(纯服务层)
业务逻辑层
├── rag/rerank.py # 重排业务逻辑(使用 model_services)
└── agent/service.py # Agent 服务(使用 model_services)
子图架构
agent_subgraphs/
├── common/ # 公共工具(所有子图共享)
│ ├── state_base.py # 状态基类
│ ├── intent.py # 意图理解
│ ├── formatter.py # 格式化输出
│ └── human_review.py # 人工审核
├── contact/ # 每个子图独立目录
│ ├── state.py # 状态定义
│ ├── nodes.py # 节点实现
│ ├── graph.py # 图构建
│ ├── api_client.py # API 客户端
│ └── __init__.py
└── dictionary/
└── (同 contact)