整体定位:多 Agent 中台平台 ,对外通过 FastAPI 提供统一 HTTP/WS 接口;LangGraph 编排 Agent 工作流;多存储分层:Milvus 向量检索、ES 全文检索、Redis 缓存 / 状态 / 消息队列、MySQL 业务元数据。适合 RAG + 多智能体、工具调用、会话管理、知识库管理场景。
一、整体架构分层
┌─────────────────────────────────────────────┐
│ 接入层:FastAPI(HTTP/WebSocket接口、鉴权、限流) │
└───────────────────┬─────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 编排层:LangGraph 智能体工作流引擎 │
│ - 多Agent节点:检索Agent / 工具Agent / 总结Agent │
│ - 状态管理、分支路由、循环、Human-in-the-loop │
└───────────────────┬─────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 检索&存储层(多引擎各司其职) │
│ ├─ Milvus:向量数据库|文本Embedding向量检索 │
│ ├─ https://zhida.zhihu.com/search?content_id=283421294&content_type=Article&match_order=1&q=Elasticsearch&zhida_source=entity:全文检索|关键词/段落检索、过滤 │
│ ├─ Redis:会话缓存、Agent状态、任务队列、分布式锁 │
│ └─ MySQL:业务元数据|用户、知识库、Agent配置、日志 │
└───────────────────┬─────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 基础能力:https://zhida.zhihu.com/search?content_id=283421294&content_type=Article&match_order=1&q=LLM%E6%9C%8D%E5%8A%A1&zhida_source=entity、工具插件(API/数据库工具)、https://zhida.zhihu.com/search?content_id=283421294&content_type=Article&match_order=1&q=Embedding%E6%9C%8D%E5%8A%A1&zhida_source=entity │
└─────────────────────────────────────────────┘
各组件职责边界(重点,避免混用)
- FastAPI
- 对外 API 网关:对话接口、知识库上传、Agent 配置、任务查询、流式 SSE/WS 输出
- 中间件:JWT 鉴权、请求限流、请求日志、异常捕获、参数校验 (Pydantic)
- 服务拆分:可拆为
api-service主服务 +ingest-service文档摄入服务
- LangGraph
- Agent 状态流转、节点编排、条件分支、循环重试、人工介入节点
- 状态存储:优先把大状态放 Redis,轻量元数据落 MySQL;LangGraph Checkpoint 可接入 Redis 实现分布式持久化
- 支持多 Agent:路由 Agent 判断问题类型 → 调用检索 Agent / 工具 Agent
- Milvus
- 存储文档切片 Embedding,做语义相似检索
- 适合:向量召回、知识库相似度匹配
- Elasticsearch
- 原始文本切片存储,关键词检索、过滤、高亮
- 混合检索策略:ES 关键词召回 + Milvus 向量召回 → 结果重排(Rerank)
- Redis
- 短期会话缓存、对话上下文缓存
- LangGraph checkpoint 存储、分布式锁、任务队列(Celery/RQ)、限流计数器
- 热点检索结果缓存,减少 Milvus/ES 压力
- MySQL
- 业务结构化数据:用户、知识库、文档元信息、Agent 模板、对话记录、权限配置
- 不存大文本 / 向量,只存 ID、标签、状态、时间等元字段
二、核心业务流程(RAG 智能体为例)
- 用户请求进入 FastAPI 接口,鉴权 + 参数校验
- 构造 LangGraph 状态,写入初始 query、user_id、knowledge_base_id
- 路由 Agent 判断:是否需要检索知识库?
- 需要:并行调用 Milvus 向量检索 + ES 全文检索 → 合并召回结果,Rerank 重排
- 不需要:直接调用 LLM 生成回答
- 拿到参考文档,交给生成 Agent,调用 LLM 输出答案
- 流式 SSE 返回结果给前端
- 对话记录元数据写入 MySQL;会话临时状态放 Redis;长对话可持久化 LangGraph Checkpoint
文档摄入链路(异步):文件上传 → FastAPI 接收 → 丢入 Redis 任务队列 → 后台服务解析文档 → 文本切分 → Embedding → 写入 Milvus,原始片段写入 ES,文档元信息写入 MySQL
三、关键技术选型 & 版本建议
- Python:3.10~3.11
- FastAPI + Uvicorn + Pydantic v2
- LangGraph:langgraph、langchain-core,推荐独立部署 LangGraph API(生产不内嵌在 FastAPI 主进程)
- Milvus:v2.4+,可使用 Standalone 或分布式集群;SDK pymilvus
- Elasticsearch:8.x;elasticsearch-py
- Redis:7.x;redis-py
- MySQL:8.0;sqlalchemy + asyncmy(异步)
- 额外组件推荐:
- Embedding:BGE /text-embedding 系列
- Rerank:BGE-Reranker
- 异步任务:Celery + Redis /arq(纯 async 更适配 FastAPI)
- 监控:Prometheus + Grafana,OpenTelemetry 全链路埋点
- 容器:Docker Compose 开发;K8s 生产部署
四、生产级核心优化点(高性能重点)
1. 检索层:混合检索 + 缓存
- 多路召回:ES 关键词召回 + Milvus 向量召回,结果做融合、去重、Rerank
- Redis 缓存高频 Query 的 topK 检索结果,减少向量库压力
- Milvus 分区:按知识库 ID 做 partition,检索时直接指定分区,提速、减少资源占用
2. LangGraph 分布式优化
- ❌ 不要把 LangGraph 直接嵌入 FastAPI 同步接口(长会话会阻塞 worker)
- ✅ 方案:LangGraph 独立 API 服务,FastAPI 作为业务网关调用 LangGraph 服务
- Checkpoint 存储:LangGraph Redis Checkpointer,支持多实例共享 Agent 状态,支持会话断点恢复
- 节点异步执行、超时控制、失败重试、熔断保护
3. 数据库分层,防止热点
- MySQL:只存元数据,大文本片段不入库;对话长文本放 ES,MySQL 只存索引 ID
- Milvus 只存向量 + doc_id,原始文本存 ES;通过 doc_id 关联
- Redis 设置 TTL,自动清理过期会话,避免内存膨胀
4. FastAPI 性能
- 全异步:async def 接口,async 数据库驱动(asyncmy、aioredis)
- 限流:Redis 滑动窗口限流,按 user_id/ip 限制 QPS
- SSE 流式输出,边生成边返回,降低首字延迟
- 接口拆分:问答接口、文档上传接口、管理后台接口隔离
5. 可观测性
- OpenTelemetry 埋点:接口耗时、LLM 调用耗时、Milvus/ES 检索耗时、LangGraph 各节点耗时
- 日志结构化,对话 trace_id 贯穿全链路,方便定位 Agent 节点失败问题
五、数据库表设计极简示例(MySQL)
user用户表:id, name, api_key, statusknowledge_base知识库:id, name, owner_id, statusdocument文档表:id, kb_id, file_name, file_hash, status(未处理 / 处理中 / 完成)conversation对话会话:id, user_id, kb_id, create_timemessage消息元数据:id, conv_id, role, msg_type, es_chunk_ref, create_time
六、项目目录结构参考
agent-platform/
├── api/ # FastAPI网关服务
│ ├── main.py
│ ├── routers/ # 对话、知识库、agent配置路由
│ ├── middlewares/ # 鉴权、限流、trace埋点
│ └── schemas/ # Pydantic模型
├── langgraph_service/ # 独立LangGraph Agent编排服务
│ ├── graph/ # 各个Agent图定义(rag_graph, tool_graph)
│ ├── nodes/ # Agent节点实现
│ └── checkpointer.py # Redis Checkpointer
├── ingest/ # 文档摄入异步任务
│ ├── parser/
│ ├── chunker.py
│ ├── embedding.py
│ └── storage.py # 写入Milvus + ES
├── db/
│ ├── mysql/
│ ├── milvus/
│ ├── es/
│ └── redis/
├── core/ # 公共工具、配置、rerank、llm client
└── docker-compose.yml
七、潜在坑点(避坑清单)
- LangGraph 默认内存 checkpointer,多实例部署会话状态不共享 → 必须替换为 RedisCheckpointer
- Milvus 不要存储超长文本,向量库只存向量 + 主键,原始文本交给 ES
- 大文件解析、切片、Embedding 是 CPU 密集,必须异步任务队列,不能在 API 请求内阻塞
- LLM 调用不稳定:增加重试、超时、熔断,单独 LLM 代理层做负载均衡
- 向量检索不要盲目开大 topK,召回越多 Rerank 越慢,合理控制召回数量
- Redis 内存溢出:会话、缓存必须设置 TTL
八、扩展方向
- 接入更多工具:SQL 查询工具、API 插件、代码执行器
- 多租户隔离:Milvus 分区 + MySQL 行级权限 + ES 索引隔离
- Agent 版本管理:保存不同版本 LangGraph 工作流,灰度发布
- 评估模块:Ragas 接入,自动评估 RAG 召回与回答质量