规划与任务分解
Agent 面对复杂目标时,无法一步到位,需要先把目标拆解成可执行的子任务序列,再逐步执行。规划能力决定了 Agent 能处理多复杂的现实问题。
规划方式对比
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 零样本规划 | 直接让 LLM 输出计划列表 | 简单,无需示例 | 容易遗漏步骤,顺序错误 |
| CoT 规划 | 逐步推理后给出计划 | 更细致,中间步骤可检查 | token 消耗大 |
| 反应式(ReAct) | 边执行边规划,随结果调整 | 灵活,适应动态环境 | 可能陷入局部循环 |
| 分层规划 | 高层目标 → 子任务 → 原子操作 | 结构清晰,可并行 | 层间依赖复杂 |
| 树搜索(ToT/MCTS) | 多分支展开,评估后剪枝 | 全局最优,可回溯 | 计算开销大 |
任务分解策略
顺序分解
目标:写一篇技术博客
→ 1. 确定主题和受众
→ 2. 搜索相关资料
→ 3. 整理大纲
→ 4. 逐节撰写
→ 5. 修改润色
→ 6. 发布适用:步骤有先后依赖,无法并行
并行分解
目标:分析竞品
→ 并行:
├── 分析产品 A(研究员 1)
├── 分析产品 B(研究员 2)
└── 分析产品 C(研究员 3)
→ 汇总:整合报告适用:子任务相互独立,多 Agent 并发执行
条件分解
目标:修复 Bug
→ 复现问题
→ if 能复现:
→ 定位根因 → 修复 → 验证
else:
→ 收集更多日志 → 重新分析适用:依赖运行时信息做决策
常见规划 Prompt 模板
你是一个任务规划专家。用户的目标是:{goal}
请:
1. 将目标分解为 3-7 个可执行的具体子任务
2. 每个子任务说明:做什么、需要什么工具、输出什么
3. 标明各任务间的依赖关系
4. 对可并行的任务打上 [parallel] 标记
输出 JSON 格式:
{
"tasks": [
{"id": 1, "name": "...", "tool": "...", "output": "...", "depends_on": []}
]
}
规划失效场景与对策
| 失效原因 | 表现 | 对策 |
|---|---|---|
| 目标模糊 | 计划宽泛无法执行 | 先澄清目标,加 clarification 步骤 |
| 世界模型缺失 | 计划在实际环境中不可行 | 用真实工具探测环境再规划 |
| 步骤依赖错误 | 步骤 2 依赖步骤 3 的输出 | 让模型显式声明依赖关系 |
| 计划僵化 | 执行失败后不重规划 | 加入反思循环,失败时触发重规划 |
| 无限递归 | 子任务又被分解为同一问题 | 设置分解深度上限(max_depth) |
实现模式
Plan-and-Execute
plan = llm.plan(goal) # 一次性生成全部计划
for step in plan.steps:
result = agent.execute(step)
if result.failed:
plan = llm.replan(goal, executed=done, failure=result)LangGraph 状态机规划
# 节点:planner → executor → reflector → (继续/结束)
graph.add_node("planner", plan_fn)
graph.add_node("executor", execute_fn)
graph.add_node("reflector", reflect_fn)
graph.add_conditional_edges("reflector", should_continue)