AI Agent规划能力深度解析:从ReAct到Tree of Thoughts的工程实践
规划能力是AI Agent的核心竞争力。一个没有规划能力的Agent只能执行简单的单步任务而具备强大规划能力的Agent才能分解复杂问题、处理多步骤工作流、应对意外情况。本文系统梳理Agent规划的主流方法从理论到代码帮助你构建真正智能的Agent系统。为什么规划如此关键让我们从一个反例开始。假设你的Agent收到任务“分析我们公司过去三个月的销售数据找出Top 10产品并生成一份带图表的报告发给老板”。一个没有规划能力的Agent会怎么做它可能直接调用一个工具发现无法一步完成然后失败。一个有规划能力的Agent会怎么做它会1. 识别出任务需要多步骤2. 分解为获取数据→分析排名→生成图表→撰写报告→发送邮件3. 按顺序执行中间处理可能的错误4. 最终成功完成这就是规划的价值将不可直接执行的复杂目标分解为可执行的子任务序列。## ReAct最经典的规划范式ReActReason Act是目前使用最广泛的Agent规划范式核心是将推理Thought和行动Action交替进行Thought: 我需要先查询数据库获取销售数据Action: query_database(querySELECT * FROM sales WHERE date 2026-01-01)Observation: 返回了12,847条销售记录Thought: 数据量很大我需要先聚合再分析Action: analyze_data(data..., operationsum_by_product)Observation: 得到了各产品的总销售额Thought: 现在可以找出Top 10了Action: get_top_n(data..., n10, keyrevenue)Observation: 返回了Top 10产品列表... 继续执行ReAct的优势在于每次行动前都有显式的推理步骤使得过程可解释、可调试。在LangChain中实现ReAct Agentpythonfrom langchain.agents import create_react_agent, AgentExecutorfrom langchain_openai import ChatOpenAIfrom langchain.tools import Toolfrom langchain import hub# 获取ReAct提示模板prompt hub.pull(hwchase17/react)# 定义工具tools [ Tool( namequery_database, funcquery_database_fn, description查询数据库。输入SQL查询语句返回查询结果。 ), Tool( namecreate_chart, funccreate_chart_fn, description创建图表。输入数据和图表类型返回图表文件路径。 ), Tool( namesend_email, funcsend_email_fn, description发送邮件。输入收件人、主题、正文返回发送结果。 ),]llm ChatOpenAI(modelgpt-4o, temperature0)agent create_react_agent(llm, tools, prompt)executor AgentExecutor(agentagent, toolstools, verboseTrue, max_iterations15)result executor.invoke({input: 分析Q1销售数据找Top 10产品生成报告发给bosscompany.com})## Plan-and-Execute先规划再行动ReAct的问题是规划和执行混在一起遇到长任务时容易迷失——执行了几步后Agent可能忘记了整体目标。Plan-and-Execute规划后执行的思路是分离这两个阶段1.规划阶段用LLM生成完整的执行计划任务列表2.执行阶段按顺序执行每个子任务必要时可以重规划pythonfrom langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_plannerllm ChatOpenAI(modelgpt-4o, temperature0)# 规划器生成完整计划planner load_chat_planner(llm)# 执行器执行每个步骤executor load_agent_executor(llm, tools, verboseTrue)# 组合agent PlanAndExecute(plannerplanner, executorexecutor, verboseTrue)result agent.invoke({input: 你的复杂任务描述})规划阶段会生成如下输出计划:1. 使用query_database工具查询2026年1-3月销售数据2. 使用analyze_data工具计算各产品销售额3. 使用sort_and_filter工具获取Top 10产品4. 使用create_chart工具生成柱状图5. 使用write_report工具生成分析报告6. 使用send_email工具发送给指定收件人这种方式在复杂多步任务中通常比纯ReAct更可靠。## Tree of Thoughts用搜索解决规划难题有些问题没有确定性的解决路径需要探索多种可能性。Tree of ThoughtsToT将规划问题建模为树搜索- 每个节点是一个中间思考状态- 从根节点出发每步可以生成多个候选下一步- 用评估器Evaluator对每个状态打分- 使用BFS/DFS/Best-first等搜索策略探索python# ToT的简化实现class TreeOfThoughts: def __init__(self, llm, n_candidates3, max_depth5): self.llm llm self.n_candidates n_candidates # 每步生成的候选数 self.max_depth max_depth def generate_thoughts(self, state: str, problem: str) - list[str]: 从当前状态生成多个候选下一步 prompt f 问题: {problem} 当前状态: {state} 请生成{self.n_candidates}个不同的下一步思考方向每个方向用分隔 response self.llm.invoke(prompt) thoughts response.content.split() return [t.strip() for t in thoughts if t.strip()] def evaluate_state(self, state: str, problem: str) - float: 评估当前状态的质量0-1 prompt f 问题: {problem} 当前状态: {state} 评估当前状态距离解决问题有多近输出0-10的分数只输出数字 response self.llm.invoke(prompt) try: return float(response.content.strip()) / 10 except: return 0.5 def solve(self, problem: str) - str: 使用BFS搜索最佳解决路径 import heapq # (负分数, 状态路径) heap [(0, [problem])] while heap: neg_score, path heapq.heappop(heap) current_state path[-1] if len(path) self.max_depth: continue # 生成候选下一步 next_thoughts self.generate_thoughts(current_state, problem) for thought in next_thoughts: new_state current_state \n thought score self.evaluate_state(new_state, problem) if score 0.9: # 找到足够好的解 return \n.join(path [thought]) heapq.heappush(heap, (-score, path [thought])) return 未找到解决方案ToT特别适合需要回溯的场景比如代码生成、数学推理、复杂规划问题。## 反思与自我批评让Agent学会纠错Reflexion框架引入了反思机制Agent执行失败后不是简单重试而是先反思失败原因然后带着经验重试。pythonclass ReflexionAgent: def __init__(self, llm, max_trials3): self.llm llm self.max_trials max_trials self.memory [] # 存储历次反思 def reflect(self, task: str, attempt: str, result: str) - str: 对失败尝试进行反思 reflections_context \n.join( [f第{i1}次反思: {r} for i, r in enumerate(self.memory)] ) prompt f 任务: {task} 本次尝试: {attempt} 执行结果: {result} 历次反思: {reflections_context} 分析这次失败的根本原因并给出下次应该如何改进简洁、具体 reflection self.llm.invoke(prompt).content self.memory.append(reflection) return reflection def execute_with_reflection(self, task: str) - str: for trial in range(self.max_trials): # 构建包含历次反思的提示 context if self.memory: context 历次尝试的教训:\n \n.join(self.memory) # 执行任务 result self.execute_task(task, context) # 判断是否成功 if self.is_success(result): return result # 失败则反思 reflection self.reflect(task, context, result) print(f第{trial1}次失败反思: {reflection}) return 达到最大重试次数任务失败## LangGraph中的状态机规划对于需要复杂控制流的AgentLangGraph提供了基于状态机的规划框架。你可以定义节点处理逻辑和边转移条件构建有明确控制流的Agentpythonfrom langgraph.graph import StateGraph, ENDfrom typing import TypedDict, Annotatedimport operatorclass AgentState(TypedDict): messages: Annotated[list, operator.add] plan: list[str] current_step: int results: list[str]def plan_node(state: AgentState) - AgentState: 生成执行计划 task state[messages][-1].content plan generate_plan(task) # 调用LLM生成计划 return {plan: plan, current_step: 0}def execute_node(state: AgentState) - AgentState: 执行当前步骤 step state[plan][state[current_step]] result execute_step(step) # 执行具体步骤 return { results: [result], current_step: state[current_step] 1 }def should_continue(state: AgentState) - str: 判断是否继续执行 if state[current_step] len(state[plan]): return finalize if error in state[results][-1]: return handle_error return execute# 构建图workflow StateGraph(AgentState)workflow.add_node(plan, plan_node)workflow.add_node(execute, execute_node)workflow.add_node(handle_error, error_handling_node)workflow.add_node(finalize, finalize_node)workflow.set_entry_point(plan)workflow.add_edge(plan, execute)workflow.add_conditional_edges(execute, should_continue, { execute: execute, finalize: finalize, handle_error: handle_error,})workflow.add_edge(handle_error, execute)workflow.add_edge(finalize, END)app workflow.compile()## 规划能力的工程实践建议根据实际场景选择合适的规划方案简单工具调用1-3步直接用Function Calling无需专门的规划框架。中等复杂度3-10步路径确定ReAct 合理的工具设计配合Plan-and-Execute。高度复杂10步路径不确定LangGraph状态机 Reflexion反思机制。需要探索多种方案Tree of Thoughts 评估器。几个通用原则1.工具粒度要合适工具太粗做太多事会让规划失去意义工具太细如只能逐字读取文件会增加规划复杂度。2.给规划提供足够上下文在系统提示中明确说明可用工具、各工具的适用场景和限制。3.设置合理的重试上限ReAct Agent如果陷入循环max_iterations是最后的安全网。4.记录中间状态使用LangSmith或类似工具追踪每次推理步骤便于调试。5.规划质量评估建立评估集定期测试Agent在标准任务上的完成率及时发现回退。规划能力的提升是一个持续迭代的过程。从最简单的ReAct开始根据实际问题逐步引入更复杂的规划机制才是工程上的正确路径。