课题六:复杂任务规划与动态分解
Layer 1 | 基础设施层 | P1 调研日期:2026-05-30
问题定义
当前 GenericAgent 的 agent_loop.py(118行)基于纯 ReAct 循环,每轮只从 LLM 获取下一步 tool call,没有任何预先规划能力。
当前模式(ReAct):
观察当前状态 → LLM决定下一步 → 执行 → 观察新状态 → LLM决定下一步 → ...
从”问答工具”到”自主执行者”,规划是关键的跨越。没有规划,Agent 只能做简单的工具串联;有规划,才能处理多步骤、有依赖、有分支的复杂任务。
项目已有规划能力
memory/plan_sop.md(262行)已实现元层次的规划流程——探索→规划→执行→验证,包含子任务委托([D])、并行([P])、条件分支([?])、对抗性验证等。但这是Agent编排层的SOP,不是LLM推理层的规划能力。两者可串联:plan_sop.md 管理”如何规划”的流程,LLM 层规划决定”规划什么”。
三大规划范式对比
Plan-then-Execute(一次性规划)
| 维度 | 描述 |
|---|---|
| 核心 | 执行前完整规划,然后按计划执行 |
| 代表 | Plan-and-Solve, ReWOO, LLM+P |
| 优点 | 全局可见性、易于优化执行顺序 |
| 缺点 | 无法应对执行中意外 |
| 适用 | 目标明确、环境稳定的任务 |
在项目中的可行性: plan_sop.md 的规划态本就是 Plan-then-Execute。增强方向是让 LLM 自动生成 plan.md,并自动跟踪执行进度。
RePlan(渐进式重规划)
| 维度 | 描述 |
|---|---|
| 核心 | 分段规划→执行→观察→重规划下一段 |
| 代表 | ReAct→RePlan, SayCan, SwiftSage |
| 优点 | 灵活适应变化 |
| 缺点 | 可能局部最优 |
| 适用 | 环境动态的任务 |
在项目中的可行性: agent_loop.py 的 tool_after_callback / turn_end_callback 钩子天然支持注入重规划判断。触发条件包括:执行失败、中间结果不符预期、用户打断。
Hierarchical Planning(层次规划)
| 维度 | 描述 |
|---|---|
| 核心 | 高层策略→中层子任务→底层动作,每层独立重规划 |
| 代表 | HiAgent, HTN, Voyager |
| 优点 | 复杂任务可管理 |
| 缺点 | 层级接口设计困难 |
| 适用 | 超长任务链、多 Agent |
在项目中的对应关系:
抽象层(LLM推理层) ← 空缺
└─ 策略规划:分解用户目标
执行层(plan_sop.md) ← 已有
└─ 任务编排 + 委托 + 验证
动作层(9个原子工具) ← 已有
└─ 具体工具调用
项目现状深度评估
已有能力
- ✅ plan_sop.md — 完整执行流程(探索→规划→执行→验证)
- ✅ [D] 委托标注 — 子任务派给 subagent
- ✅ [P] 并行标注 / [?] 条件分支
- ✅ VERIFY subagent — 独立对抗性验证
- ✅ 失败重试 — 最多3次指数退避
- ✅ agent_loop.py 的钩子系统
空缺
- ❌ 自动生成 plan — 当前需手动写 plan.md
- ❌ 自动推断依赖 — 需手动标注 [P]/[?]/依赖
- ❌ 执行中重规划 — 失败时只能重试不能调整后续计划
- ❌ 规划粒度自适应 — 简单/复杂任务用同一套流程
- ❌ 执行前验证 — 写 plan.md 后无自动检查
- ❌ 备选路径 — 无预定义 fallback
推荐演进路线
Phase 1 — 自动规划生成(Plan-then-Execute)
- agent_loop.py 增加 PLAN 阶段 prompt,LLM 输出结构化 plan
- 自动转为 plan_sop.md 格式 → plan.md
- 复用现有执行流程
- 工作量:~200行代码
Phase 2 — 执行中重规划(RePlan)
- tool_after_callback 增加失败检测 → 触发 replan
- turn_end_callback 增加重规划判断
- 工作量:~150行代码
Phase 3 — 层次规划 + 粒度自适应
- LLM 输出分层:子目标分解 → 独立执行
- 粒度自适应:根据任务特征选择规划深度
- 备选路径预定义
- 工作量:~300行代码
扩展方向
规划漂移(Planning Drift)
问题: Agent 执行长任务时,逐步偏离原始目标。不是突然失败,而是每一步微小偏移累积成方向性错误。
原始目标:"分析用户反馈数据,输出 Top 5 改进方向"
Step 1: ✅ 读取数据 → 正确
Step 2: ✅ 清洗、分类 → 正确
Step 3: ⚠️ 发现某个分类特别多 → 开始深入这个分类
Step 4: ❌ 深入分析单个分类的细节 → 偏离了"Top 5 改进方向"
Step 5: ❌ 写了这个分类的完整分析报告 → 完全偏离原始目标
关键特征:
- 每步单独看都是合理的(模型没有”犯错”)
- 偏离是累积的,没有单点回退触发点
- 任务越长、中间结果越丰富,漂移概率越高
可能的应对策略:
- 规划锚点:每步检查当前进度是否与原始规划一致,偏离超过阈值则回退
- milestone 验证:关键节点要求 LLM 判断”当前仍在原规划路径上吗”
- 反向对齐:每 N 步让 LLM 从当前状态反向推导”这和我最初要做的还是一件事吗”
- PlanB marker:标记规划中的关键决策点,一旦路径偏离则触发 replan 而非继续纠偏
错误传播
问题: 规划中某一步的轻微错误不是被纠正,而是被后续步骤放大。不同于漂移(方向偏移),传播是错误结果的级联。
正确路径: A → B → C → D
错误路径: A → B'(B 执行轻微错误)→ C'(C 基于 B' 继续错)→ D'(最终结果完全错误)
关键特征:
- 早期错误不可见(每步输出格式正确、内容合理)
- 后续步骤无法检测上游错误(模型假设上游是正确的)
- 验证点在终点才知道错了——代价最大
可能的应对策略:
- 检查点验证:每步输出做快速合理性检查(不依赖 LLM,用规则/工具验证)
- 前向验证:某步输出异常时,不仅检查当前步,还反向检查上一步的输入前提
- 隔离执行:关键路径的子任务在独立上下文中执行,错误不污染主上下文
规划漂移 vs 错误传播
两者经常同时发生:漂移导致方向偏了,错误传播让偏了的方向上越走越远。应对的核心机制相同——增加验证检查点,但阶段不同:
| 阶段 | 漂移 | 传播 |
|---|---|---|
| 发生原因 | 注意力偏移 | 错误级联 |
| 检测时机 | 方向性 check(每 N 步) | 正确性 check(每步) |
| 恢复方式 | replan 回正确方向 | 回退到错误前的状态重试 |
| 代价 | 通常可恢复 | 越晚代价越大 |
经典理论映射
人月神话的串行依赖不可压缩性解释了规划的根本困境:有些子任务必须顺序完成,你无法通过”增加 Agent 并行度”来加速。这与 Hofstadter 定律共同作用——“它总是比你预期的时间长,就算你考虑了 Hofstadter 定律”——意味着 Agent 的时间预估在本质上存在系统性偏差。规划系统需要具备时间缓冲和动态调整能力,而非追求精确预估。
钱学森工程控制论(1954)对 Plan-then-Execute 与 RePlan 的区分提供了理论根基:前者是开环控制(前馈路径,无反馈修正),后者是闭环控制(反馈路径,基于观测修正)。开环控制结构简单但无抗干扰能力,闭环控制增加复杂度但能收敛到目标。工程控制论的核心洞见在于——反馈是克服不确定性的唯一通用方法。Agent 规划中遇到的执行偏差、环境变化、上下文漂移,本质都是不确定性,只能通过建立有效的反馈回路来解决,不能靠更精确的前馈规划。使用反馈不是对规划失败的补救,而是解决”有限信息下行动”这个根本问题的唯一工程途径。
关联课题
- agent-collaboration-communication — 多Agent需要分布式规划
- agent-evaluation-framework — 规划质量评估维度
- agent-explainability-debugging — 规划过程可解释
参考资料
- Plan-and-Solve Prompting (Wang et al., 2023)
- Tree-of-Thought (Yao et al., 2023)
- LLM+P: Empowering LLMs with Optimal Planning (2023)
- ReWOO: Decoupling Reasoning from Observations (2023)
- Voyager: LLM-powered Agents in Minecraft (2023)
- SayCan: Do As I Can, Not As I Say (2023)
- SwiftSage: Fast-Thinking + Slow-Thinking (2023)
- HiAgent 层次分解框架
- LangGraph — 图式任务编排,条件边+检查点
- OpenHands — 规划-执行闭环 + 对抗性验证(72K★)
- HTN (Hierarchical Task Network) — 机器人领域层次规划
- plan_sop.md — GenericAgent 项目现有 SOP(memory/plan_sop.md)
- agent_loop.py — GenericAgent 现有 ReAct 循环(agent_loop.py)