Plan-and-Execute (计划与执行) 模式是一种高级的提示工程策略,它旨在进一步提升大型语言模型 (LLMs) 处理复杂、多步骤任务的能力,特别是在需要长期规划严格执行的场景中。相较于 ReAct 模式在每个步骤中同时进行推理和行动的紧密耦合,Plan-and-Execute 模式将任务解耦为两个明确的阶段:首先,LLM 作为一个“高层规划者”制定一个详细的行动计划;然后,LLM 作为“执行器”逐一执行计划中的每个步骤,并根据执行结果进行局部调整,但通常不偏离整体计划。这种明确的分离有助于解决 ReAct 模式在面对非常复杂或需要深思熟虑的任务时可能出现规划不连贯的问题,提升任务完成的鲁棒性和效率。

核心思想:

  • 两阶段分离:任务分为 “规划 (Plan)” 和 “执行 (Execute)” 两个独立阶段。
  • 规划阶段:LLM 专注于高层抽象,生成一个详尽的多步骤行动大纲。
  • 执行阶段:LLM 按照规划逐步执行,每一步可能涉及 ReAct 模式的 Thought -> Action -> Observation 循环。
  • 增强稳定性:先有计划,后有行动,减少了执行过程中因局部错误而偏离主目标的风险。
  • 适用于复杂长链任务:需要明确分解和顺序执行的任务。
  • 优化资源使用:规划阶段可以使用更小的模型或更少的迭代,执行阶段可以专注于局部细节。

一、为什么需要 Plan-and-Execute 模式?ReAct 模式的局限性

虽然 ReAct 模式通过 Thought -> Action -> Observation 循环显著提升了 LLM 的能力,但在某些场景下,它仍有其局限性:

  1. 短期记忆和局部优化

    • ReAct 模式的每一步推理和行动都基于当前的观察,更侧重于局部优化
    • 在极其复杂或需要多层依赖的长期任务中,LLM 可能会在多轮交互后“忘记”最初的目标或偏离整体策略,导致推理链条断裂或在低层级错误中反复循环。
  2. 规划与执行的紧密耦合

    • ReAct 模式中,规划(Thought)和执行(Action)紧密相连,每一轮都在同时进行。
    • 这使得 LLM 在某些情况下难以区分哪些属于高层策略,哪些属于低层操作,可能导致在需要深思熟虑的决策点上表现不稳定。
  3. 计算效率问题

    • ReAct 的每一次迭代都需要 LLM 进行一次完整的推理(生成 Thought 和 Action),对于非常长的任务链来说,这会带来较高的计算成本和延迟。

Plan-and-Execute 模式通过明确地分割规划和执行阶段,为 LLM 提供了一个更结构化的框架,允许它:

  • 在规划阶段:集中精力于如何分解任务、确定子目标、选择合适的工具、考虑全局最优策略。
  • 在执行阶段:严格遵循既定计划,但在必要时允许进行局部调整和错误恢复。

这就像一个项目经理先制定详细的项目计划,然后由项目团队按照计划一步步实施,遇到小问题时在计划框架内解决。

二、Plan-and-Execute 模式的工作原理

Plan-and-Execute 模式通常包含两个主要阶段:

阶段一:规划 (Planning)

  1. 目标:理解用户提供的复杂任务,并将其分解成一系列有序的、可执行的、具体的子目标或步骤。
  2. 角色:LLM 在此阶段扮演“规划者”的角色。它主要进行高层次的抽象思维和策略制定。
  3. 产物:LLM 生成一个详细的计划 (Plan)。这个计划通常是一个步骤列表,每个步骤都清晰地描述了要完成的子任务和可能需要的工具。这个计划应该具有连贯性和逻辑性,能够从起点逐步引导到最终目标。
  4. 特点
    • 通常只涉及 LLM 的一次或少量几次调用来生成整个计划。
    • 不直接执行任何外部工具,只构思如何执行。
    • 这个计划一旦制定,将作为后续执行阶段的指导原则。

规划阶段的提示示例 (概念性)

1
2
3
4
5
6
你是一个顶级规划专家。你的任务是根据用户的需求,制定一个清晰、详细、步骤化的执行计划。
明确列出每个步骤,并思考每个步骤可能需要哪些工具或函数。

目标: 找出过去一年内,北京和上海的平均气温,并计算两地平均气温的差值。

生成计划:

LLM 输出的计划可能类似这样:

1
2
3
4
5
6
1. 获取北京过去一年的气温数据。需要使用气象数据查询工具。
2. 计算北京过去一年的平均气温。
3. 获取上海过去一年的气温数据。需要使用气象数据查询工具。
4. 计算上海过去一年的平均气温。
5. 计算北京和上海平均气温的差值。
6. 输出最终结果。

阶段二:执行 (Execution)

  1. 目标:按照预先制定的计划,逐一执行每个步骤,并利用工具获取必要的信息。
  2. 角色:LLM 在此阶段扮演“执行器”的角色。它专注于当前步骤的具体实现。
  3. 机制:在执行每个计划步骤时,LLM 通常会采用类似 ReAct 的 Thought -> Action -> Observation 循环。它会查看当前计划步骤,然后思考如何使用可用工具来完成这个步骤,执行工具,并观察结果。这个过程可能持续多轮,直到当前计划步骤被认为已完成。
  4. 特点
    • 每个计划步骤独立执行,但全局目标由计划控制。
    • 执行器接收计划步骤作为指令,并根据此指令调用工具。
    • 允许在每个步骤内进行局部错误处理和微调,但不会随意修改整体计划。

