设计一个 AI Agent 协作平台
如果让我从零设计一个 AI Agent 协作平台,核心思路是:不能把平台做成一堆 Agent 的简单堆叠,而要把它当作一个"智能微服务系统"来设计。多 Agent 系统要真正走向工程化和规模化,关键不在于堆叠更多模型能力,而在于架构层面的可扩展性设计。
以下是我的分层架构思路(从入口到底层):
一、总体架构分层
┌─────────────────────────────────────────────────────────────┐
│ 接入层(API Gateway) │
│ 统一入口 · 认证鉴权 · 流量控制 · 可观测性 │
├─────────────────────────────────────────────────────────────┤
│ 编排调度层(Orchestrator) │
│ 流程编排:任务分解 · DAG · 角色分配 · 冲突解决 │
│ 资源调度:动态路由 · 负载均衡 · 节点注册/心跳 · 弹性伸缩 │
├─────────────────────────────────────────────────────────────┤
│ 通信层(Messaging) │
│ 消息总线(Pub/Sub) · 事件驱动 · 会话状态管理 │
├─────────────────────────────────────────────────────────────┤
│ 执行层(Agent Farm) │
│ Agent A Agent B Agent C ...(独立微服务) │
├─────────────────────────────────────────────────────────────┤
│ 记忆与数据层(Memory & Data) │
│ 向量数据库 · 关系数据库 · 知识图谱 · 会话/轨迹存储 │
└─────────────────────────────────────────────────────────────┘
参考了微服务化拆分与消息驱动的云原生架构思路。
二、各层核心设计
1. 接入层(API Gateway)
职责:统一入口、认证鉴权、限流熔断、请求路由,以及入口侧日志/追踪/指标采集。
对开发者暴露 RESTful API 和 WebSocket(用于流式交互)。
2. 编排调度层(Orchestrator)
日常口语里「编排」和「调度」经常混用,工程上可以这样区分:
| 流程编排 | 资源调度 | |
|---|---|---|
| 回答的问题 | 做什么、按什么顺序、交给哪类角色 | 交给哪个实例、负载是否均衡 |
| 类比 | 导演排戏(剧本、场次、角色) | 场务派工(哪个演员上台、是否加人) |
| 典型实现 | Temporal / LangGraph / 自研 DAG | Registry + 负载均衡 + K8s HPA |
两者通常合在一个 Orchestrator 组件里——决定「下一步该谁干」既涉及流程(见 Orchestrator 是什么),也涉及实例选择。Orchestrator 自身不执行具体任务,只负责规划与派发,保持无状态以便水平扩展。
流程编排:
- 任务分解:将复杂目标拆解为子任务链。例如"写一篇技术博客并发布" → 调研 → 大纲 → 撰写 → 配图 → 审核 → 发布。
- 工作流编排:用 DAG 定义依赖关系,支持串行、并行、条件分支。
- 角色分工:预置角色模板(PM Agent、技术 Agent、审核 Agent 等),明确职责边界。
- 路由决策:主流程用静态规则(任务类型 A → Agent X),边缘情况交给 LLM 动态判断——两种混用。
协作范式(角色驱动、对话驱动、层级式、市场竞标)的选型见第三节。
资源调度:
- 节点注册:Agent 启动时上报能力(Capability)、地址、健康状态。
- 心跳与故障摘除:故障节点自动下线,集群自愈。
- 负载均衡:按负载、能力匹配度、优先级路由到具体实例。
- 弹性伸缩:结合 HPA,按队列深度或 CPU 自动扩缩 Agent 实例。
关键原则:Agent 本身无状态——不负责调度、不保存全局状态,只做三件事:接收任务 → 调用模型/工具 → 返回结果。
3. 通信层(Messaging)
Agent 之间不直接调用,而是通过消息总线进行异步通信,实现彻底解耦。
核心设计:
- 发布/订阅(Pub/Sub)模式:Agent 发布事件(如"任务完成""需要审核"),其他 Agent 订阅感兴趣的事件。
- 通信协议:
- MCP(Model Context Protocol):标准化 Agent 调用外部工具的接口。
- A2A(Agent2Agent Protocol):基于 JSON-RPC 实现 Agent 间的异步任务委托。
- 会话状态管理:每个 Agent 会话需要独立的通信通道,服务重启后能从断点精确恢复。
4. 执行层(Agent Farm)
每个 Agent 是一个独立的微服务,可以独立部署、独立扩缩容、独立升级。
Agent 内部架构(参考经典 Agent 四组件):
┌──────────────────────────────────────┐
│ Agent 微服务 │
│ ┌──────────────────────────────────┐ │
│ │ Prompt 指令层(定义工具集) │ │
│ ├──────────────────────────────────┤ │
│ │ Switch 路由(解析LLM输出) │ │
│ ├──────────────────────────────────┤ │
│ │ 上下文累积器(历史状态) │ │
│ ├──────────────────────────────────┤ │
│ │ For 循环引擎(迭代执行) │ │
│ └──────────────────────────────────┘ │
│ ↓ │
│ 调用 LLM(可插拔,不绑定特定模型) │
│ 调用 Tools(Function Calling) │
└──────────────────────────────────────┘
Agent 类型:
- 专用 Agent:职责单一(如代码生成、测试、文档)
- 通用 Agent:具备多种能力,按需调用
- Supervisor Agent:全局协调者,负责任务分配与异常处理
5. 记忆与数据层
多层级记忆设计:
- 短期记忆:当前会话上下文
- 长期记忆:跨会话的用户偏好、历史决策
- 共享知识库:所有 Agent 可访问的企业知识库(RAG 系统)
数据类型:结构化元数据(用户、任务、配置)、向量 embedding(语义检索)、Agent 决策轨迹(审计与回滚)、多模态文件(图片、音频、文档)。
三、关键机制
1. Agent 间协作模式
参考主流框架的实践,平台应同时支持多种模式,让开发者按场景选择:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| 角色驱动(CrewAI 风格) | 确定性 pipeline,角色分工明确 | 流程固定的业务自动化 |
| 对话驱动(AutoGen 风格) | 灵活的多轮对话协作 | 需要迭代优化的复杂任务 |
| 层级协作(Hierarchical) | 上层规划、下层执行 | 大规模、多层级任务 |
| 市场竞标(Contract-net) | Agent 竞标接任务 | 资源竞争场景 |
2. 冲突解决
- 规则引擎:预设优先级策略(如紧急任务抢占资源)
- 博弈论模型:在资源竞争场景下,通过 Shapley 值分配贡献权重
3. 可观测性
贯穿"用户请求 → Orchestrator → Agent 执行 → LLM 调用"全链路:
- 分布式追踪:Jaeger 等工具串联跨层调用
- 指标采集:每个 Agent 的 QPS、延迟、错误率、Token 消耗
- 结构化日志:统一格式,便于检索分析
四、技术栈选型(参考)
| 层级 | 可选技术 |
|---|---|
| 接入层 | Kong / APISIX + OIDC |
| 编排调度层 | Temporal / LangGraph(流程编排)+ Registry / Etcd(实例调度) |
| 通信层 | Kafka / RocketMQ / Redis Streams(RocketMQ 支持 Lite-Topic,适合会话连续性与断点续传) |
| Agent 运行时 | FastAPI + 任意 LLM SDK |
| 容器编排 | Kubernetes + Istio |
| 向量数据库 | Milvus / Qdrant |
| 关系数据库 | PostgreSQL |
| 短期记忆 | Redis |
| 对象存储 | MinIO / S3 |
| 可观测性 | Prometheus + Grafana + Jaeger + ELK |
Agent 本身推荐用 FastAPI 实现轻量级服务,容器化后部署在 K8s 上,充分利用云原生的弹性能力。
核心 takeaway:把 Agent 当作无状态微服务来拆分,用 Orchestrator 统一做流程编排与实例调度,用消息总线解耦协作——模型能力可插拔,但架构从第一天就要可观测、可扩展。