Skip to main content

设计一个 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 / 自研 DAGRegistry + 负载均衡 + 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 统一做流程编排与实例调度,用消息总线解耦协作——模型能力可插拔,但架构从第一天就要可观测、可扩展。