层级模式:Manager → Worker 树状结构
概念速查
层级模式(Hierarchical Agent Pattern)将多个 Agent 组织成树状结构。核心角色只有两个:
- Manager Agent:接收顶层任务,拆解为子任务,分配给 Worker,汇总结果
- Worker Agent:执行具体子任务,可向下递归成为下一级 Manager
每个 Manager 管一组 Worker,Worker 可以再拥有自己的 Worker,形成递归树。常见的工程实现包括 AutoGen 的 GroupChat 与 Orchestrator 模式、CrewAI 的 HierarchicalProcess、LangGraph 的 StateGraph 控制流、以及 Anthropic 提到的 " Supervisor" 模式。
决策规则简单:任务可并行 → 分给多个 Worker;任务需要分工 → 按角色分配;任务超出当前粒度 → Worker 升级为 Manager 递归分解。叶子节点总是执行 Agent,内部节点总是协调 Agent。根 Manager 对用户负责。
底层原理
层级模式的核心机制是任务分解-分配-聚合的三段式循环。Manager 维护一个任务队列和一组 Worker 状态,工作流如下:
- Plan:Manager 将输入任务拆解为更小的子任务单元
- Assign:根据 Worker 的能力标签或角色定义,将子任务分配给合适的 Worker
- Execute:Worker 执行任务,如果子任务仍然复杂则递归进入下一层
- Aggregate:Manager 收集所有 Worker 的输出,做冲突消解和结果合并
- Feedback:Manager 对 Worker 的输出做质量检查,不合格则回退重做
通信模式有两种变体。同步模式中 Manager 等待所有 Worker 完成后再聚合,适合结果需要全局一致性的场景(如代码审查合并)。异步模式中 Worker 独立推进,Manager 通过事件驱动收集部分结果,适合流式处理或长尾任务。
状态管理上,Manager 需要维护一个 DAG 依赖图,标记哪些子任务可以并行、哪些必须串行。这是层级模式区别于简单扇出的关键——Worker 之间可能有数据依赖,Manager 必须按拓扑序调度。
架构设计原则
原则一:扇出系数有上限。 一个 Manager 直接管理的 Worker 建议 3–7 个。超过这个范围,Manager 的上下文窗口会被 Worker 状态占满,丧失全局判断能力。超限时应增加中间层,而不是扩大扇出。
原则二:Worker 无状态化。 Worker 不应维护跨任务的状态。所有共享状态由 Manager 传递或依赖外部存储(数据库、缓存)。这使得 Worker 可被复用、替换、水平扩展,也简化了重试和回滚。
原则三:结果聚合必须做冲突消解。 当多个 Worker 返回矛盾结果时,Manager 需要有明确的消解策略:投票、优先级、置信度评分、或回退到更保守的结果。缺少消解策略的层级模式会在聚合层产生不可预测的输出。
原则四:递归深度不超过 3 层。 层级模式的优势在于结构化分解,但每深一层就引入一次 Manager 的推理开销和延迟。超过 3 层的树在实践中通信损耗超过收益,应通过扁平化或事件总线重构。
# Python 3.11+
from dataclasses import dataclass, field
from typing import Any, Callable
@dataclass
class AgentContext:
role: str
capabilities: list[str]
max_workers: int = 5
class WorkerAgent:
def __init__(self, context: AgentContext, name: str = ""):
self.ctx = context
self.name = name or context.role
def execute(self, task: dict) -> dict:
return {"status": "ok", "data": f"executed by {self.name}", "error": None}
class ManagerAgent:
def __init__(self, context: AgentContext, worker_factory: Callable):
self.ctx = context
self.workers: list[WorkerAgent] = []
def assign(self, task: dict) -> list[dict]:
subtasks = self._decompose(task)
self.workers = [WorkerAgent(self.ctx) for _ in subtasks]
results = []
for worker, sub in zip(self.workers, subtasks):
results.append(worker.execute(sub))
return self._aggregate(results)
def _decompose(self, task: dict) -> list[dict]:
return task.get("subtasks", [task])
def _aggregate(self, results: list[dict]) -> list[dict]:
return results
原则五:Manager 与 Worker 通信协议固定。 输入输出格式必须在层间保持一致,否则每一层都需要做格式转换适配。统一用 {"status", "data", "error"} 包裹,叶子层和非叶子层共享同一契约。
原则六:任务超时和降级。 每个子任务必须带上 TTL。Worker 超时后 Manager 执行降级策略:重试、跳过、或使用默认值。没有超时机制的层级模式会在一个慢 Worker 上卡死整个树。
层级模式适合复杂任务的结构化分解,也适合需要角色分工的多步骤工作流。代价是 Manager 成为通信瓶颈和单点故障,实践中应配合持久化队列和 Manager 冗余来缓解。
826



被折叠的 条评论
为什么被折叠?



