深色模式
Agent 规划与反思 Plan / Reflect
摘要:ReAct 解决「一步步干」,但没解决「先想清楚再干」和「干完了复盘」。规划(Plan)让 Agent 在动手前产出可执行的步骤树;反思(Reflect)让 Agent 在每步或每轮后自检并修正。本文给出 Plan/Reflect 的生产范式、与 ReAct 的融合方式及成本权衡。
核心概念:Plan 与 Reflect 的分工
| 能力 | 时机 | 输入 | 输出 | 价值 |
|---|---|---|---|---|
| Plan | 任务开始前 | 目标 + 可用工具 | 步骤列表 / 依赖图 | 减少盲目探索、便于人工审批 |
| Reflect | 每步/每轮后 | 轨迹 + 观察 | 评价 + 修正建议 | 及时发现跑偏、自我纠错 |
| ReAct | 执行中 | 当前状态 | 下一步动作 | 落地执行 |
三者关系:Plan 给出蓝图,ReAct 按蓝图施工,Reflect 在施工中/后纠偏。缺少 Plan 易陷入低效试错;缺少 Reflect 易将错误一路带到底。
简单任务别过度规划
对线性、确定性强的任务,直接 ReAct 即可。Plan/Reflect 的额外 LLM 调用会成倍增加成本与延迟,只在「任务复杂、步骤多、易错」时启用。
架构与原理
Reflect 通常有两种粒度:逐步反思(每步后短评)与 轮次反思(一个子任务完成后整体复盘)。重规划(Re-plan)在反思判定「原计划不可行」时触发,需避免无休止重规划(设最大重规划次数)。
生产实践:Plan → Reflect 闭环
python
# plan_reflect.py —— 规划+反思示意 [未实测]
def plan(task, tools):
return llm(f"为任务制定步骤树,可用工具: {tools}。输出 JSON 步骤列表。任务: {task}")
def reflect(trajectory):
return llm(f"基于以下轨迹判断: 是否偏离目标? 有无错误? 给修正建议。\n{trajectory}")
def run(task, max_replans=3):
steps = plan(task, TOOLS)
for _ in range(max_replans):
traj = react_loop(task, steps) # 见 agent.md 的循环
verdict = reflect(traj)
if verdict.ok:
return traj.final
steps = verdict.revised_plan # 重规划
return traj.final # 达上限,交人工1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
反思也可能「自我催眠」
模型反思有时会编造「已修正」的假象,或陷入「反思→重规划→再反思」的死循环。对策:反思输出强制结构化(含 ok: bool 与 evidence),并用最大重规划次数硬熔断。
操作步骤 / 配置
- 在 system prompt 中固化 Plan/Reflect 的输出 schema(避免自由文本难解析)。
- 为 Plan 阶段保留独立、较大的上下文,避免被执行轨迹挤占。
- 接入人工审批门:高风险任务在 Plan 完成后暂停,等人工确认再执行。
bash
# 环境变量控制是否启用规划/反思(便于灰度)
export AGENT_ENABLE_PLAN=1
export AGENT_ENABLE_REFLECT=1
export AGENT_MAX_REPLANS=31
2
3
4
2
3
4
验证
- 计划可用性:用复杂任务人工评审生成的步骤树是否完整、依赖正确。
- 反思有效性:构造一个已知会跑偏的任务,确认 Reflect 能识别并触发重规划。
- 终止性:确认最大重规划次数能拦停死循环。
回滚 / 清理
- Plan/Reflect 的 prompt 与 schema 纳入版本管理;线上异常可切回「仅 ReAct」模式。
- 调试产生的计划树、反思日志含任务数据,定期清理防泄露。
故障排查
- 计划过于笼统:在 prompt 要求「每步必须对应一个具体工具调用」。
- Reflect 总说 OK:反思 prompt 缺乏批判性指令,或缺少 evidence 约束。对策:要求给出反证。
- 重规划抖动:前后计划反复横跳。对策:对计划做版本化 diff,仅在偏差超阈值时重规划。
安全与合规
- 提示注入:Reflect 读取的轨迹含工具返回,可能含注入。对策:轨迹中工具结果标为不可信。
- 越权工具调用:Plan 可能规划出敏感动作。对策:Plan 阶段也受工具白名单约束;高风险步骤人工审批。
- 数据泄露:反思日志可能汇总 PII。对策:日志脱敏 + 访问控制。
- 成本失控:Plan/Reflect 各多一次 LLM 调用,叠加 ReAct 步数。对策:只在复杂任务启用 + 预算上限。
成本 / 性能
引入 Plan 与逐步 Reflect,LLM 调用次数约 = 1(plan) + N(reasoning) + M(reflect) + K(replan)。对 10 步任务,可能多出 30–50% 调用。收益是更低的「无效步数」与更高的成功率。性能上,Plan 在任务开头增加一次延迟(可接受),但避免了下游大量无效执行,整体 wall-clock 往往更优。以单调用均摊 $0.02、10 步任务额外 5 次调用估算,单任务多 $0.1 [版本相关]。