如何设计 Agent 间的任务分配与协调?
难度:中级 分类:Multi-Agent
简短回答
多 Agent 任务分配与协调的核心挑战是:如何将复杂任务拆分为子任务、分配给合适的 Agent、并确保它们协同工作产出正确结果。主要策略包括:集中式规划-分散执行(中央规划器分解任务,Agent 独立执行)、LLM 作为协调器(利用 LLM 推理能力做动态任务分配)、角色定义 + 能力匹配(根据 Agent 能力描述自动路由)、动态分配(基于运行时状态自适应调整)。关键设计原则:明确定义每个 Agent 的角色和能力边界、选择匹配任务结构的通信模式、以及实现健壮的错误处理和降级机制。
详细解析
任务分配的基本流程

任务分配四段流水线:分解 → 分配 → 协调执行 → 聚合,每段解决一个协作问题。
策略 1:集中式规划,分散执行
代码块
Python
class CentralPlanner:
"""中央规划器负责全局任务分解和分配"""
def __init__(self, agents: dict[str, Agent]):
self.agents = agents
async def plan_and_execute(self, task: str):
# Step 1: LLM 分解任务为子任务
subtasks = await self.decompose(task)
# Step 2: 根据 Agent 能力分配子任务
assignments = self.assign(subtasks)
# Step 3: 按依赖关系编排执行
results = {}
for batch in self.topological_sort(assignments):
策略 2:LLM 作为协调器
利用 LLM 的推理能力做动态决策:
代码块
Python
class LLMCoordinator:
async def coordinate(self, task, agents):
# 给 LLM 提供所有 Agent 的能力描述
agent_descriptions = "\n".join([
f"- {a.name}: {a.description}, 擅长: {a.capabilities}"
for a in agents
])
plan = await self.llm.generate(f"""
任务: {task}
可用 Agent:
{agent_descriptions}
请分解任务并分配给合适的 Agent。
输出格式:
Planner vs Orchestrator: 研究发现 Planner 方法(先生成完整计划再执行)在处理并发操作时优于 Orchestrator 方法(逐步决策),因为 Planner 能更好地识别可并行的子任务。
策略 3:角色定义与能力匹配
代码块
Python
策略 4:动态分配(DRAMA 方法)
静态分配的局限:Agent 能力固定、任务分配策略不适应环境变化。
代码块
Python
class DynamicAllocator:
"""基于亲和度的事件驱动动态分配"""
def __init__(self, agents):
self.agents = agents
self.affinity_scores = {} # (agent, task_type) → 历史成功率
async def allocate(self, subtask):
# 考虑多个因素动态选择
candidates = []
for agent in self.agents:
score = self.compute_score(agent, subtask)
candidates.append((agent, score))
协调的关键挑战
依赖管理
代码块
Python
# 用 DAG(有向无环图)表示任务依赖
task_graph = {
"search": {"depends_on": []},
"analyze": {"depends_on": ["search"]},
"visualize": {"depends_on": ["search"]}, # 和 analyze 并行
"report": {"depends_on": ["analyze", "visualize"]}, # 等两者完成
}
# 拓扑排序确定执行顺序
# Batch 1: search(无依赖)
# Batch 2: analyze, visualize(并行)
# Batch 3: report(等待前两个)
Token 冗余控制
研究显示多 Agent 框架中 token 重复率达 53-86%。解决方案:
代码块
Python
# 传递摘要而非完整输出
def compress_for_handoff(agent_output: str, max_tokens: int = 500):
if count_tokens(agent_output) > max_tokens:
return summarize(agent_output, max_tokens=max_tokens)
return agent_output
失败处理
代码块
Python
class ResilientCoordinator:
async def execute_with_fallback(self, subtask, primary_agent, backup_agent):
try:
return await asyncio.wait_for(
primary_agent.execute(subtask),
timeout=30
)
except (TimeoutError, AgentError):
设计原则总结
常见误区 / 面试追问
误区:"Agent 越多越好" — 每增加一个 Agent 都增加通信开销和协调复杂度。最佳实践是从一个 Agent 开始,当遇到明确瓶颈时才拆分。研究建议初始阶段限制在 3-5 个 Agent。
误区:"用 LLM 做所有协调决策" — LLM 协调灵活但慢且贵。对于确定性的任务路由,用代码规则更可靠。混合方式最佳:简单路由用代码,复杂判断用 LLM。
追问:"如何处理 Agent 间的目标冲突?" — 明确优先级规则(如安全 > 效率 > 成本);引入仲裁 Agent 或投票机制;将冲突升级给人类决策者。系统性的目标/结论冲突解决机制详见第 035 题《多 Agent 系统中的冲突解决机制》。
追问:"分布式 Agent 系统如何保证一致性?" — 对于非关键系统,接受最终一致性即可。对于关键操作(如金融交易),使用事务性协调:先锁定资源 → 执行操作 → 确认或回滚。