作 者:吴佳浩(Alben)
公众号:全栈架构师笔记
系列专栏:《企业级 Agent 实战指南————Multi-Agent 架构设计:从单体 ReAct 到群智协同》· 第 01 篇
导读
给一个 Prompt 塞入 20 个工具、3 个角色的要求,模型就会在长程推理中彻底精神分裂;让 5 个专职 Agent 各司其职并通过协议协同通信,才是复杂工程任务的解法。
很多团队以为 Multi-Agent 就是建几个不同 System Prompt 的聊天机器人互相扯皮;但在严肃的企业生产环境中,无状态的群聊是性能与成本的灾难。
单体 Agent 的天花板在于注意力承载力与职责耦合,Multi-Agent 的本质是基于分布式软件工程原则解耦状态、工具与认知负荷。
在 Agent 落地初期,团队通常采用经典的 ReAct(Reasoning + Acting)单体架构:在一个无限循环中,让单个 Agent 既做架构分析、又写代码、又跑测试、又负责总结汇报。
这种单兵作战模式在处理 3 步以内的简单任务时很顺畅,但一旦面对跨模块重构、线上故障排查或复杂文档生成等长流程任务时,单体 Agent 会迅速撞上三堵坚硬的工程之墙:
| 绝境现象 | 具体翻车表现 | 架构根因 |
|---|---|---|
| 1. 认知负荷过载 | 既要规划又要执行细节,走着走着 | 单一 Context 混合了高层目标与 |
| (Cognitive Load) | 忘记了最原始的核心业务目标 | 底层工具执行细节,注意力严重稀释 |
| 2. 错误级联放大 | 前期步骤做出的一个微小误判,在 | 缺乏独立的评审与对立校验视角, |
| (Error Cascading) | 后续自循环中被自己不断确认固化 | 陷入自我循环论证的逻辑死锁 |
| 3. 上下文与成本雪崩 | 执行 15 轮之后,Prompt 膨胀至 | 无法对任务进行并行分发与子上下文 |
| (Context Blowup) | 数十万 Token,单次调用慢且昂贵 | 隔离,中间噪音无法物理清除 |
要突破单体 Agent 的认知天花板,系统架构必须从“单体巨石”演进为多智能体协同系统(Multi-Agent Systems, MAS)。
一、单体与多智能体的系统分水岭:康威定律在 AI 时代的体现
软件工程中的**康威定律(Conway's Law)**指出:系统的架构往往反映了设计该系统的组织的沟通结构。
在人类企业中,我们绝不会让同一个员工既当产品经理、又当主架构师、又当一线研发、又当 QA 测试负责人——因为角色之间存在天然的职责冲突与不同的关注点(Separation of Concerns):
| 架构维度 | 单体 ReAct Agent | Multi-Agent 系统 |
|---|---|---|
| 角色模型 | 全能通才 (Jack of all trades) | 专业专家组合 (Specialized Swarm |
| Context 隔离度 | 单一全局共享 Context (极易污染) | 分布式隔离 Context (高信噪比) |
| 工具分配策略 | 单个 Prompt 挂载全部 20+ Tools | 每个 Agent 按需挂载 2~3 个专属 |
| 执行并发模型 | 纯串行阻塞自循环 | 独立子代理并行执行 (Fan-out) |
| 纠错与防幻觉机制 | 自己检查自己 (极易产生确认偏误) | 对抗性独立 Agent 交叉审核验收 |
- 🔸 职责解耦:每个 Agent 拥有极其聚焦的 System Prompt 和极其精简的专属 Toolset(如 Coder 只有代码修改工具,QA 只有测试执行工具);
- 🔸 上下文物理隔离:Subagent 在自己的独立沙箱和独立会话中工作,其探索过程中的中间报错、调试日志不会污染主 Agent 的全局规划;
- 🔸 引入对抗与校验视角:由独立的 QA / Reviewer Agent 站在客观对立面进行验收,打破单体 Agent 的自我幻觉闭环。
一句话总结这一章的核心观点:
Multi-Agent 的本质,是用分布式软件工程的解耦思想,解决大模型在长程推理中的注意力与认知过载问题。
二、Multi-Agent 四大主流协作拓扑架构
在设计多智能体系统时,必须根据业务任务的确定性与发散性选择合适的协作拓扑:
<span>1.</span> 层次主从模式 (Supervisor / Hierarchical) ──► 适用于明确目标、自顶向下拆解的任务
<span> (如企业研发重构、全自动化报告生成)
</span>
<span>2.</span> 顺序流水线模式 (Sequential Pipeline) ──► 适用于确定性的多阶段 SOP 流程
<span> (如需求澄清 -> 架构设计 -> 编码 -> 测试)
</span>
<span>3.</span> 共享黑板模式 (Blackboard / Shared State) ──► 适用于高并发、多专家异步协作场景
<span> (如多 Agent 协同排查复杂系统告警)
</span>
<span>4.</span> 对等自治网络模式 (Peer-to-Peer Swarm) ──► 适用于开放式发散探索与头脑风暴
<span> (如多视角辩论、复杂博弈模拟)
</span>
- 🔸 企业生产首选:层次主从(Hierarchical) 与 共享黑板(Blackboard)。因为企业任务追求结果的确定性与执行的可控性,必须有明确的 Leader 掌控全局状态;
- 🔸 警惕无控群聊:严禁在生产中使用没有主控路由的纯自由群聊(Free Chat Swarm),否则 Agent 之间会陷入无限互相客套与死循环对话。
一句话总结这一章的核心观点:
拓扑决定系统上限。没有层级与路由控制的多 Agent,就是一群失控的自嗨机器人。
三、生产级代码实战:手写轻量级 Multi-Agent 分发调度引擎
以下为基于 Python 3.11+ 构建的极简轻量级 Multi-Agent 主从分发调度系统(不依赖任何第三方重型框架,支持并行子任务派发与独立上下文隔离):
<span>"""
multi_agent_orchestrator.py
生产级轻量 Multi-Agent 编排引擎
包含:
- Leader Agent 任务规划
- SubAgent 独立上下文隔离
- 并行任务调度
- 结果聚合(Fan-out / Fan-in)
"""</span>
<span>import</span> asyncio
<span>from</span> typing <span>import</span> <span>Any</span>, <span>Dict</span>, <span>List</span>, <span>Optional</span>
<span>from</span> pydantic <span>import</span> BaseModel
<span># ============================================================</span>
<span># Task 数据模型</span>
<span># ============================================================</span>
<span>class</span> <span>SubTask</span>(<span>BaseModel</span>):
<span>"""Leader 拆解后的子任务"""</span>
task_id: <span>str</span>
assigned_role: <span>str</span>
goal: <span>str</span>
context: <span>str</span>
<span>class</span> <span>SubAgentResult</span>(<span>BaseModel</span>):
<span>"""子代理执行结果"""</span>
task_id: <span>str</span>
status: <span>str</span>
output: <span>str</span>
<span># ============================================================</span>
<span># SubAgent</span>
<span># ============================================================</span>
<span>class</span> <span>SubagentWorker</span>:
<span>"""
具备独立上下文与独立 Toolset 的轻量子代理
每个 SubAgent 拥有:
- 独立 System Prompt
- 独立 Message History
- 独立 Tool 集
"""</span>
<span>def</span> <span>__init__</span>(<span>
self,
role: <span>str</span>,
system_prompt: <span>str</span>,
tools: <span>Optional</span>[<span>Dict</span>[<span>str</span>, <span>Any</span>]] = <span>None</span>,
</span>):
self.role = role
self.system_prompt = system_prompt
self.tools = tools <span>or</span> {}
<span>async</span> <span>def</span> <span>execute_task</span>(<span>
self,
task: SubTask,
</span>) -> SubAgentResult:
<span>"""
在完全隔离的上下文中执行任务
每个 SubAgent 都拥有自己的上下文,
不共享 Message History。
"""</span>
<span># ----------------------------------------------------</span>
<span># 独立上下文</span>
<span># ----------------------------------------------------</span>
isolated_messages = [
{
<span>"role"</span>: <span>"system"</span>,
<span>"content"</span>: self.system_prompt,
},
{
<span>"role"</span>: <span>"user"</span>,
<span>"content"</span>: (
<span>f"Task Goal: <span>{task.goal}</span>\n"</span>
<span>f"Context: <span>{task.context}</span>"</span>
),
},
]
<span># 避免示例中变量未使用</span>
_ = isolated_messages
<span># ----------------------------------------------------</span>
<span># 模拟 LLM 推理</span>
<span># ----------------------------------------------------</span>
<span>await</span> asyncio.sleep(<span>0.5</span>)
result = (
<span>f"[<span>{self.role}</span>] "</span>
<span>f"Completed task '<span>{task.task_id}</span>': "</span>
<span>"verified and generated artifacts."</span>
)
<span>return</span> SubAgentResult(
task_id=task.task_id,
status=<span>"success"</span>,
output=result,
)
<span># ============================================================</span>
<span># Leader Agent</span>
<span># ============================================================</span>
<span>class</span> <span>LeaderAgentOrchestrator</span>:
<span>"""
Multi-Agent 主控调度器
工作流程:
User Goal
│
▼
Leader Planning
│
▼
Task Decomposition
│
┌──────┴──────┐
▼ ▼
Coder QA Agent
▼ ▼
└──────┬──────┘
▼
Result Aggregation
▼
Final Deliverable
"""</span>
<span>def</span> <span>__init__</span>(<span>self</span>):
self.workers: <span>Dict</span>[<span>str</span>, SubagentWorker] = {
<span>"coder"</span>: SubagentWorker(
role=<span>"Coder"</span>,
system_prompt=(
<span>"You are an expert Python backend engineer. "</span>
<span>"Focus strictly on code writing."</span>
),
),
<span>"qa"</span>: SubagentWorker(
role=<span>"QA"</span>,
system_prompt=(
<span>"You are a strict QA test engineer. "</span>
<span>"Focus on pytest edge cases and verification."</span>
),
),
}
<span>async</span> <span>def</span> <span>plan_and_dispatch</span>(<span>
self,
user_goal: <span>str</span>,
</span>) -> <span>str</span>:
<span>"""
Leader Agent 执行流程
1. 拆解任务
2. 分配 Agent
3. 并行执行
4. 聚合结果
"""</span>
<span>print</span>(<span>f"🎯 [Leader] Planning goal:\n<span>{user_goal}</span>\n"</span>)
<span># ----------------------------------------------------</span>
<span># Step 1:任务拆解</span>
<span># ----------------------------------------------------</span>
subtasks = [
SubTask(
task_id=<span>"task_1"</span>,
assigned_role=<span>"coder"</span>,
goal=<span>"Implement JWT authentication logic"</span>,
context=<span>"Using PyJWT"</span>,
),
SubTask(
task_id=<span>"task_2"</span>,
assigned_role=<span>"qa"</span>,
goal=<span>"Write pytest test cases for JWT expired tokens"</span>,
context=<span>"Coverage > 95%"</span>,
),
]
<span>print</span>(
<span>f"📋 [Leader] "</span>
<span>f"Decomposed into <span>{<span>len</span>(subtasks)}</span> subtasks.\n"</span>
)
<span># ----------------------------------------------------</span>
<span># Step 2:Fan-out</span>
<span># ----------------------------------------------------</span>
async_tasks = []
<span>for</span> task <span>in</span> subtasks:
worker = self.workers.get(task.assigned_role)
<span>if</span> worker <span>is</span> <span>None</span>:
<span>continue</span>
<span>print</span>(
<span>f"🚀 Launching "</span>
<span>f"[<span>{task.assigned_role}</span>] "</span>
<span>f"for <span>{task.task_id}</span>"</span>
)
async_tasks.append(worker.execute_task(task))
<span># ----------------------------------------------------</span>
<span># Step 3:并行执行</span>
<span># ----------------------------------------------------</span>
results: <span>List</span>[SubAgentResult] = <span>await</span> asyncio.gather(
*async_tasks
)
<span># ----------------------------------------------------</span>
<span># Step 4:Fan-in 聚合</span>
<span># ----------------------------------------------------</span>
summary = [
<span>"🎉 [Leader] All subagents finished."</span>,
<span>""</span>,
<span>"Aggregated Deliverable:"</span>,
]
<span>for</span> result <span>in</span> results:
summary.append(
<span>f"- <span>{result.task_id}</span> "</span>
<span>f"(<span>{result.status}</span>)"</span>
)
summary.append(<span>f" <span>{result.output}</span>"</span>)
final_report = <span>"\n"</span>.join(summary)
<span>print</span>(final_report)
<span>return</span> final_report
本篇总结
- 🔸 单体 ReAct Agent 存在天然的认知过载与上下文爆炸瓶颈;
- 🔸 Multi-Agent 的核心价值在于职责解耦、上下文物理隔离与对抗校验;
- 🔸 企业生产优先选择层次主从(Hierarchical)与共享黑板(Blackboard)拓扑;
- 🔸 主 Agent 负责全局规划,Subagent 负责隔离执行并集中汇总交付。
理解了多智能体的设计动因后,下一个关键问题是:多 Agent 之间如何定义统一的通信消息格式?如何用 DAG(有向无环图)编排复杂的跨代理工作流?
筒子们本篇为《企业级 Agent 实战指南》· 第三章的第 1 篇,后续续会更新完整的agent的开发的全部过程,如果你对Agent开发感兴趣不妨关注一下本合集。
在下一篇中,我们将深入解构:《Multi-Agent 通信协议与编排中枢:状态机、DAG 与事件总线》!
清晰拆解了单体 Agent 的工程瓶颈,并给出可落地的多智能体协作拓扑与调度思路。适合正从 ReAct 原型迈向企业级 Agent 平台的架构师与研发团队参考。