18-大模型智能体开发工程师:多智能体系统(Multi-Agent System)
系列文章导航:AI系列文章导航目录-持续更新中
第18课:多智能体系统(Multi-Agent System)
📝 本文摘要:本文从零讲解多智能体系统——单个Agent能力有限,多个Agent协作实现"1+1>2"。内容包括:①为什么需要多Agent(单Agent的五大瓶颈深度分析、多Agent的核心价值);②多Agent的核心概念(角色、通信、协调、编排的定义与关系);③多Agent在Agent技术栈中的定位(与MCP/Skill/记忆系统的关系);④五大架构模式详解(管理者/流水线/对话/群体/层级,每种的原理、适用场景、优缺点、真实案例);⑤通信机制(共享状态/消息传递/黑板系统/事件驱动,每种的实现与对比);⑥协调机制(中央调度/共识协议/市场机制/角色协商);⑦A2A协议(Google 2025发布,现为Linux Foundation项目,Agent间通信的标准化);⑧主流框架深度对比(CrewAI/AutoGen/LangGraph/OpenAI Agents SDK/Google ADK,架构差异、代码示例、选型指南);⑨完整实战:从零构建一个多Agent协作系统;⑩工程最佳实践与常见陷阱。适合AI小白从零理解多智能体系统的本质、架构和实践。
单个Agent就像一个全能但平庸的"独行侠"——什么都能做一点,但什么都做不精。多Agent系统就是组建一支专业团队,每个人负责自己最擅长的部分,通过协作完成单个人无法胜任的复杂任务。
一、为什么需要多Agent
1.1 一句话理解
多Agent系统 = 多个专业Agent协作完成复杂任务
类比: 多Agent之于单Agent ≈ 公司团队之于个人 ≈ 交响乐团之于独奏
1.2 单Agent的五大瓶颈(深度分析)
一句话理解:就像一个人不可能同时是程序员、设计师、测试员、产品经理,单个Agent也很难同时做好所有事情。当任务复杂度超过一定阈值,单Agent就会"力不从心"。
瓶颈1: 上下文窗口的物理限制
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题本质:
LLM的上下文窗口是有限的(128K tokens ≈ 10万字)
一个复杂Agent需要装入:
- System Prompt (2-5K tokens)
- 工具定义 (每个工具约500 tokens)
- 对话历史 (随对话增长)
- 记忆检索结果 (2-3K tokens)
- 工具返回结果 (可能很大)
当Agent需要30+个工具时:
30个工具 × 500 tokens/工具 = 15K tokens 仅工具定义就占了
→ 留给对话和推理的空间大幅缩减
→ 工具选择准确率随工具数量增加而下降
实测数据 (来自多个研究):
工具数量 选择准确率
5个 95%+
10个 90%
20个 80%
30个 65%
50个 <50%
多Agent如何解决:
把30个工具分给5个Agent,每个Agent只有6个工具
→ 每个Agent的工具选择准确率回到95%+
→ 总体系统能力 = 5个95%准确率的Agent协作
瓶颈2: 角色混淆(Role Confusion)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题本质:
让一个Agent同时扮演多个角色,它会"人格分裂"。
典型场景:
让同一个Agent既写代码又审查代码
→ 它会"自己放水"——写的时候不严谨,审查的时候不严格
→ 因为它"知道"代码是自己写的,潜意识里会宽容
类比:
让同一个人写作业又批作业 → 肯定不会严格
让同一个人当原告又当法官 → 不可能公正
实际表现:
单Agent写代码+审查: 发现bug率 ~30%
两个Agent分别写和审查: 发现bug率 ~70%
(数据来自AutoGen论文的实验)
多Agent如何解决:
Agent A: 专注写代码(角色=开发者)
Agent B: 专注审查代码(角色=审查者)
→ 角色清晰,互相制约,质量提升
瓶颈3: 串行瓶颈(Sequential Bottleneck)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题本质:
单Agent只能一步步做,不能并行处理多个子任务。
典型场景:
任务: "分析这个系统的前端、后端、数据库三个层面的性能问题"
单Agent: 先分析前端(30s) → 再分析后端(30s) → 再分析数据库(30s) = 90s
多Agent: 三个Agent同时分析三个层面 = 30s
更复杂的场景:
任务: "调研5个竞品,每个竞品分析功能、定价、用户评价"
单Agent: 5个竞品 × 3个维度 = 15步串行 → 可能需要5分钟
多Agent: 5个Agent同时调研5个竞品 → 1分钟
多Agent如何解决:
把可并行的子任务分配给不同Agent同时执行
→ 总耗时 = 最慢的那个子任务的耗时(而非所有子任务之和)
瓶颈4: 专业性不足(Lack of Specialization)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题本质:
一个Agent的System Prompt只能定义一种"人设"。
如果你想让它既是"安全专家"又是"性能专家"又是"架构专家",
它每个方面都只能做到60分,而不是每个方面90分。
原因:
System Prompt的指令越多越杂,LLM的遵循度越低。
"你是一个安全专家" → LLM会深入思考安全问题
"你是一个安全+性能+架构+测试+运维专家" → LLM每个方面都浅尝辄止
类比:
一个人开公司,从研发到销售到财务都自己做 → 效率低、质量差
vs 雇专业的研发、销售、财务 → 每个岗位都是专业水平
多Agent如何解决:
每个Agent只有一个专精角色:
- 安全Agent: System Prompt专注安全,只配安全相关工具
- 性能Agent: System Prompt专注性能,只配性能分析工具
- 架构Agent: System Prompt专注架构,只配架构评审工具
→ 每个Agent在自己的领域都是"专家级"
瓶颈5: 缺乏自我纠错能力
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题本质:
单Agent很难发现自己的错误——"当局者迷"。
它生成了一段有bug的代码,自己很难意识到有问题。
原因:
LLM的输出是基于概率的,它不会"怀疑"自己的输出。
除非你明确要求它"检查一下",否则它倾向于认为自己是对的。
多Agent如何解决:
引入"对抗性"角色:
- Agent A生成方案
- Agent B专门找Agent A方案的漏洞
- Agent A根据反馈修改
→ 类似"红蓝对抗"或"同行评审"
实际效果:
单Agent生成代码: 一次通过率 ~60%
双Agent(写+审): 一次通过率 ~85%
三Agent(写+审+测试): 一次通过率 ~92%
1.3 多Agent的核心价值
┌─────────────────────────────────────────────────────────────────────────┐
│ 多Agent的四大核心价值 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 专业分工 (Specialization) │
│ 每个Agent专精一个领域 → 整体质量提升 │
│ 类比: 医院有内科、外科、眼科...每个科室都是专家 │
│ │
│ 2. 并行加速 (Parallelism) │
│ 多个Agent同时工作 → 总耗时大幅缩短 │
│ 类比: 10个人同时搬砖 vs 1个人搬10次 │
│ │
│ 3. 相互纠错 (Cross-checking) │
│ 不同Agent互相审查 → 错误率降低 │
│ 类比: 论文的同行评审、代码的Code Review │
│ │
│ 4. 涌现能力 (Emergence) │
│ 多个Agent协作产生单个Agent不具备的能力 │
│ 类比: 蚂蚁个体很笨,但蚁群能建造复杂巢穴 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
1.4 什么时候该用多Agent(决策框架)
⚠️ 重要原则: 能用单Agent解决的,不要用多Agent!
多Agent的复杂度远大于单Agent。
判断是否需要多Agent的决策树:
任务能被一个Agent在5步内完成吗?
├── 是 → 用单Agent(不需要多Agent)
└── 否 ↓
任务能明确拆分为独立的子任务吗?
├── 否 → 用单Agent + 更好的规划(Plan-and-Execute)
└── 是 ↓
子任务之间需要不同的专业能力吗?
├── 否 → 用单Agent + 循环(同一个Agent做多次)
└── 是 ↓
子任务可以并行执行吗?
├── 是 → 多Agent并行模式
└── 否 ↓
子任务之间需要相互审查/纠错吗?
├── 是 → 多Agent对话模式
└── 否 → 多Agent流水线模式
✅ 适合多Agent的场景:
- 软件开发(需求分析 + 编码 + 测试 + 部署)
- 内容创作(研究 + 写作 + 审校 + 排版)
- 数据分析(数据获取 + 清洗 + 分析 + 可视化)
- 故障排查(日志分析 + 指标分析 + 代码审查 + 根因定位)
- 竞品调研(多个竞品同时调研 + 汇总对比)
❌ 不适合多Agent的场景:
- 简单问答("Python怎么读文件")
- 单一工具调用("帮我查一下天气")
- 线性简单任务("帮我写一封邮件")
- 通信开销 > 计算开销的场景
二、多Agent的核心概念
2.1 四个核心概念
在深入架构模式之前,必须先理解多Agent系统的四个核心概念:
┌─────────────────────────────────────────────────────────────────────────┐
│ 多Agent系统的四个核心概念 │
└─────────────────────────────────────────────────────────────────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 角色 │ │ 通信 │ │ 协调 │ │ 编排 │
│ Role │ │Communication │ │ Coordination │ │Orchestration │
├──────────────┤ ├──────────────┤ ├──────────────┤ ├──────────────┤
│ 每个Agent │ │ Agent之间 │ │ 谁先谁后 │ │ 整体流程 │
│ 是什么角色 │ │ 如何交换信息 │ │ 如何达成一致 │ │ 如何组织 │
├──────────────┤ ├──────────────┤ ├──────────────┤ ├──────────────┤
│ 类比: │ │ 类比: │ │ 类比: │ │ 类比: │
│ 公司的岗位 │ │ 开会/邮件 │ │ 投票/审批 │ │ 项目管理 │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
关系:
角色 → 定义每个Agent"是谁"
通信 → 定义Agent之间"怎么说话"
协调 → 定义Agent之间"怎么达成一致"
编排 → 定义整个系统"怎么运转"
2.2 角色(Role)
定义: 每个Agent的身份、职责和能力边界。
为什么角色很重要:
没有明确角色 → Agent之间职责重叠 → 互相推诿或重复劳动
有明确角色 → 每个Agent知道自己该做什么、不该做什么
角色定义的三要素:
1. 身份描述(你是谁): "你是一个资深Python开发者"
2. 职责范围(你做什么): "负责编写和优化Python代码"
3. 能力边界(你不做什么): "不负责测试和部署"
好的角色设计原则:
✅ 互斥: 每个Agent的职责不重叠
✅ 完备: 所有Agent的职责加起来覆盖整个任务
✅ 专精: 每个Agent只做一件事,做到极致
❌ 反例: "你是一个全栈开发者,负责前端、后端、测试、部署"
→ 这和单Agent没区别,失去了多Agent的意义
2.3 通信(Communication)
定义: Agent之间交换信息的方式和格式。
为什么通信方式很重要:
通信方式决定了:
- Agent之间能传递什么信息
- 信息传递的效率
- 系统的耦合度
四种通信方式(详见第五章):
1. 共享状态: 所有Agent读写同一个状态对象
2. 消息传递: Agent之间发送结构化消息
3. 黑板系统: Agent往"黑板"上写信息,其他Agent读
4. 事件驱动: Agent发布/订阅事件
2.4 协调(Coordination)
定义: 多个Agent之间如何达成一致、解决冲突、确定执行顺序。
为什么需要协调:
场景: Agent A说"应该用方案1",Agent B说"应该用方案2"
→ 谁说了算?怎么决定?
协调机制(详见第六章):
1. 中央调度: 一个"管理者"Agent做所有决策
2. 投票机制: 多个Agent投票,少数服从多数
3. 辩论机制: Agent之间辩论,最终由裁判Agent决定
4. 市场机制: Agent"竞标"任务,最合适的Agent获得执行权
2.5 编排(Orchestration)
定义: 整个多Agent系统的执行流程如何组织和管理。
编排 vs 协调的区别:
协调: 解决"Agent之间的冲突"(微观)
编排: 管理"整个系统的流程"(宏观)
编排的核心问题:
1. 任务如何拆分?(一个大任务拆成哪些子任务)
2. 子任务如何分配?(哪个Agent做哪个子任务)
3. 执行顺序如何确定?(哪些先做、哪些后做、哪些并行)
4. 结果如何汇总?(子任务的结果如何合并为最终结果)
5. 异常如何处理?(某个Agent失败了怎么办)
2.6 多Agent在Agent技术栈中的定位
┌──────────────────────────────────────────────────────────────────┐
│ 第1层: LLM模型本体(GPT/Claude等) │
│ │
│ 每个Agent内部都有一个LLM实例 │
│ Agent A用GPT-4o,Agent B可以用Claude,Agent C可以用本地模型 │
│ → 多Agent系统可以混合使用不同模型! │
│ │
└──────────────────────────────────┬───────────────────────────────┘
│
┌──────────────────────────────────▼───────────────────────────────┐
│ 第2层: Agent编排层 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 多Agent编排器(Multi-Agent Orchestrator) │ │
│ │ │ │
│ │ 职责: │ │
│ │ 1. 管理所有Agent的生命周期 │ │
│ │ 2. 路由任务到合适的Agent │ │
│ │ 3. 管理Agent之间的通信 │ │
│ │ 4. 协调冲突、汇总结果 │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Agent A │ │ Agent B │ │ Agent C │ │ Agent D │ │ │
│ │ │ 研究员 │ │ 开发者 │ │ 测试员 │ │ 审查员 │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ Prompt │ │ Prompt │ │ Prompt │ │ Prompt │ │ │
│ │ │ Tools │ │ Tools │ │ Tools │ │ Tools │ │ │
│ │ │ Memory │ │ Memory │ │ Memory │ │ Memory │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 与其他系统的关系: │
│ - MCP: 每个Agent可以连接不同的MCP Server获取工具 │
│ - Skill: 每个Agent可以加载不同的Skill获取能力 │
│ - 记忆: Agent之间可以共享记忆,也可以各自独立记忆 │
│ │
└──────────────────────────────────────────────────────────────────┘
三、五大架构模式详解
3.1 架构模式全景
┌─────────────────────────────────────────────────────────────────────────┐
│ 五大多Agent架构模式 │
├──────────────┬──────────────┬──────────────┬──────────────┬─────────────┤
│ 管理者模式 │ 流水线模式 │ 对话模式 │ 群体模式 │ 层级模式 │
│ Orchestrator │ Pipeline │ Conversation │ Swarm │ Hierarchical│
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┤
│ 一个管理者 │ 任务按顺序 │ Agent之间 │ Agent自治 │ 多层管理 │
│ 分配任务 │ 流转 │ 对话协商 │ 自由转交 │ 逐级委派 │
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┤
│ 类比: │ 类比: │ 类比: │ 类比: │ 类比: │
│ 项目经理 │ 工厂流水线 │ 圆桌会议 │ 自由市场 │ 公司组织架构 │
│ 分配工作 │ 一道道工序 │ 讨论决策 │ 自由交易 │ 总监→经理→员工│
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┤
│ 适合: │ 适合: │ 适合: │ 适合: │ 适合: │
│ 任务可拆分 │ 流程固定 │ 需要纠错 │ 任务不确定 │ 大规模复杂 │
│ 子任务独立 │ 上下游明确 │ 需要讨论 │ 需要灵活 │ 任务 │
└──────────────┴──────────────┴──────────────┴──────────────┴─────────────┘
3.2 管理者模式(Orchestrator Pattern)
是什么
定义: 一个"管理者"Agent负责理解任务、拆分子任务、分配给子Agent执行、
收集结果并汇总为最终输出。
结构:
┌──────────────────┐
│ Orchestrator │ ← 管理者Agent
│ (管理者) │ 理解任务、拆分、分配、汇总
└────────┬─────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Agent A │ │ Agent B │ │ Agent C │ ← 工作Agent
│ (研究) │ │ (编码) │ │ (测试) │ 各自执行子任务
└──────────┘ └──────────┘ └──────────┘
执行流程:
1. 用户请求 → Orchestrator
2. Orchestrator分析任务,拆分为子任务
3. Orchestrator把子任务分配给合适的Agent
4. 子Agent执行,结果返回Orchestrator
5. Orchestrator汇总所有结果,生成最终回答
6. 最终回答 → 用户
类比:
项目经理收到需求 → 拆分为前端/后端/测试任务 →
分配给对应开发者 → 收集各自的产出 → 整合交付
为什么需要这种模式
核心优势:
1. 集中控制: 管理者有全局视角,能做出最优分配
2. 流程清晰: 用户只和管理者交互,不需要知道内部有多少Agent
3. 容错简单: 某个Agent失败了,管理者可以重新分配或换Agent
4. 易于扩展: 新增Agent只需注册到管理者,不影响其他Agent
核心劣势:
1. 单点瓶颈: 管理者Agent如果出错,整个系统瘫痪
2. 管理者负担重: 需要理解所有子Agent的能力,做出正确分配
3. 通信开销: 所有信息都要经过管理者中转
4. 不适合需要Agent间直接协作的场景
适用场景
✅ 最适合:
- 任务可以明确拆分为独立子任务
- 子任务之间没有强依赖
- 需要并行执行多个子任务
- 用户不需要参与中间过程
实际案例:
1. 技术调研系统: 管理者拆分为"搜索资料"+"分析趋势"+"写报告"
2. 客服系统: 管理者根据问题类型路由到"退款Agent"/"技术支持Agent"/"投诉Agent"
3. 代码生成系统: 管理者拆分为"设计架构"+"写代码"+"写测试"+"写文档"
真实项目案例
案例1: OpenAI的Swarm框架中的Triage Agent模式
- 一个Triage Agent(分诊Agent)作为管理者
- 根据用户问题类型,转交给专业Agent处理
- 用于客服场景: 分诊 → 退款/技术/投诉
案例2: Microsoft AutoGen的GroupChat Manager
- GroupChatManager作为管理者
- 管理多个Agent的发言顺序
- 决定每轮谁来发言
案例3: LangGraph的Supervisor模式
- 一个Supervisor节点作为管理者
- 根据当前状态决定下一步由哪个Agent执行
- 官方示例: multi-agent-supervisor
实现代码
"""
管理者模式实现(基于OpenAI API)
依赖: pip install openai
"""
from openai import OpenAI
import json
client = OpenAI()
# ═══════════════════════════════════════════
# 定义工作Agent
# ═══════════════════════════════════════════
class WorkerAgent:
"""工作Agent: 执行具体子任务"""
def __init__(self, name: str, role: str, system_prompt: str, tools: list = None):
self.name = name
self.role = role
self.system_prompt = system_prompt
self.tools = tools or []
def execute(self, task: str) -> str:
"""执行子任务"""
messages = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": task}
]
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
temperature=0.3
)
return response.choices[0].message.content
# ═══════════════════════════════════════════
# 管理者Agent
# ═══════════════════════════════════════════
class OrchestratorAgent:
"""管理者Agent: 拆分任务、分配、汇总"""
def __init__(self, workers: list[WorkerAgent]):
self.workers = {w.name: w for w in workers}
def run(self, user_request: str) -> str:
"""完整的管理者流程"""
# Step 1: 拆分任务
print("📋 Step 1: 拆分任务...")
subtasks = self._decompose_task(user_request)
print(f" 拆分为 {len(subtasks)} 个子任务")
for st in subtasks:
print(f" - [{st['agent']}] {st['task']}")
# Step 2: 分配并执行
print("\n🔨 Step 2: 分配并执行...")
results = {}
for subtask in subtasks:
agent_name = subtask["agent"]
task_desc = subtask["task"]
if agent_name in self.workers:
print(f" → {agent_name} 正在执行...")
result = self.workers[agent_name].execute(task_desc)
results[agent_name] = result
print(f" ✅ {agent_name} 完成")
else:
results[agent_name] = f"[错误] 未找到Agent: {agent_name}"
# Step 3: 汇总结果
print("\n📊 Step 3: 汇总结果...")
final_output = self._synthesize(user_request, results)
return final_output
def _decompose_task(self, user_request: str) -> list[dict]:
"""用LLM拆分任务"""
worker_descriptions = "\n".join([
f"- {name}: {w.role}" for name, w in self.workers.items()
])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": f"""你是一个任务管理者。请将用户的请求拆分为子任务,并分配给合适的Agent。
可用的Agent:
{worker_descriptions}
用户请求: {user_request}
输出JSON格式:
{{"subtasks": [{{"agent": "agent名称", "task": "具体的子任务描述"}}]}}
规则:
1. 每个子任务只分配给一个Agent
2. 子任务描述要具体、可执行
3. 如果某个任务不需要某个Agent,就不要分配"""
}],
response_format={"type": "json_object"},
temperature=0.0
)
result = json.loads(response.choices[0].message.content)
return result.get("subtasks", [])
def _synthesize(self, original_request: str, results: dict) -> str:
"""汇总所有Agent的结果"""
results_text = "\n\n".join([
f"=== {name} 的结果 ===\n{result}"
for name, result in results.items()
])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": f"""请将以下各Agent的执行结果汇总为一份完整的回答。
原始请求: {original_request}
各Agent结果:
{results_text}
要求: 整合所有信息,生成结构清晰、内容完整的最终回答。"""
}],
temperature=0.3
)
return response.choices[0].message.content
# ═══════════════════════════════════════════
# 使用示例
# ═══════════════════════════════════════════
# 创建工作Agent
researcher = WorkerAgent(
name="researcher",
role="技术研究员,负责搜索和整理技术信息",
system_prompt="你是一个技术研究员。请根据任务要求,提供详细的技术调研信息。"
)
developer = WorkerAgent(
name="developer",
role="高级开发者,负责编写代码和技术方案",
system_prompt="你是一个高级开发者。请根据任务要求,提供代码实现或技术方案。"
)
reviewer = WorkerAgent(
name="reviewer",
role="代码审查专家,负责审查代码质量和安全性",
system_prompt="你是一个代码审查专家。请审查代码的质量、安全性和可维护性。"
)
# 创建管理者
orchestrator = OrchestratorAgent(workers=[researcher, developer, reviewer])
# 执行
result = orchestrator.run("帮我用Go实现一个带限流功能的HTTP中间件")
print("\n" + "="*60)
print("最终结果:")
print(result)
3.3 流水线模式(Pipeline Pattern)
是什么
定义: 任务按固定的顺序在多个Agent之间流转,
每个Agent处理完后把结果传给下一个Agent。
类似工厂的流水线——每道工序由专人负责。
结构:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Agent A │───→│ Agent B │───→│ Agent C │───→│ Agent D │
│ (需求分析)│ │ (架构设计)│ │ (代码实现)│ │ (测试验证)│
└──────────┘ └──────────┘ └──────────┘ └──────────┘
输入 ↓ ↓ ↓
用户需求 需求文档 设计文档 代码实现
↓
测试报告
执行流程:
1. 用户输入 → Agent A(需求分析)
2. Agent A的输出 → Agent B的输入(架构设计)
3. Agent B的输出 → Agent C的输入(代码实现)
4. Agent C的输出 → Agent D的输入(测试验证)
5. Agent D的输出 → 最终结果
类比:
汽车工厂: 冲压 → 焊接 → 涂装 → 总装 → 检测
每道工序专人负责,上一道的产出是下一道的输入
为什么需要这种模式
核心优势:
1. 流程标准化: 每个环节的输入输出格式固定,质量可控
2. 专业深度: 每个Agent只需要精通一个环节
3. 可追溯: 出了问题可以定位到具体哪个环节
4. 易于优化: 可以单独优化某个环节而不影响其他
核心劣势:
1. 串行瓶颈: 总耗时 = 所有环节耗时之和
2. 错误传播: 上游Agent出错,错误会传播到所有下游
3. 灵活性差: 流程固定,不适合需要反复迭代的场景
4. 反馈困难: 下游发现上游的问题,很难回头修改
适合场景:
✅ 流程固定、步骤明确的任务
✅ 每个步骤的输入输出格式清晰
✅ 不需要频繁回退和迭代
❌ 不适合需要反复修改的创意性任务
❌ 不适合步骤之间有复杂依赖的任务
真实项目案例
案例1: MetaGPT的软件开发流水线
产品经理Agent → 架构师Agent → 开发者Agent → 测试Agent
- 产品经理: 生成PRD文档
- 架构师: 根据PRD设计系统架构
- 开发者: 根据架构写代码
- 测试: 根据代码写测试用例并执行
案例2: 内容创作流水线
研究Agent → 大纲Agent → 写作Agent → 编辑Agent
- 研究: 收集素材和数据
- 大纲: 根据素材规划文章结构
- 写作: 根据大纲撰写正文
- 编辑: 校对、润色、排版
案例3: 数据处理流水线
采集Agent → 清洗Agent → 分析Agent → 可视化Agent
- 采集: 从多个数据源获取原始数据
- 清洗: 去重、填充缺失值、格式统一
- 分析: 统计分析、趋势发现
- 可视化: 生成图表和报告
实现代码
"""
流水线模式实现
"""
from openai import OpenAI
import json
client = OpenAI()
class PipelineAgent:
"""流水线中的一个Agent节点"""
def __init__(self, name: str, system_prompt: str,
output_format: str = None):
self.name = name
self.system_prompt = system_prompt
self.output_format = output_format # 期望的输出格式说明
def process(self, input_data: str) -> str:
"""处理输入,产生输出"""
prompt = self.system_prompt
if self.output_format:
prompt += f"\n\n输出格式要求: {self.output_format}"
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": prompt},
{"role": "user", "content": input_data}
],
temperature=0.3
)
return response.choices[0].message.content
class Pipeline:
"""流水线编排器"""
def __init__(self, stages: list[PipelineAgent]):
self.stages = stages
def run(self, initial_input: str, verbose: bool = True) -> dict:
"""执行整条流水线"""
current_input = initial_input
stage_outputs = {}
for i, stage in enumerate(self.stages):
if verbose:
print(f"\n{'='*60}")
print(f"📍 Stage {i+1}/{len(self.stages)}: {stage.name}")
print(f" 输入: {current_input[:100]}...")
output = stage.process(current_input)
stage_outputs[stage.name] = output
if verbose:
print(f" 输出: {output[:100]}...")
print(f" ✅ 完成")
# 当前输出成为下一阶段的输入
current_input = output
return {
"final_output": current_input,
"stage_outputs": stage_outputs
}
# ═══════════════════════════════════════════
# 使用示例: 技术博客写作流水线
# ═══════════════════════════════════════════
# Stage 1: 研究
researcher = PipelineAgent(
name="研究员",
system_prompt="""你是一个技术研究员。根据给定的主题,提供详细的技术调研信息。
包括: 核心概念、关键技术点、优缺点、适用场景、相关工具/框架。""",
output_format="结构化的研究笔记,包含5-8个关键发现"
)
# Stage 2: 大纲
outliner = PipelineAgent(
name="大纲规划师",
system_prompt="""你是一个内容规划专家。根据研究笔记,规划一篇技术博客的大纲。
要求: 逻辑清晰、层次分明、覆盖所有关键点。""",
output_format="Markdown格式的文章大纲,包含标题、各章节标题和要点"
)
# Stage 3: 写作
writer = PipelineAgent(
name="技术作者",
system_prompt="""你是一个技术写作专家。根据大纲撰写完整的技术博客文章。
要求: 通俗易懂、有代码示例、有实际案例。""",
output_format="完整的Markdown格式技术博客文章"
)
# Stage 4: 审校
editor = PipelineAgent(
name="编辑审校",
system_prompt="""你是一个技术编辑。审校文章的准确性、可读性和完整性。
如果发现问题,直接修改并标注修改原因。如果没有问题,输出优化后的最终版本。""",
output_format="审校后的最终版本文章"
)
# 组装流水线
pipeline = Pipeline(stages=[researcher, outliner, writer, editor])
# 执行
result = pipeline.run("写一篇关于'LLM Agent记忆系统'的技术博客")
print("\n" + "="*60)
print("最终文章:")
print(result["final_output"][:500])
3.4 对话模式(Conversation Pattern)
是什么
定义: 多个Agent之间通过对话来协作,互相讨论、质疑、改进,
直到达成共识或满足终止条件。
结构:
┌──────────┐ ┌──────────┐
│ Agent A │ ←──→ │ Agent B │
│ (写代码) │ │ (审查) │
└──────────┘ └──────────┘
│ │
└────── 对话 ──────┘
轮次1: A写代码 → B审查,发现3个问题
轮次2: A修改代码 → B再审查,还有1个问题
轮次3: A再修改 → B通过 ✅
更复杂的多方对话:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Agent A │ ←──→ │ Agent B │ ←──→ │ Agent C │
│ (提出方案)│ │ (质疑) │ │ (裁判) │
└──────────┘ └──────────┘ └──────────┘
A提出方案 → B质疑漏洞 → A修改 → B再质疑 → C裁判决定
类比:
- 代码审查: 开发者提交PR → 审查者提意见 → 开发者修改 → 审查者通过
- 学术辩论: 正方陈述 → 反方质疑 → 正方回应 → 评委判定
- 头脑风暴: 多人讨论 → 互相补充 → 达成共识
为什么需要这种模式
核心优势:
1. 质量提升: 互相审查纠错,输出质量远高于单Agent
2. 多角度思考: 不同角色从不同角度分析同一问题
3. 自我改进: 通过多轮迭代,方案越来越完善
4. 模拟人类协作: 最接近人类团队讨论的模式
核心劣势:
1. 耗时长: 多轮对话意味着多次LLM调用
2. 成本高: 每轮对话都消耗Token
3. 可能不收敛: Agent之间可能"吵"不出结果
4. 需要收敛机制: 必须设置最大轮数或终止条件
关键设计:
必须有收敛机制,否则Agent可能无限对话下去!
收敛方式:
1. 最大轮数: 最多对话N轮,强制结束
2. 共识检测: 当所有Agent都同意时结束
3. 裁判Agent: 由第三方Agent判断是否可以结束
4. 质量阈值: 当输出达到某个质量标准时结束
适用场景
✅ 最适合:
- 代码写作+审查(最经典的场景)
- 方案设计+评审
- 论文写作+同行评审
- 任何需要"质量把关"的场景
实际案例:
1. AutoGen的双Agent对话
- Coder Agent写代码
- Critic Agent审查代码
- 多轮迭代直到代码通过审查
2. ChatDev的角色扮演对话
- CEO和CTO讨论技术方案
- 程序员和测试员讨论代码质量
- 通过角色扮演的对话推进项目
3. 辩论式推理(Debate)
- 多个Agent对同一问题给出不同答案
- 互相质疑对方的推理过程
- 最终由裁判Agent选出最佳答案
- 研究表明: 辩论后的答案准确率高于单Agent
实现代码
"""
对话模式实现: 代码写作 + 审查
"""
from openai import OpenAI
client = OpenAI()
class ConversationalAgent:
"""对话Agent"""
def __init__(self, name: str, system_prompt: str):
self.name = name
self.system_prompt = system_prompt
def respond(self, conversation_history: list[dict]) -> str:
"""根据对话历史生成回复"""
messages = [
{"role": "system", "content": self.system_prompt}
] + conversation_history
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
temperature=0.3
)
return response.choices[0].message.content
class ConversationOrchestrator:
"""对话编排器: 管理多Agent之间的对话"""
def __init__(self, agents: list[ConversationalAgent],
max_rounds: int = 5,
termination_keyword: str = "APPROVED"):
self.agents = agents
self.max_rounds = max_rounds
self.termination_keyword = termination_keyword
def run(self, initial_task: str) -> dict:
"""运行多轮对话"""
conversation = [{"role": "user", "content": initial_task}]
for round_num in range(self.max_rounds):
print(f"\n{'─'*60}")
print(f"🔄 Round {round_num + 1}/{self.max_rounds}")
for agent in self.agents:
# 每个Agent看到完整的对话历史
response = agent.respond(conversation)
print(f"\n 💬 [{agent.name}]:")
print(f" {response[:200]}...")
# 添加到对话历史
conversation.append({
"role": "assistant",
"content": f"[{agent.name}]: {response}"
})
# 检查终止条件
if self.termination_keyword in response:
print(f"\n ✅ {agent.name} 发出终止信号: {self.termination_keyword}")
return {
"rounds": round_num + 1,
"conversation": conversation,
"final_output": response,
"terminated_by": agent.name
}
print(f"\n ⚠️ 达到最大轮数 {self.max_rounds},强制结束")
return {
"rounds": self.max_rounds,
"conversation": conversation,
"final_output": conversation[-1]["content"],
"terminated_by": "max_rounds"
}
# ═══════════════════════════════════════════
# 使用示例: 代码写作 + 审查
# ═══════════════════════════════════════════
coder = ConversationalAgent(
name="开发者",
system_prompt="""你是一个高级Python开发者。
你的职责是根据需求编写高质量的代码。
当审查者提出修改意见时,你需要认真修改代码并解释修改原因。
输出格式: 先说明思路,然后给出完整代码。"""
)
reviewer = ConversationalAgent(
name="审查者",
system_prompt="""你是一个严格的代码审查专家。
你的职责是审查代码的质量、安全性、可维护性和性能。
审查要点: 错误处理、边界条件、命名规范、代码复杂度、安全漏洞。
如果代码有问题,指出具体问题和修改建议。
如果代码质量达标(没有严重问题),回复中包含"APPROVED"表示通过。
不要轻易通过——至少要审查一轮。"""
)
# 运行对话
orchestrator = ConversationOrchestrator(
agents=[coder, reviewer],
max_rounds=4,
termination_keyword="APPROVED"
)
result = orchestrator.run("请实现一个线程安全的LRU缓存,支持过期时间")
print(f"\n{'='*60}")
print(f"对话轮数: {result['rounds']}")
print(f"终止原因: {result['terminated_by']}")
3.5 群体模式(Swarm Pattern)
是什么
定义: 没有固定的管理者或流程,Agent之间可以自由地将任务转交给
"更合适"的Agent处理。每个Agent自己判断是否能处理当前任务,
如果不能就转交。
结构:
┌──────────┐
│ Agent A │ ←──┐
│ (客服) │ │
└────┬─────┘ │
│ │
▼ │
┌──────────┐ │
│ Agent B │────┤ ← 任意Agent可以转交任务给任意其他Agent
│ (技术) │ │
└────┬─────┘ │
│ │
▼ │
┌──────────┐ │
│ Agent C │ ───┘
│ (退款) │
└──────────┘
执行流程:
1. 用户消息到达Agent A(入口Agent)
2. Agent A判断: "这个问题我能处理吗?"
- 能 → 直接处理并回复
- 不能 → 转交给更合适的Agent
3. Agent B收到任务,同样判断
4. 直到某个Agent能处理并给出最终回答
关键特征:
- 没有中央管理者
- Agent自治(自己决定是否转交)
- 转交是"带上下文"的(不是从零开始)
- 灵活但可能"踢皮球"
类比:
打客服电话:
"您好,这个问题我处理不了,帮您转接技术部门"
→ "您好,这个涉及退款,帮您转接财务部门"
→ "您好,我来处理您的退款..."
为什么需要这种模式
核心优势:
1. 极度灵活: 不需要预定义固定流程
2. 去中心化: 没有单点故障
3. 自适应: Agent自己判断最佳处理者
4. 易于扩展: 新增Agent不影响现有流程
核心劣势:
1. 可能"踢皮球": Agent之间互相转交,没人处理
2. 不可预测: 执行路径不确定,难以调试
3. 需要收敛机制: 必须限制最大转交次数
4. Agent需要"自知之明": 要能准确判断自己能否处理
关键设计:
1. 每个Agent必须有清晰的"能力边界"描述
2. 必须设置最大转交次数(防止无限循环)
3. 转交时必须携带完整上下文
4. 需要一个"兜底Agent"处理没人接的任务
真实项目案例
案例1: OpenAI Swarm → OpenAI Agents SDK
- OpenAI于2024年开源Swarm实验框架,后演变为正式的Agents SDK
- 核心概念: Agent + Handoff(转交)
- 每个Agent定义instructions和functions
- Agent可以通过返回另一个Agent来实现转交
- 现已发展为功能完整的Agents SDK: https://github.com/openai/openai-agents-python
案例2: 智能客服系统
- 入口Agent: 理解用户意图
- 技术支持Agent: 处理技术问题
- 退款Agent: 处理退款请求
- 投诉Agent: 处理投诉升级
- 用户的问题自动路由到最合适的Agent
案例3: Anthropic的Tool Use + Handoff模式
- Claude的multi-tool-use中
- Agent可以"委托"其他Agent处理子任务
实现代码
"""
群体模式实现(参考OpenAI Swarm的设计思想)
"""
from openai import OpenAI
import json
client = OpenAI()
class SwarmAgent:
"""Swarm中的Agent: 可以自主决定是否转交"""
def __init__(self, name: str, instructions: str,
functions: list = None, handoff_targets: list = None):
self.name = name
self.instructions = instructions
self.functions = functions or []
self.handoff_targets = handoff_targets or [] # 可以转交给哪些Agent
def get_system_prompt(self, available_agents: dict) -> str:
"""生成包含转交能力的System Prompt"""
prompt = self.instructions
if self.handoff_targets:
prompt += "\n\n你可以将任务转交给以下Agent(当你认为他们更适合处理时):\n"
for target_name in self.handoff_targets:
if target_name in available_agents:
target = available_agents[target_name]
prompt += f"- {target_name}: {target.instructions[:100]}\n"
prompt += "\n如果需要转交,请在回复中包含: [HANDOFF: agent名称]"
prompt += "\n如果你能处理,直接回答用户问题。"
return prompt
class Swarm:
"""Swarm编排器: 管理Agent之间的转交"""
def __init__(self, agents: list[SwarmAgent], entry_agent: str,
max_handoffs: int = 5):
self.agents = {a.name: a for a in agents}
self.entry_agent = entry_agent
self.max_handoffs = max_handoffs
def run(self, user_message: str) -> dict:
"""运行Swarm"""
current_agent_name = self.entry_agent
messages = [{"role": "user", "content": user_message}]
handoff_chain = [current_agent_name]
for step in range(self.max_handoffs + 1):
current_agent = self.agents[current_agent_name]
system_prompt = current_agent.get_system_prompt(self.agents)
print(f"\n 🤖 [{current_agent_name}] 正在处理...")
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt}
] + messages,
temperature=0.3
)
reply = response.choices[0].message.content
# 检查是否需要转交
if "[HANDOFF:" in reply:
# 解析转交目标
import re
match = re.search(r'\[HANDOFF:\s*(\w+)\]', reply)
if match:
target_name = match.group(1)
if target_name in self.agents:
print(f" → 转交给 [{target_name}]")
current_agent_name = target_name
handoff_chain.append(target_name)
# 把转交原因加入上下文
messages.append({
"role": "assistant",
"content": f"[{handoff_chain[-2]}转交说明]: {reply}"
})
continue
# 没有转交,当前Agent直接回答
print(f" ✅ [{current_agent_name}] 给出最终回答")
return {
"final_agent": current_agent_name,
"response": reply,
"handoff_chain": handoff_chain,
"total_handoffs": len(handoff_chain) - 1
}
return {
"final_agent": current_agent_name,
"response": "达到最大转交次数,无法处理",
"handoff_chain": handoff_chain,
"total_handoffs": self.max_handoffs
}
# ═══════════════════════════════════════════
# 使用示例: 智能客服Swarm
# ═══════════════════════════════════════════
triage = SwarmAgent(
name="triage",
instructions="""你是客服入口Agent。你的职责是理解用户的问题,
如果是技术问题转交给tech,如果是退款问题转交给refund,
如果是简单的问候或通用问题,你直接回答。""",
handoff_targets=["tech", "refund"]
)
tech = SwarmAgent(
name="tech",
instructions="""你是技术支持Agent。你负责解答技术问题,
包括API使用、SDK集成、错误排查等。
如果用户的问题涉及退款,转交给refund。""",
handoff_targets=["refund"]
)
refund = SwarmAgent(
name="refund",
instructions="""你是退款处理Agent。你负责处理退款请求。
请确认订单信息,说明退款政策,并处理退款。
你不需要转交给其他Agent。"""
)
# 创建Swarm
swarm = Swarm(
agents=[triage, tech, refund],
entry_agent="triage",
max_handoffs=3
)
# 测试不同类型的问题
print("=== 测试1: 技术问题 ===")
result = swarm.run("你们的API怎么做认证?")
print(f"处理链: {' → '.join(result['handoff_chain'])}")
print(f"回答: {result['response'][:100]}")
print("\n=== 测试2: 退款问题 ===")
result = swarm.run("我想退款,订单号是ORD-12345")
print(f"处理链: {' → '.join(result['handoff_chain'])}")
print(f"回答: {result['response'][:100]}")
3.6 层级模式(Hierarchical Pattern)
是什么
定义: 多层管理结构,高层Agent管理中层Agent,中层Agent管理底层Agent。
类似公司的组织架构: 总监 → 经理 → 员工。
结构:
┌──────────────┐
│ 总管理者 │ ← Level 0: 战略决策
│ (CTO Agent) │
└──────┬───────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 前端主管 │ │ 后端主管 │ │ 测试主管 │ ← Level 1: 战术管理
│ Agent │ │ Agent │ │ Agent │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
┌───┼───┐ ┌───┼───┐ ┌───┼───┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
UI CSS JS API DB 缓存 单元 集成 E2E ← Level 2: 具体执行
Agent Agent Agent Agent Agent Agent Agent Agent Agent
执行流程:
1. 用户请求 → 总管理者
2. 总管理者拆分为"前端任务"+"后端任务"+"测试任务"
3. 前端主管收到前端任务,进一步拆分为"UI"+"CSS"+"JS"
4. 底层Agent执行具体工作
5. 结果逐级汇总: 底层→中层→顶层→用户
类比:
军队指挥: 将军→师长→团长→连长→士兵
公司管理: CEO→VP→Director→Manager→Engineer
为什么需要这种模式
核心优势:
1. 可扩展性强: 可以管理大量Agent(几十甚至上百个)
2. 职责清晰: 每一层有明确的管理范围
3. 复杂度可控: 每个管理者只需要管理3-5个下属
4. 适合大规模任务: 可以处理非常复杂的项目
核心劣势:
1. 层级越多,通信延迟越大
2. 中间层可能成为信息瓶颈
3. 实现复杂度高
4. 不适合简单任务(杀鸡用牛刀)
适合场景:
✅ 大型软件项目开发(前端+后端+移动端+测试+运维)
✅ 企业级复杂任务(涉及多个部门协作)
✅ Agent数量超过10个的场景
❌ 不适合简单任务
❌ 不适合Agent数量少于5个的场景
真实项目案例
案例1: MetaGPT
- 模拟软件公司的组织架构
- CEO → 产品经理 → 架构师 → 开发者 → 测试
- 每个角色有明确的输入输出格式(SOP)
- GitHub: https://github.com/FoundationAgents/MetaGPT (⭐ 68.5K)
案例2: ChatDev
- 模拟软件开发公司
- CEO + CTO + 程序员 + 测试 + 设计师
- 通过角色扮演对话推进项目
- GitHub: https://github.com/OpenBMB/ChatDev
案例3: CrewAI的Hierarchical Process
- 支持hierarchical模式
- 一个Manager Agent管理多个Worker Agent
- Manager负责任务分配和结果汇总
3.7 五种模式对比总结
┌──────────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ │ 管理者 │ 流水线 │ 对话 │ 群体 │ 层级 │
├──────────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ 控制方式 │ 集中 │ 固定流程 │ 协商 │ 自治 │ 分层 │
│ 灵活性 │ 中 │ 低 │ 高 │ 最高 │ 中 │
│ 可预测性 │ 高 │ 最高 │ 中 │ 低 │ 高 │
│ 并行能力 │ 高 │ 低(串行) │ 低 │ 中 │ 高 │
│ 实现复杂度 │ 中 │ 低 │ 中 │ 中 │ 高 │
│ 适合Agent数 │ 3-8 │ 3-6 │ 2-4 │ 3-10 │ 10+ │
│ 典型场景 │ 任务分配 │ 标准流程 │ 审查纠错 │ 客服路由 │ 大型项目 │
│ 代表框架 │ LangGraph │ MetaGPT │ AutoGen │ Swarm │ CrewAI │
│ │ Supervisor│ │ │ │ Hierarchy│
└──────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
选型建议:
- 不确定用哪个?→ 先试管理者模式(最通用)
- 流程固定?→ 流水线模式
- 需要质量把关?→ 对话模式
- 需要灵活路由?→ 群体模式
- 任务超级复杂?→ 层级模式
- 可以组合使用!→ 管理者 + 对话(管理者分配任务,子Agent之间对话协作)
四、通信机制详解
4.1 为什么通信机制很重要
多Agent系统的核心挑战不是"每个Agent怎么工作",
而是"Agent之间怎么交换信息"。
通信机制决定了:
1. Agent能获取什么信息(信息范围)
2. 信息传递的效率(延迟和带宽)
3. 系统的耦合度(修改一个Agent是否影响其他)
4. 可扩展性(能否轻松添加新Agent)
选错通信机制的后果:
- 信息不足: Agent做出错误决策(因为不知道其他Agent的状态)
- 信息过载: Agent收到太多无关信息,干扰判断
- 耦合过紧: 修改一个Agent导致其他Agent全部出错
- 性能瓶颈: 通信开销大于计算开销
4.2 方式1: 共享状态(Shared State)
定义: 所有Agent读写同一个状态对象。
任何Agent的修改,其他Agent都能立即看到。
原理:
┌─────────────────────────────────────────┐
│ 共享状态 (State) │
│ │
│ messages: [...] ← 所有Agent共享 │
│ plan: [...] ← 所有Agent可读写 │
│ results: {...} ← 所有Agent可读写 │
│ current_agent: "A" ← 所有Agent可读写 │
│ │
└─────────────────────────────────────────┘
↑↓ ↑↓ ↑↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Agent A │ │ Agent B │ │ Agent C │
└─────────┘ └─────────┘ └─────────┘
优点:
✅ 实现简单(一个dict/TypedDict就行)
✅ 信息同步即时(不需要显式传递)
✅ 所有Agent都有全局视角
缺点:
❌ 状态可能很大(所有信息都在里面)
❌ 并发冲突(两个Agent同时修改同一字段)
❌ 耦合度高(Agent依赖状态的具体结构)
❌ 不适合分布式部署
代表框架: LangGraph(State就是共享状态)
# LangGraph的共享状态示例
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class SharedState(TypedDict):
"""所有Agent共享的状态"""
messages: Annotated[list, add_messages] # 对话历史
plan: list[str] # 执行计划
current_step: int # 当前步骤
research_result: str # 研究结果
code_result: str # 代码结果
review_result: str # 审查结果
final_output: str # 最终输出
def researcher_node(state: SharedState) -> dict:
"""研究Agent: 读取state中的messages,写入research_result"""
# 读取共享状态
messages = state["messages"]
# ... 执行研究 ...
# 写入共享状态
return {"research_result": "研究结果..."}
def coder_node(state: SharedState) -> dict:
"""开发Agent: 读取research_result,写入code_result"""
research = state["research_result"] # 读取其他Agent的产出
# ... 根据研究结果写代码 ...
return {"code_result": "代码..."}
def reviewer_node(state: SharedState) -> dict:
"""审查Agent: 读取code_result,写入review_result"""
code = state["code_result"] # 读取其他Agent的产出
# ... 审查代码 ...
return {"review_result": "审查通过"}
4.3 方式2: 消息传递(Message Passing)
定义: Agent之间通过发送结构化消息来通信。
每个Agent有自己的"收件箱",只处理发给自己的消息。
原理:
┌─────────┐ 消息: {to: B, content: "请审查这段代码"} ┌─────────┐
│ Agent A │ ──────────────────────────────────────────→ │ Agent B │
└─────────┘ └─────────┘
│
┌─────────┐ 消息: {to: A, content: "发现3个问题..."} │
│ Agent A │ ←────────────────────────────────────────────────┘
└─────────┘
消息格式:
{
"from": "agent_a",
"to": "agent_b",
"type": "task_request", // task_request / task_result / feedback / handoff
"content": "具体内容",
"metadata": {"priority": "high", "deadline": "..."}
}
优点:
✅ 松耦合(Agent之间不共享内部状态)
✅ 适合分布式部署(消息可以通过网络传递)
✅ 可以异步通信(不需要同时在线)
✅ 信息精确(只传递需要的信息)
缺点:
❌ 实现复杂(需要消息路由、序列化等)
❌ 可能丢消息(需要确认机制)
❌ Agent没有全局视角(只知道发给自己的信息)
代表框架: AutoGen(Agent之间通过消息对话)
4.4 方式3: 黑板系统(Blackboard System)
定义: 一个共享的"黑板",Agent往上面写信息,其他Agent可以读。
类似团队的共享文档或看板。
原理:
┌─────────────────────────────────────────────────────┐
│ 黑板 (Blackboard) │
│ │
│ [研究结果] Agent A写入: "MCP协议的核心是..." │
│ [代码草稿] Agent B写入: "def connect():..." │
│ [审查意见] Agent C写入: "第3行有安全漏洞" │
│ [任务状态] 系统写入: "Step 2/5 进行中" │
│ │
└─────────────────────────────────────────────────────┘
↑读/写 ↑读/写 ↑读/写
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Agent A │ │ Agent B │ │ Agent C │
│ (研究) │ │ (开发) │ │ (审查) │
└─────────┘ └─────────┘ └─────────┘
与共享状态的区别:
共享状态: 所有Agent看到完全相同的状态(全量)
黑板系统: Agent可以选择性地读取黑板上的特定区域(按需)
优点:
✅ 信息持久化(写在黑板上不会丢)
✅ 选择性读取(不需要看所有信息)
✅ 异步协作(Agent不需要同时工作)
✅ 可追溯(谁写了什么一目了然)
缺点:
❌ 黑板可能变得很大
❌ 需要管理黑板的读写权限
❌ Agent需要知道去哪里找信息
适合场景:
- 多个Agent需要共享中间结果
- Agent工作节奏不同(有的快有的慢)
- 需要记录完整的协作过程
4.5 方式4: 事件驱动(Event-Driven)
定义: Agent通过发布/订阅事件来通信。
Agent发布事件,订阅了该事件的Agent会收到通知。
原理:
┌─────────────────────────────────────────────────────┐
│ 事件总线 (Event Bus) │
│ │
│ 事件类型: │
│ "research_complete" → 订阅者: [Agent B, Agent C] │
│ "code_ready" → 订阅者: [Agent C] │
│ "review_failed" → 订阅者: [Agent B] │
│ │
└─────────────────────────────────────────────────────┘
发布↑ 订阅↓ 发布↑ 订阅↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Agent A │ │ Agent B │ │ Agent C │
│ 发布: │ │ 订阅: │ │ 订阅: │
│ research │ │ research │ │ research │
│ _complete│ │ _complete│ │ _complete│
│ │ │ 发布: │ │ code_ │
│ │ │ code_ │ │ ready │
│ │ │ ready │ │ │
└─────────┘ └─────────┘ └─────────┘
优点:
✅ 最松耦合(Agent之间完全不知道彼此的存在)
✅ 最适合分布式和大规模系统
✅ 易于扩展(新Agent只需订阅感兴趣的事件)
✅ 天然支持并行(多个Agent可以同时响应同一事件)
缺点:
❌ 调试困难(事件流难以追踪)
❌ 顺序不确定(不知道谁先收到事件)
❌ 实现复杂(需要事件总线基础设施)
❌ 不适合需要严格顺序的场景
适合场景:
- 大规模多Agent系统(10+个Agent)
- 微服务架构的Agent系统
- Agent需要动态加入/退出的场景
4.6 四种通信方式对比
┌──────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
│ │ 共享状态 │ 消息传递 │ 黑板系统 │ 事件驱动 │
├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
│ 耦合度 │ 高 │ 中 │ 中 │ 低 │
│ 实现复杂度 │ 低 │ 中 │ 中 │ 高 │
│ 分布式支持 │ 差 │ 好 │ 中 │ 最好 │
│ 信息可见性 │ 全局可见 │ 点对点 │ 选择性可见 │ 订阅可见 │
│ 适合规模 │ 小(3-5) │ 中(5-10) │ 中(5-10) │ 大(10+) │
│ 代表框架 │ LangGraph │ AutoGen │ 自定义 │ 自定义 │
│ 最佳场景 │ 简单协作 │ 对话协作 │ 异步协作 │ 大规模系统 │
└──────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
选型建议:
Agent数量 < 5 → 共享状态(简单够用)
Agent需要对话 → 消息传递
Agent异步工作 → 黑板系统
Agent数量 > 10 → 事件驱动
五、协调机制
5.1 为什么需要协调
问题: 多个Agent可能产生冲突
场景1: 任务冲突
Agent A: "我来处理这个任务"
Agent B: "不,我来处理"
→ 谁来做?
场景2: 意见冲突
Agent A: "应该用方案1"
Agent B: "应该用方案2"
→ 听谁的?
场景3: 资源冲突
Agent A: "我需要调用数据库"
Agent B: "我也需要调用数据库"(但数据库有并发限制)
→ 谁先用?
没有协调机制 → 混乱、死锁、重复劳动
有协调机制 → 有序、高效、结果一致
5.2 中央调度(Central Scheduling)
原理: 一个"调度者"做所有决策,其他Agent只执行。
调度者决定:
- 谁做什么任务
- 什么顺序执行
- 冲突时听谁的
优点: 简单、可预测、不会死锁
缺点: 调度者是单点故障、可能成为瓶颈
实现: 就是"管理者模式"中的Orchestrator
5.3 投票/共识机制(Voting/Consensus)
原理: 多个Agent对同一问题给出答案,通过投票决定最终结果。
Agent A: "答案是X"
Agent B: "答案是Y"
Agent C: "答案是X"
→ 投票结果: X (2票) > Y (1票) → 最终答案是X
变体:
1. 简单多数: 超过50%即通过
2. 加权投票: 不同Agent的票权重不同(专家的票更重)
3. 一致性要求: 必须所有Agent都同意
适合场景:
- 需要高可靠性的决策(多个Agent交叉验证)
- 答案有明确对错的场景(如数学计算、事实判断)
实际应用:
- LLM-as-Judge: 多个LLM评估同一个输出,投票决定质量
- 多模型集成: 同一问题问3个不同模型,取多数答案
"""
投票机制实现
"""
from openai import OpenAI
from collections import Counter
client = OpenAI()
def vote_based_decision(question: str, num_voters: int = 3,
models: list = None) -> dict:
"""多Agent投票决策"""
if models is None:
models = ["gpt-4o-mini"] * num_voters
votes = []
for i, model in enumerate(models):
response = client.chat.completions.create(
model=model,
messages=[{
"role": "user",
"content": f"""{question}
请给出你的答案。只回答最终结论,不要解释过程。"""
}],
temperature=0.7 # 稍高温度增加多样性
)
answer = response.choices[0].message.content.strip()
votes.append(answer)
print(f" Voter {i+1}: {answer}")
# 统计投票结果
counter = Counter(votes)
winner = counter.most_common(1)[0]
return {
"votes": votes,
"winner": winner[0],
"confidence": winner[1] / len(votes),
"unanimous": len(counter) == 1
}
# 使用示例
result = vote_based_decision("Python中 list.sort() 和 sorted() 的区别是什么?最核心的一点是?")
print(f"\n投票结果: {result['winner']}")
print(f"一致性: {'全票通过' if result['unanimous'] else f'置信度{result[\"confidence\"]:.0%}'}")
5.4 辩论机制(Debate)
原理: Agent之间就某个问题进行辩论,互相质疑对方的推理过程,
最终由裁判Agent或人类决定采纳哪个方案。
流程:
1. 多个Agent各自给出答案和推理过程
2. Agent互相阅读对方的推理,指出漏洞
3. Agent根据对方的质疑修改自己的答案
4. 重复2-3轮
5. 裁判Agent选出最终答案
为什么辩论比投票好:
投票: 只看最终答案,不看推理过程
辩论: 通过质疑推理过程,能发现隐藏的错误
研究结果:
"Improving Factuality and Reasoning in Language Models through Multiagent Debate"
(Du et al., 2023)
→ 辩论后的答案准确率比单Agent高10-20%
→ 特别是在需要推理的复杂问题上效果显著
5.5 市场机制(Market Mechanism)
原理: Agent通过"竞标"来获取任务。
每个Agent评估自己完成任务的能力和成本,
最合适的Agent"赢得"任务执行权。
流程:
1. 管理者发布任务: "需要分析一段Go代码的性能问题"
2. Agent A竞标: "我是Go专家,置信度0.9,预计耗时30s"
3. Agent B竞标: "我是通用开发者,置信度0.6,预计耗时60s"
4. Agent C竞标: "我是Python专家,置信度0.3,不太适合"
5. 管理者选择Agent A(最高置信度)
优点:
✅ 自动选择最合适的Agent
✅ Agent可以动态加入/退出
✅ 天然的负载均衡
缺点:
❌ 竞标过程本身有开销
❌ Agent可能"高估"自己的能力
❌ 实现复杂
适合场景:
- Agent池很大,需要动态选择
- 任务类型多样,不同任务需要不同专家
- 类似"人才市场"的场景
六、A2A协议(Agent-to-Agent Protocol)
6.1 为什么需要A2A
背景:
MCP解决了"Agent如何连接工具"的标准化问题。
但还有一个问题没解决: "Agent如何连接Agent"?
当前的多Agent系统:
- CrewAI的Agent只能和CrewAI的Agent协作
- AutoGen的Agent只能和AutoGen的Agent协作
- 不同框架的Agent无法互通
类比:
MCP之前: 每个AI应用自己写工具连接代码 → MCP统一了
A2A之前: 每个框架自己定义Agent通信方式 → A2A要统一
A2A的目标:
让不同团队、不同框架、甚至不同公司的Agent能够互相通信和协作。
你的Agent(用LangGraph写的)
↕ A2A协议
合作方的Agent(用AutoGen写的)
↕ A2A协议
第三方的Agent(用CrewAI写的)
6.2 A2A的核心概念
A2A协议 (Google, 2025年4月首次发布,现已捐赠给Linux Foundation)
GitHub: https://github.com/a2aproject/A2A (⭐ 24.1K+)
官方文档: https://a2aproject.github.io/A2A/
四个核心概念:
1. Agent Card(智能体名片)
每个Agent对外暴露一个"名片",描述自己的能力
类似MCP Server的工具列表,但描述的是Agent级别的能力
{
"name": "code-reviewer",
"description": "专业的代码审查Agent,支持Python/Go/Java",
"capabilities": ["code_review", "security_audit", "performance_analysis"],
"input_format": "代码文件或PR链接",
"output_format": "结构化的审查报告"
}
2. Task(任务)
Agent间传递的工作单元
{
"task_id": "task_001",
"from_agent": "orchestrator",
"to_agent": "code-reviewer",
"description": "审查这段代码的安全性",
"payload": {"code": "...", "language": "python"},
"deadline": "2024-03-15T10:00:00Z"
}
3. Message(消息)
Agent间的通信消息(任务进度、中间结果、问题反馈等)
4. Artifact(产出物)
任务完成后的产出
{
"task_id": "task_001",
"artifact_type": "review_report",
"content": {"issues": [...], "score": 85, "suggestions": [...]}
}
关键技术特性:
- 通信协议: JSON-RPC 2.0 over HTTP(S)
- 交互模式: 同步请求/响应、SSE流式、异步推送通知
- 数据格式: 支持文本、文件和结构化JSON
- 企业级: 内置安全认证和可观测性设计
官方SDK(多语言支持):
- Python: pip install a2a-sdk
- Go: go get github.com/a2aproject/a2a-go
- JavaScript: npm install @a2a-js/sdk
- Java: Maven依赖
- .NET: dotnet add package A2A
- Rust: cargo add a2a-lf
A2A vs MCP:
┌──────────────┬──────────────────────────────────────────┐
│ │ 连接对象 │
├──────────────┼──────────────────────────────────────────┤
│ MCP │ Agent ←→ Tool(Agent连接工具) │
│ A2A │ Agent ←→ Agent(Agent连接Agent) │
├──────────────┼──────────────────────────────────────────┤
│ │ 粒度 │
├──────────────┼──────────────────────────────────────────┤
│ MCP │ 函数级(一个工具 = 一个函数) │
│ A2A │ Agent级(一个Agent = 一组能力) │
├──────────────┼──────────────────────────────────────────┤
│ │ 通信模式 │
├──────────────┼──────────────────────────────────────────┤
│ MCP │ 请求-响应(同步) │
│ A2A │ 任务-产出(可异步,支持长时间运行的任务) │
├──────────────┼──────────────────────────────────────────┤
│ │ 治理 │
├──────────────┼──────────────────────────────────────────┤
│ MCP │ Anthropic主导 │
│ A2A │ Linux Foundation开源治理 │
└──────────────┴──────────────────────────────────────────┘
6.3 A2A的当前状态
截至2026年6月:
- Google于2025年4月首次发布A2A协议规范
- 2025年下半年捐赠给Linux Foundation,成为开放治理项目
- 项目已从google/A2A迁移到独立组织a2aproject/A2A
- GitHub: 24.1K+ Stars, 2.4K+ Forks, 144+贡献者
- 已有完整的多语言SDK(Python/Go/JS/Java/.NET/Rust)
- DeepLearning.AI已推出官方课程(与Google Cloud和IBM Research合作)
- 多个主流框架已集成A2A支持:
- Google ADK: 原生支持A2A Server/Client
- LangGraph: 可将Agent暴露为A2A-compliant Server
- BeeAI: 原生A2A支持
- CrewAI: 通过插件支持A2A
- 协议仍在快速演进中,路线图包括:
- Agent Discovery增强(AgentCard中的授权方案)
- QuerySkill()方法(动态查询Agent能力)
- 动态UX协商(任务中途切换交互模式)
- 流式可靠性和推送通知机制改进
对开发者的建议:
- A2A已进入可用阶段,建议在新项目中考虑A2A兼容性
- 如果你的Agent需要跨团队/跨组织协作,优先采用A2A
- 使用Google ADK或LangGraph可以最快实现A2A兼容
- 学习资源: DeepLearning.AI官方课程 "A2A: The Agent2Agent Protocol"
- 关注a2aproject/A2A仓库的更新和samples目录
七、主流多Agent框架深度对比
7.1 框架全景
┌──────────────────────────────────────────────────────────────────────────────────────┐
│ 主流多Agent框架 (2024-2026) │
├──────────────┬──────────────┬──────────────┬──────────────┬─────────────┬────────────┤
│ CrewAI │ AutoGen │ LangGraph │ OpenAI │ MetaGPT │ Google ADK │
│ │ (Microsoft) │ (LangChain) │ Agents SDK │(Foundation │ (Google) │
│ │ │ │ │ Agents) │ │
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┼────────────┤
│ 高层抽象 │ 对话驱动 │ 图编排 │ 轻量+全能 │ SOP驱动 │ A2A原生 │
│ 开箱即用 │ 灵活强大 │ 精确控制 │ 多模型支持 │ 软件开发 │ 云原生 │
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┼────────────┤
│ Python │ Python │ Python │ Python/JS │ Python │ Python │
│ 2023.10 │ 2023.9 │ 2024.1 │ 2025.3 │ 2023.8 │ 2025.4 │
├──────────────┼──────────────┼──────────────┼──────────────┼─────────────┼────────────┤
│ ⭐ 52.9K │ ⭐ 58.7K │ ⭐ 33.9K │ ⭐ 26.9K │ ⭐ 68.5K │ ⭐ 20K │
│ (GitHub Star)│ │ │ │ │ │
└──────────────┴──────────────┴──────────────┴──────────────┴─────────────┴────────────┘
注: Star数据截至2026年6月
7.2 CrewAI
定位: "最简单的多Agent框架"——用最少的代码实现多Agent协作
核心概念:
- Agent: 有角色、目标、背景故事的智能体
- Task: 分配给Agent的具体任务
- Crew: 一组Agent + 一组Task的组合
- Process: 执行模式(sequential顺序 / hierarchical层级)
设计哲学:
"像组建一个团队一样简单"
定义角色 → 分配任务 → 一键运行
优点:
✅ 上手极快(10行代码就能跑起来)
✅ 概念直观(Agent/Task/Crew对应人/任务/团队)
✅ 内置工具集成(搜索、文件读写等)
✅ 支持层级模式(Manager自动分配任务)
缺点:
❌ 灵活性有限(复杂流程难以表达)
❌ 调试困难(黑盒执行,中间过程不透明)
❌ 不支持复杂的条件分支和循环
❌ 对LLM调用的控制粒度粗
"""
CrewAI示例: 技术调研团队
依赖: pip install crewai
"""
from crewai import Agent, Task, Crew, Process
# ═══════════════════════════════════════════
# 定义Agent(角色)
# ═══════════════════════════════════════════
researcher = Agent(
role="技术研究员",
goal="深入研究给定的技术主题,收集关键信息和最新动态",
backstory="""你是一位资深技术研究员,有10年的技术调研经验。
你擅长从多个角度分析技术,能快速识别技术的核心价值和潜在风险。""",
verbose=True,
allow_delegation=False, # 不允许委派给其他Agent
)
analyst = Agent(
role="技术分析师",
goal="从研究数据中提取关键洞察,形成结构化的分析结论",
backstory="""你是一位技术分析师,擅长从大量信息中提炼关键洞察。
你能识别技术趋势、评估优劣势、给出客观的技术评价。""",
verbose=True,
allow_delegation=False,
)
writer = Agent(
role="技术作者",
goal="将分析结果撰写为清晰易懂的技术报告",
backstory="""你是一位技术写作专家,能把复杂技术概念写成通俗易懂的文章。
你的文章结构严谨、重点突出、有理有据。""",
verbose=True,
allow_delegation=False,
)
# ═══════════════════════════════════════════
# 定义Task(任务)
# ═══════════════════════════════════════════
research_task = Task(
description="""研究"Agent记忆系统"的技术现状,包括:
1. 主流的记忆架构方案
2. 关键论文和开源项目
3. 生产环境的最佳实践
4. 当前的技术挑战""",
expected_output="包含4个方面的详细研究笔记,每个方面至少3个关键发现",
agent=researcher,
)
analysis_task = Task(
description="""基于研究笔记,分析:
1. 最成熟的技术方案是什么
2. 最大的技术挑战是什么
3. 未来发展趋势
4. 对开发者的建议""",
expected_output="结构化的分析报告,包含4个维度的深度分析",
agent=analyst,
)
writing_task = Task(
description="""基于研究和分析,撰写一篇技术报告:
1. 标题: "Agent记忆系统技术调研报告"
2. 包含: 背景、现状、分析、趋势、建议
3. 语言简洁,重点突出,1000字左右""",
expected_output="一篇结构清晰的技术报告",
agent=writer,
)
# ═══════════════════════════════════════════
# 组建Crew并运行
# ═══════════════════════════════════════════
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, writing_task],
process=Process.sequential, # 顺序执行(流水线模式)
verbose=True,
)
# 运行
result = crew.kickoff()
print("\n" + "="*60)
print("最终报告:")
print(result)
7.3 AutoGen
定位: "最灵活的多Agent对话框架"——Agent之间通过对话协作
核心概念:
- Agent: 可以发送和接收消息的实体
- GroupChat: 多个Agent的群聊
- GroupChatManager: 管理群聊中的发言顺序
- ConversableAgent: 可对话的Agent基类
设计哲学:
"Agent之间的协作本质上就是对话"
让Agent像人一样聊天、讨论、达成共识
优点:
✅ 极度灵活(任何对话模式都能实现)
✅ 支持人类参与(Human-in-the-loop)
✅ 丰富的Agent类型(Assistant/UserProxy/GroupChat等)
✅ 微软背书,社区活跃
缺点:
❌ 学习曲线陡(概念多,API复杂)
❌ 对话可能不收敛(需要仔细设计终止条件)
❌ Token消耗大(多轮对话累积)
❌ 版本迭代快,API不稳定(v0.2 → v0.4变化大)
"""
AutoGen示例: 代码写作+审查对话
依赖: pip install autogen-agentchat autogen-ext
"""
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_ext.models.openai import OpenAIChatCompletionClient
# 创建模型客户端
model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")
# ═══════════════════════════════════════════
# 定义Agent
# ═══════════════════════════════════════════
coder = AssistantAgent(
name="coder",
model_client=model_client,
system_message="""你是一个Python开发者。
根据需求写代码,代码要求:
1. 有完整的类型注解
2. 有docstring
3. 有错误处理
4. 代码简洁高效
当审查者说APPROVED时,任务完成。""",
)
reviewer = AssistantAgent(
name="reviewer",
model_client=model_client,
system_message="""你是一个代码审查专家。
审查代码的:
1. 正确性(逻辑是否正确)
2. 健壮性(错误处理是否完善)
3. 可读性(命名、注释是否清晰)
4. 性能(是否有明显的性能问题)
如果有问题,指出具体问题和修改建议。
如果代码质量达标,回复"APPROVED"。""",
)
# ═══════════════════════════════════════════
# 组建团队
# ═══════════════════════════════════════════
# 终止条件: 当消息中出现"APPROVED"时停止
termination = TextMentionTermination("APPROVED")
team = RoundRobinGroupChat(
participants=[coder, reviewer],
termination_condition=termination,
max_turns=6, # 最多6轮对话
)
# ═══════════════════════════════════════════
# 运行
# ═══════════════════════════════════════════
async def main():
result = await team.run(
task="实现一个Python装饰器,用于函数调用的重试机制,支持指定最大重试次数和重试间隔"
)
print("\n" + "="*60)
print("对话记录:")
for msg in result.messages:
print(f"\n[{msg.source}]: {msg.content[:200]}...")
asyncio.run(main())
7.4 LangGraph多Agent
定位: "最精确控制的多Agent框架"——用图来定义Agent之间的协作流程
核心概念:
- State: 共享状态(所有节点共享)
- Node: 图中的节点(每个节点可以是一个Agent)
- Edge: 节点之间的连接(定义流转逻辑)
- Conditional Edge: 条件边(根据状态决定下一步)
设计哲学:
"多Agent协作 = 一个状态机/图"
用图的节点和边精确定义Agent之间的协作流程
优点:
✅ 精确控制(每一步都可以精确定义)
✅ 可视化(图结构直观)
✅ 支持复杂流程(条件分支、循环、并行)
✅ 与LangChain生态无缝集成
✅ 内置持久化(checkpoint)
缺点:
❌ 代码量大(需要定义State、Node、Edge)
❌ 学习曲线(需要理解图编程范式)
❌ 对简单场景过于复杂
"""
LangGraph多Agent示例: Supervisor模式
依赖: pip install langgraph langchain-openai
"""
from typing import TypedDict, Annotated, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
import json
# ═══════════════════════════════════════════
# 定义共享状态
# ═══════════════════════════════════════════
class MultiAgentState(TypedDict):
messages: Annotated[list, add_messages]
next_agent: str # 下一个要执行的Agent
research_output: str
code_output: str
final_output: str
# ═══════════════════════════════════════════
# 定义Agent节点
# ═══════════════════════════════════════════
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
def supervisor_node(state: MultiAgentState) -> dict:
"""Supervisor: 决定下一步由谁执行"""
messages = state["messages"]
response = llm.invoke([
SystemMessage(content="""你是一个任务管理者。根据当前状态,决定下一步由谁执行。
可选的Agent:
- researcher: 负责研究和收集信息
- coder: 负责编写代码
- FINISH: 任务完成
根据对话历史和已有结果,决定下一步。
只回答一个词: researcher / coder / FINISH"""),
*messages
])
next_agent = response.content.strip().lower()
if next_agent not in ["researcher", "coder", "finish"]:
next_agent = "finish"
return {"next_agent": next_agent}
def researcher_node(state: MultiAgentState) -> dict:
"""研究Agent"""
messages = state["messages"]
response = llm.invoke([
SystemMessage(content="你是一个技术研究员。根据用户的需求,提供详细的技术调研信息。"),
*messages
])
return {
"messages": [response],
"research_output": response.content
}
def coder_node(state: MultiAgentState) -> dict:
"""开发Agent"""
messages = state["messages"]
research = state.get("research_output", "")
context = f"参考研究结果:\n{research}\n\n" if research else ""
response = llm.invoke([
SystemMessage(content=f"你是一个高级开发者。{context}根据需求编写高质量代码。"),
*messages
])
return {
"messages": [response],
"code_output": response.content
}
# ═══════════════════════════════════════════
# 构建图
# ═══════════════════════════════════════════
def route_next(state: MultiAgentState) -> Literal["researcher", "coder", "__end__"]:
"""路由函数: 根据supervisor的决策路由到下一个节点"""
next_agent = state.get("next_agent", "finish")
if next_agent == "finish":
return "__end__"
return next_agent
# 构建StateGraph
graph = StateGraph(MultiAgentState)
# 添加节点
graph.add_node("supervisor", supervisor_node)
graph.add_node("researcher", researcher_node)
graph.add_node("coder", coder_node)
# 添加边
graph.add_edge(START, "supervisor")
graph.add_conditional_edges("supervisor", route_next)
graph.add_edge("researcher", "supervisor") # 研究完回到supervisor
graph.add_edge("coder", "supervisor") # 编码完回到supervisor
# 编译
app = graph.compile()
# ═══════════════════════════════════════════
# 运行
# ═══════════════════════════════════════════
result = app.invoke({
"messages": [HumanMessage(content="帮我用Go实现一个简单的限流器(令牌桶算法)")],
"next_agent": "",
"research_output": "",
"code_output": "",
"final_output": ""
})
print("最终结果:")
for msg in result["messages"]:
if hasattr(msg, "content"):
print(f"\n{msg.content[:300]}...")
7.5 OpenAI Agents SDK
定位: "轻量但全能的多Agent框架"——OpenAI官方出品,已发展为功能丰富的生产级框架
GitHub: https://github.com/openai/openai-agents-python (⭐ 26.9K)
安装: pip install openai-agents
核心概念(已从最初的3个扩展到9个):
- Agent: 有instructions和tools的智能体
- Sandbox Agents: 预配置容器环境的Agent(v0.14.0新增),支持长时间任务
- Agents as tools / Handoffs: Agent之间的委托和转交
- Tools: 函数工具、MCP工具、托管工具
- Guardrails: 输入输出安全验证
- Human in the loop: 内置人类介入机制
- Sessions: 自动管理跨轮次的对话历史
- Tracing: 内置运行追踪、调试和优化
- Realtime Agents: 基于gpt-realtime-2的语音Agent
设计哲学:
"少即是多,但也要够用"——从极简起步,逐步扩展为全能框架
现在已支持100+个LLM(通过LiteLLM集成),不再仅限OpenAI模型
重大更新(2025-2026):
- Provider-agnostic: 支持OpenAI、Anthropic、Google等100+模型
- Sandbox Agents: 支持容器化长时间任务执行
- Sessions: 自动对话历史管理(支持Redis持久化)
- JS/TS版本: 已发布JavaScript/TypeScript SDK
- Realtime Agents: 语音Agent支持
优点:
✅ API设计优雅(几行代码就能跑)
✅ OpenAI官方维护,迭代快
✅ 原生支持Handoff(Swarm模式)
✅ 内置Tracing和调试工具
✅ 支持100+模型(不再仅限OpenAI)
✅ Sandbox Agents支持复杂长时间任务
✅ 有Python和JS/TS双版本
缺点:
❌ 不支持复杂的图编排(不如LangGraph灵活)
❌ 没有内置的对话模式(不如AutoGen)
❌ 版本迭代快,API可能变化
"""
OpenAI Agents SDK示例
依赖: pip install openai-agents
"""
from agents import Agent, Runner, function_tool, handoff
# ═══════════════════════════════════════════
# 定义工具
# ═══════════════════════════════════════════
@function_tool
def search_docs(query: str) -> str:
"""搜索技术文档"""
return f"搜索'{query}'的结果: [模拟的搜索结果...]"
@function_tool
def write_code(spec: str, language: str = "python") -> str:
"""根据规格写代码"""
return f"```{language}\n# 根据规格: {spec}\ndef implement():\n pass\n```"
@function_tool
def run_tests(code: str) -> str:
"""运行测试"""
return "所有测试通过 ✅"
# ═══════════════════════════════════════════
# 定义Agent
# ═══════════════════════════════════════════
researcher = Agent(
name="researcher",
instructions="你是技术研究员。使用search_docs工具收集信息,然后总结关键发现。",
tools=[search_docs],
)
developer = Agent(
name="developer",
instructions="你是开发者。根据需求使用write_code工具编写代码。",
tools=[write_code],
)
tester = Agent(
name="tester",
instructions="你是测试工程师。使用run_tests工具验证代码。",
tools=[run_tests],
)
# 入口Agent(Triage/Router)
triage = Agent(
name="triage",
instructions="""你是任务路由Agent。根据用户的请求:
- 如果需要调研 → 转交给researcher
- 如果需要写代码 → 转交给developer
- 如果需要测试 → 转交给tester""",
handoffs=[
handoff(agent=researcher, description="需要技术调研时转交"),
handoff(agent=developer, description="需要编写代码时转交"),
handoff(agent=tester, description="需要运行测试时转交"),
],
)
# ═══════════════════════════════════════════
# 运行
# ═══════════════════════════════════════════
async def main():
result = await Runner.run(triage, "帮我调研一下Go的限流库有哪些")
print(f"最终结果: {result.final_output}")
import asyncio
asyncio.run(main())
7.6 框架选型指南
┌──────────────────────────────────────────────────────────────────────────┐
│ 框架选型决策树 │
└──────────────────────────────────────────────────────────────────────────┘
你的需求是什么?
├── "我想快速搭建一个多Agent原型"
│ → CrewAI(最快上手,10分钟跑起来)
│
├── "我需要Agent之间深度对话和纠错"
│ → AutoGen(对话模式最强)
│
├── "我需要精确控制每一步的执行流程"
│ → LangGraph(图编排,精确控制)
│
├── "我想要轻量但功能全面的方案"
│ → OpenAI Agents SDK(官方出品,支持100+模型,功能丰富)
│
├── "我要模拟一个软件开发团队"
│ → MetaGPT 或 ChatDev(专为软件开发设计)
│
└── "我需要生产级的可靠性和可观测性"
→ LangGraph(内置持久化、重试、可观测性)
├── "我需要原生A2A协议支持"
│ → Google ADK(A2A协议的官方参考实现)
更详细的对比:
┌──────────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ 维度 │ CrewAI │ AutoGen │ LangGraph│ OAI SDK │ MetaGPT │Google ADK│
├──────────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ 上手难度 │ ⭐ │ ⭐⭐⭐ │ ⭐⭐⭐ │ ⭐ │ ⭐⭐ │ ⭐⭐ │
│ 灵活性 │ ⭐⭐ │ ⭐⭐⭐⭐ │ ⭐⭐⭐⭐⭐│ ⭐⭐⭐ │ ⭐⭐ │ ⭐⭐⭐⭐ │
│ 生产就绪 │ ⭐⭐⭐ │ ⭐⭐⭐ │ ⭐⭐⭐⭐ │ ⭐⭐⭐ │ ⭐⭐ │ ⭐⭐⭐ │
│ 模型支持 │ 多模型 │ 多模型 │ 多模型 │ 100+模型 │ 多模型 │ 多模型 │
│ A2A支持 │ 插件 │ 社区 │ 已集成 │ 无 │ 无 │ 原生 │
│ 社区活跃度 │ 高 │ 最高 │ 高 │ 高 │ 高 │ 高 │
│ 文档质量 │ 好 │ 中 │ 好 │ 好 │ 中 │ 好 │
│ 调试体验 │ 一般 │ 一般 │ 好 │ 好 │ 一般 │ 好 │
└──────────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
八、完整实战:从零构建多Agent协作系统
8.1 实战目标
构建一个"技术方案评审"多Agent系统:
用户输入: 一个技术方案描述
系统输出: 多角度的评审报告
Agent团队:
1. 架构师Agent: 评审架构设计的合理性
2. 安全专家Agent: 评审安全风险
3. 性能专家Agent: 评审性能瓶颈
4. 汇总Agent: 整合所有评审意见,生成最终报告
架构模式: 管理者模式(汇总Agent作为管理者)
通信方式: 共享状态
8.2 完整实现
"""
完整实战: 技术方案评审多Agent系统
依赖: pip install openai
"""
from openai import OpenAI
from dataclasses import dataclass, field
from datetime import datetime
import json
from concurrent.futures import ThreadPoolExecutor, as_completed
client = OpenAI()
# ═══════════════════════════════════════════════════════════════════
# Part 1: Agent定义
# ═══════════════════════════════════════════════════════════════════
@dataclass
class ReviewAgent:
"""评审Agent"""
name: str
role: str
system_prompt: str
review_dimensions: list[str] # 评审维度
def review(self, proposal: str) -> dict:
"""对技术方案进行评审"""
dimensions_text = "\n".join([f" {i+1}. {d}" for i, d in enumerate(self.review_dimensions)])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": f"""请从你的专业角度评审以下技术方案:
{proposal}
请从以下维度进行评审:
{dimensions_text}
输出JSON格式:
{{
"score": 1-10的评分,
"summary": "一句话总结评审结论",
"issues": [
{{"severity": "high/medium/low", "description": "问题描述", "suggestion": "改进建议"}}
],
"highlights": ["方案的亮点1", "方案的亮点2"]
}}"""}
],
response_format={"type": "json_object"},
temperature=0.3
)
try:
result = json.loads(response.choices[0].message.content)
result["reviewer"] = self.name
result["role"] = self.role
return result
except:
return {
"reviewer": self.name,
"role": self.role,
"score": 5,
"summary": "评审过程出错",
"issues": [],
"highlights": []
}
# ═══════════════════════════════════════════════════════════════════
# Part 2: 评审团队
# ═══════════════════════════════════════════════════════════════════
class ReviewTeam:
"""评审团队: 管理多个评审Agent"""
def __init__(self):
self.reviewers = self._create_reviewers()
def _create_reviewers(self) -> list[ReviewAgent]:
"""创建评审团队"""
return [
ReviewAgent(
name="架构师",
role="系统架构评审",
system_prompt="""你是一位资深系统架构师,有15年分布式系统设计经验。
你擅长评估系统架构的合理性、可扩展性和可维护性。
你的评审风格: 严谨但建设性,指出问题的同时给出改进方案。""",
review_dimensions=[
"架构分层是否合理",
"组件职责是否清晰",
"可扩展性设计",
"技术选型是否合适",
"是否存在过度设计或设计不足"
]
),
ReviewAgent(
name="安全专家",
role="安全风险评审",
system_prompt="""你是一位信息安全专家,专注于应用安全和基础设施安全。
你擅长发现潜在的安全漏洞、数据泄露风险和权限问题。
你的评审风格: 从攻击者视角思考,找出最薄弱的环节。""",
review_dimensions=[
"认证和授权机制",
"数据安全(传输和存储)",
"输入验证和注入防护",
"敏感信息保护",
"第三方依赖的安全性"
]
),
ReviewAgent(
name="性能专家",
role="性能瓶颈评审",
system_prompt="""你是一位性能工程专家,专注于高并发系统的性能优化。
你擅长识别性能瓶颈、评估系统容量和优化方案。
你的评审风格: 用数据说话,关注P99延迟和吞吐量。""",
review_dimensions=[
"是否存在性能瓶颈",
"数据库查询效率",
"缓存策略是否合理",
"并发处理能力",
"资源使用效率"
]
),
]
def review(self, proposal: str, parallel: bool = True) -> dict:
"""执行评审(支持并行)"""
print(f"📋 开始评审,共 {len(self.reviewers)} 位评审专家")
print(f" 并行模式: {'是' if parallel else '否'}")
reviews = []
if parallel:
# 并行执行所有评审
with ThreadPoolExecutor(max_workers=len(self.reviewers)) as executor:
futures = {
executor.submit(reviewer.review, proposal): reviewer
for reviewer in self.reviewers
}
for future in as_completed(futures):
reviewer = futures[future]
result = future.result()
reviews.append(result)
print(f" ✅ {reviewer.name} 评审完成 (评分: {result.get('score', '?')}/10)")
else:
# 串行执行
for reviewer in self.reviewers:
print(f" → {reviewer.name} 正在评审...")
result = reviewer.review(proposal)
reviews.append(result)
print(f" ✅ {reviewer.name} 评审完成 (评分: {result.get('score', '?')}/10)")
# 汇总评审结果
print(f"\n📊 汇总评审结果...")
summary = self._synthesize(proposal, reviews)
return {
"individual_reviews": reviews,
"summary": summary,
"timestamp": datetime.now().isoformat()
}
def _synthesize(self, proposal: str, reviews: list[dict]) -> dict:
"""汇总所有评审意见"""
reviews_text = ""
for r in reviews:
reviews_text += f"\n--- {r['reviewer']}({r['role']}) 评分:{r.get('score','?')}/10 ---\n"
reviews_text += f"总结: {r.get('summary', '')}\n"
if r.get('issues'):
reviews_text += "问题:\n"
for issue in r['issues']:
reviews_text += f" [{issue.get('severity','')}] {issue.get('description','')}\n"
if r.get('highlights'):
reviews_text += f"亮点: {', '.join(r.get('highlights', []))}\n"
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": f"""请汇总以下多位专家的评审意见,生成最终评审报告:
技术方案:
{proposal[:500]}
各专家评审:
{reviews_text}
输出JSON格式:
{{
"overall_score": 综合评分(1-10),
"verdict": "通过/有条件通过/需要修改/不通过",
"key_risks": ["最关键的风险1", "风险2"],
"must_fix": ["必须修改的问题1", "问题2"],
"nice_to_have": ["建议优化的点1", "点2"],
"final_comment": "给方案作者的综合建议(2-3句话)"
}}"""
}],
response_format={"type": "json_object"},
temperature=0.3
)
try:
return json.loads(response.choices[0].message.content)
except:
return {"overall_score": 5, "verdict": "需要修改", "final_comment": "汇总过程出错"}
# ═══════════════════════════════════════════════════════════════════
# Part 3: 使用示例
# ═══════════════════════════════════════════════════════════════════
if __name__ == "__main__":
team = ReviewTeam()
proposal = """
技术方案: 订单服务重构
1. 架构: 从单体拆分为微服务,使用gRPC通信
2. 数据库: 从MySQL迁移到PostgreSQL,引入读写分离
3. 缓存: 使用Redis缓存热点订单数据,TTL=5分钟
4. 消息队列: 引入Kafka处理异步任务(发送通知、更新统计)
5. API网关: 使用Kong作为API网关,统一认证和限流
6. 部署: Kubernetes部署,HPA自动扩缩容
"""
result = team.review(proposal, parallel=True)
print("\n" + "="*60)
print("📝 最终评审报告")
print("="*60)
summary = result["summary"]
print(f"\n综合评分: {summary.get('overall_score', '?')}/10")
print(f"评审结论: {summary.get('verdict', '?')}")
print(f"\n关键风险:")
for risk in summary.get('key_risks', []):
print(f" ⚠️ {risk}")
print(f"\n必须修改:")
for fix in summary.get('must_fix', []):
print(f" 🔴 {fix}")
print(f"\n建议优化:")
for nice in summary.get('nice_to_have', []):
print(f" 🟡 {nice}")
print(f"\n综合建议: {summary.get('final_comment', '')}")
九、工程最佳实践
9.1 设计原则
原则1: 最小Agent数量
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 用最少的Agent完成任务
❌ 为了"看起来高级"而增加Agent
经验法则:
- 3-5个Agent是最佳数量
- 超过7个Agent就要考虑是否过度设计
- 每增加一个Agent = 增加一倍的通信复杂度和Token成本
原则2: 角色互斥完备
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 每个Agent的职责不重叠(互斥)
✅ 所有Agent的职责加起来覆盖整个任务(完备)
❌ 两个Agent都能做同一件事(导致冲突或重复)
❌ 某些任务没有Agent负责(导致遗漏)
原则3: 明确的输入输出契约
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 每个Agent的输入格式和输出格式都明确定义
❌ Agent之间传递模糊的自然语言
好的做法:
Agent A输出: {"type": "research_report", "findings": [...], "confidence": 0.8}
Agent B期望输入: {"type": "research_report", ...}
→ 格式匹配,不会出错
坏的做法:
Agent A输出: "我研究了一下,发现..."
Agent B: "这是什么格式?我该怎么解析?"
原则4: 必须有收敛机制
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 设置最大轮数/最大步数
✅ 定义明确的终止条件
❌ 让Agent无限对话/无限转交
必须设置:
- max_rounds: 对话模式的最大轮数(建议3-5轮)
- max_handoffs: 群体模式的最大转交次数(建议3-5次)
- timeout: 整体超时时间(建议30-120秒)
原则5: 可观测性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 记录每个Agent的输入、输出、耗时
✅ 记录Agent之间的通信内容
✅ 记录整体执行路径
❌ 黑盒执行,出了问题不知道哪里错了
必须记录:
- 每个Agent被调用了几次
- 每次调用的Token消耗
- 执行路径(A→B→C还是A→C→B)
- 失败原因和重试次数
原则6: 优雅降级
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 某个Agent失败时,系统仍能给出部分结果
❌ 一个Agent失败导致整个系统崩溃
做法:
- 每个Agent的调用都有try-catch
- 失败时返回默认值或跳过该Agent
- 最终结果标注"哪些Agent未能完成"
9.2 常见陷阱
陷阱1: Agent数量膨胀
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
症状: "我们需要一个Agent做X,一个做Y,一个做Z..."
最终搞出10+个Agent,系统复杂度爆炸
原因: 把"功能"和"Agent"混淆了
不是每个功能都需要一个独立的Agent
解决:
- 一个Agent可以有多个工具(不需要每个工具一个Agent)
- 只有"需要不同角色/专业"时才拆分Agent
- 问自己: "这两个功能需要不同的System Prompt吗?"
如果不需要 → 合并为一个Agent
陷阱2: 通信爆炸
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
症状: Agent之间传递大量信息,Token消耗远超预期
5个Agent的系统,Token消耗是单Agent的10倍而非5倍
原因: 每个Agent都把完整的对话历史传给下一个Agent
信息在Agent之间"滚雪球"式膨胀
解决:
- Agent之间只传递"摘要"而非完整内容
- 使用结构化的输入输出格式(JSON而非自然语言)
- 设置每个Agent的上下文Token预算
陷阱3: 无限循环
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
症状: Agent A转交给B,B转交给C,C又转交回A...
或者: 对话模式中Agent永远达不成共识
原因: 缺乏收敛机制
解决:
- 设置max_rounds / max_handoffs
- 记录转交历史,禁止回到已经去过的Agent
- 设置全局timeout
- 有一个"兜底"机制(超时后强制结束并返回当前最佳结果)
陷阱4: 角色泄露
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
症状: Agent A的输出中包含了Agent B的System Prompt信息
或者Agent开始"扮演"其他Agent的角色
原因: 对话历史中包含了其他Agent的System Prompt
LLM被混淆了
解决:
- 每个Agent的调用都是独立的(不共享System Prompt)
- 对话历史中只包含"内容",不包含其他Agent的角色设定
- 使用独立的messages数组,而非共享一个
陷阱5: 成本失控
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
症状: 多Agent系统的API调用费用远超预期
原因:
- 每个Agent都用最贵的模型
- 对话轮数没有限制
- 没有Token预算管理
解决:
- 分级使用模型: 管理者用GPT-4o,工作Agent用GPT-4o-mini
- 设置每个Agent的Token预算
- 监控和告警: 单次请求超过X tokens时告警
- 简单任务不要用多Agent
9.3 成本优化策略
策略1: 模型分级
管理者/决策Agent: GPT-4o(需要强推理能力)
工作Agent: GPT-4o-mini(执行具体任务,够用就行)
简单判断: GPT-4o-mini 或更小的模型
策略2: 缓存
相同的输入 → 直接返回缓存结果
特别是"角色判断"类的调用(判断该转交给谁)
策略3: 并行执行
能并行的Agent同时执行 → 减少总耗时(虽然不减少Token)
用户体验更好
策略4: 早期终止
如果某个Agent的输出已经足够好 → 跳过后续Agent
不是每次都需要走完整个流程
策略5: 批量处理
多个小任务合并为一个大任务 → 减少Agent调用次数
十、总结与知识图谱
10.1 本课核心知识点
┌─────────────────────────────────────────────────────────────────────────┐
│ 多智能体系统 - 知识图谱 │
└─────────────────────────────────────────────────────────────────────────┘
多智能体系统
│
┌───────────────────┼───────────────────┐
│ │ │
为什么需要 架构模式 工程实践
│ │ │
┌─────┼─────┐ ┌──────┼──────┐ ┌────┼────┐
│ │ │ │ │ │ │ │ │
上下文 角色 串行 管理者 流水线 对话 设计 常见 成本
窗口 混淆 瓶颈 模式 模式 模式 原则 陷阱 优化
限制 群体模式 层级模式
┌───────────────────┼───────────────────┐
│ │ │
通信机制 协调机制 主流框架
│ │ │
┌─────┼─────┐ ┌──────┼──────┐ ┌────┼────┐
│ │ │ │ │ │ │ │ │
共享 消息 事件 中央 投票 辩论 CrewAI AutoGen LangGraph
状态 传递 驱动 调度 共识 机制 OpenAI SDK
黑板系统 市场机制 MetaGPT
10.2 与前后课程的关系
第14课 ReAct推理行动框架
→ 单Agent的推理-行动循环
→ 本课: 多个Agent各自有ReAct循环,通过协作完成更复杂的任务
第15课 MCP协议
→ Agent如何连接工具(Agent ←→ Tool)
→ 本课: Agent如何连接Agent(Agent ←→ Agent)
→ A2A协议是MCP在Agent间通信的对应物
第16课 Skill系统
→ 单Agent的能力扩展
→ 本课: 多Agent的能力组合(每个Agent加载不同Skill)
第17课 Agent记忆系统
→ 单Agent的记忆管理
→ 本课: 多Agent之间的记忆共享和隔离
下一课: Agent开发框架
→ 如何用具体框架实现本课讲的各种模式
→ LangGraph/CrewAI/AutoGen的深度实战
📝 作业
作业1:实现一个管理者模式的多Agent系统
用本课的OrchestratorAgent代码,实现一个"竞品分析"系统:
- Agent A: 负责收集竞品A的信息
- Agent B: 负责收集竞品B的信息
- Agent C: 负责对比分析
- 管理者: 分配任务并汇总
验证方法:输入"对比分析Cursor和Windsurf这两个AI编程工具",看系统是否能正确拆分、并行执行、汇总。
作业2:实现一个对话模式的代码审查系统
基于ConversationOrchestrator,实现:
- 开发者Agent写代码
- 审查者Agent审查
- 多轮迭代直到通过
验证方法:观察对话轮数是否在2-4轮内收敛,最终代码质量是否优于单Agent一次性生成。
作业3(进阶):实现一个混合模式系统
结合管理者模式和对话模式:
- 管理者拆分任务
- 子任务中的"写代码"部分用对话模式(写+审查)
- 其他子任务用单Agent直接执行
下一篇文章见:AI系列文章导航目录-持续更新中
更多推荐



所有评论(0)