执行阶段的提示示例 (概念性,针对计划的某个步骤)

1
2
3
4
5
6
7
8
9
10
11
12
这是你的当前计划步骤: "1. 获取北京过去一年的气温数据。需要使用气象数据查询工具。"

可用工具:
1. `weather_api_query(city: str, start_date: str, end_date: str)`: 查询指定城市在日期范围内的天气数据,返回平均气温。
输入: 城市名, 开始日期 (YYYY-MM-DD), 结束日期 (YYYY-MM-DD)
输出: 城市平均气温 (摄氏度)

Thought: 我需要调用 `weather_api_query` 工具来获取北京过去一年的气温数据。起始日期是2024-09-06,结束日期是2025-09-06。
Action: weather_api_query(city="北京", start_date="2024-09-06", end_date="2025-09-06")
Observation: 2024-09-06至2025-09-06期间,北京的平均气温为 15.3 摄氏度。
Thought: 步骤1已完成。获得北京平均气温:15.3。现在我将继续执行计划的下一个步骤。
Final Answer: 15.3 (这个Final Answer是针对当前小步骤的,会被Agent收集)

整个执行过程会循环遍历所有计划步骤,直到所有步骤完成或遇到不可恢复的错误。

统一工作流程示意图

图:Plan-and-Execute 模式工作流程

三、Plan-and-Execute 模式的优势

  1. 增强长期任务的鲁棒性

    • 通过预先规划,LLM 对任务的整体结构和目标有了清晰的认识,大大降低了在执行过程中迷失或偏离主线的风险。
    • 更好地处理嵌套性、依赖性强的任务。
  2. 提高规划质量

    • 在规划阶段,LLM 可以专注于逻辑推理和任务分解,不受具体工具调用的干扰。
    • 这有助于生成更优、更高效的执行路径。
  3. 计算资源优化

    • 规划阶段通常只需要一次或几次 LLM 调用。
    • 执行阶段的 LLM 提示可以更聚焦于当前步骤,可能不需要全局复杂的上下文。
    • 在某些实现中,规划阶段可以使用更强大的 LLM,而执行阶段可以使用成本较低的 LLM。
  4. 易于调试和监控

    • 明确的计划步骤使得任务的执行过程更容易理解和追踪。
    • 当出现问题时,可以更容易地定位到是规划阶段的缺陷还是执行阶段的错误。
  5. 更好的用户体验

    • 可以向用户展示当前的计划,提供任务进度和透明度。

四、Plan-and-Execute 模式的挑战与局限性

  1. 灵活性降低

    • 一旦计划制定,执行器倾向于严格遵循,可能在环境发生剧烈变化或出现意外情况时缺乏足够的灵活性来自主调整计划。
    • 如果初始计划存在缺陷,可能会导致后续执行困难。
    • 需要机制来允许在执行过程中对计划进行修订(这会引入额外的复杂性)。
  2. 规划与执行的上下文传递

    • 如何在规划阶段和执行阶段之间有效地传递上下文信息(例如,前一步执行的结果可能影响下一步的执行方式,但不能存储在计划中)是一个需要考虑的问题。
  3. 复杂性增加

    • 相比 ReAct,Plan-and-Execute 模式引入了额外的架构层,增加了系统的设计和实现复杂性。
  4. 初始规划的质量

    • 如果 LLM 在规划阶段做得不好,生成了一个糟糕的计划,那么后续的执行也会受到影响。一个错误的计划可能比没有计划更糟糕。

五、实际应用与框架支持

Plan-and-Execute 模式尤其适用于那些需要:

  • 长链推理:如项目管理、复杂的数据分析报告生成。
  • 明确里程碑:任务具有清晰的子阶段和交付物。
  • 资源密集型操作:希望在执行前进行全面的成本效益分析。

在流行的 LLM 框架中,例如 LangChain,也提供了对 Plan-and-Execute 模式的实现。LangChain 的 plan-and-execute agent 就是一个典型的例子,它允许你定义一个规划器 (Planner) 和一个执行器 (Executor),它们协同工作来完成任务。

LangChain 中的基本实现思路

  1. Planner LLM:接收初始用户输入,使用一个专门的 prompt 引导它生成一个步骤列表。
  2. Executor LLM:遍历 Planner 生成的每个步骤。对于每个步骤,它可能会使用一个 ReAct Agent 来:
    • 根据当前步骤的描述生成 ThoughtAction
    • 调用工具获取 Observation
    • 判断当前步骤是否完成,然后进入下一个步骤。
  3. 记忆 (Memory):在 Plan-and-Execute 模式中,通常会有一个记忆模块来存储执行过程中的关键信息,以便于在后续步骤中查询和利用,同时保持计划的独立性。

六、总结

Plan-and-Execute 模式通过将复杂任务解耦为高层规划低层执行两个独立阶段,有效地解决了 ReAct 模式在处理长链、复杂任务时可能出现的连贯性问题和局部优化陷阱。它适用于那些需要清晰的任务分解、长期策略和严谨执行的应用场景。虽然引入了额外的复杂性和在特定情况下可能牺牲一些灵活性,但其在提升 LLM 解决复杂问题鲁棒性和效率方面的优势,使其成为构建高级 LLM Agent 的一个重要范式。随着 LLM 技术的不断发展,Plan-and-Execute 及其衍生的更智能的Agent架构将持续推动人工智能领域的前沿。