首页 机器学习 深度学习 LLM 推荐算法 Agent 项目 关于

解锁大模型智能体的高阶范式: Plan-and-Solve

在构建大语言模型(LLM)智能体时,经典的 ReAct 范式(思考-行动-观察)以其卓越的灵活性深入人心。然而,在实际工程中,ReAct 就像一个“走一步看一步”的探险家,容易在面对多步骤、高难度的复杂任务时“迷失方向”或陷入无效的死循环。

为了攻克这一痛点,业界提出了另一种更加结构化的智能体范式——Plan-and-Solve(规划与解决)。如果说 ReAct 是根据现场蛛丝马迹随时调整方向的探侦,那么 Plan-and-Solve 则更像一位严谨的建筑师,在动工之前,必须先绘制出完整的蓝图。

1 Plan-and-Solve范式

Plan-and-Solve 概念由 Lei Wang 等人于 2023 年提出,其核心动机是为了解决思维链(CoT)及传统步进式方法在处理多步骤问题时容易“偏离轨道”的缺陷。

与 ReAct 将思考和行动揉碎在每一步不同,Plan-and-Solve 将整个任务流程彻底解耦为两个核心阶段:

  1. 规划阶段 (Planning Phase):智能体接收到用户的完整问题后,不直接去解决问题或调用工具。而是先调用一次 LLM,将大任务拆解,制定出一个清晰、分步骤的行动计划(Plan)
  2. 执行阶段 (Solving Phase):智能体获得完整的计划后,进入执行状态。它会严格按照计划中的步骤,逐一执行(如调用工具、加工数据等),直到所有步骤完成,最终输出答案。

Plan-and-Solve 范式的两阶段工作流架构

2 核心架构与编码实现

构建一个 Plan-and-Solve 智能体,关键在于计划的生成状态管理器的维护。以下是底层的核心实现逻辑。

2.1 规划阶段:提示词设计

在规划阶段,我们需要强迫大模型输出一个结构化的步骤列表。

你是一个高效率的任务规划专家。
请分析用户的原始问题,并将其拆解为一系列逻辑清晰、可执行的步骤计划。

请严格按照以下格式输出你的计划:
Plan:
1. [步骤1:具体要做的事情]
2. [步骤2:具体要做的事情]
3. ...

原始问题: {question}

2.2 状态管理器与执行驱动器

在执行阶段,智能体需要维持一个“指针”,记录当前执行到了第几步,并把历史步骤的执行结果(上下文)不断喂给执行器。

class PlanAndSolveAgent:
    def __init__(self, llm_client, tool_executor):
        self.llm_client = llm_client
        self.tool_executor = tool_executor
        self.plan = []
        self.execution_history = []

    def run(self, question):
        # 1. 规划阶段:生成完整计划
        print("📋 正在制定全局计划...")
        plan_prompt = PLAN_PROMPT_TEMPLATE.format(question=question)
        plan_output = self.llm_client.think([{"role": "user", "content": plan_prompt}])
        self.plan = self._parse_plan(plan_output)
        
        print(f"✅ 计划制定完成,共 {len(self.plan)} 步。")

        # 2. 执行阶段:严格按计划推进
        for step_idx, step_desc in enumerate(self.plan):
            print(f"\n⚡ 正在执行第 {step_idx + 1} 步: {step_desc}")
            
            # 构建单步执行的上下文,包含历史执行结果
            solve_prompt = SOLVE_PROMPT_TEMPLATE.format(
                question=question,
                current_step=step_desc,
                history="\n".join(self.execution_history)
            )
            
            # 调用 LLM 决定该步如何行动(如调用什么工具)
            response = self.llm_client.think([{"role": "user", "content": solve_prompt}])
            
            # 解析并执行工具
            tool_name, tool_input = self._parse_action(response)
            if tool_name:
                observation = self.tool_executor.execute(tool_name, tool_input)
                self.execution_history.append(f"步骤: {step_desc}\n结果: {observation}")
            else:
                self.execution_history.append(f"步骤: {step_desc}\n结果: {response}")

        # 3. 汇总输出
        print("\n🏁 所有步骤执行完毕,正在生成最终答案...")
        final_prompt = f"基于以下执行历史,回答问题:{question}\n历史:{self.execution_history}"
        return self.llm_client.think([{"role": "user", "content": final_prompt}])

3 Plan-and-Solve vs ReAct

特性 ReAct (反应式) Plan-and-Solve (规划式)
决策机制 动态调整,边想边做 全局规划,三思而后行
Token 消耗 (历史记录呈雪崩式累积) (各步骤相对独立,上下文受控)
死循环风险 (易在同一个错误里打转) (按步骤线性推进,天然具备终止边界)
适用场景 开放式探索、未知环境、强交互任务 目标明确的多步骤任务、复杂数学推理

4 局限性与工程思考

尽管 Plan-and-Solve 在多步骤任务中表现出极高的稳定性和 Token 经济性,但它也有致命的弱点:对未知变化的应对能力较差

如果在第一步执行工具时,返回了完全出乎意料的错误结果,原本在“温室”里设计好的第 2、3、4 步计划就会全盘崩溃。由于它缺乏 ReAct 那种随时修正计划的弹性,往往会“硬着头皮”把错误的计划执行到底。

工程启示: 在实际生产中,目前主流的大模型 Agent 工具往往会将两者融合——采用 Plan-and-Solve 搭建宏观骨架(顶层规划),在具体的单步执行中嵌套 ReAct 循环(底层容错)。这种动静结合的混合架构,才是让智能体走向工业级落地的核心解法。