【AiCoding】ReAct VS Plan—Execute

ReAct+Tool call

Reasoning+Acting 推理和行动交替进行

(Reasoning + Acting)执行流程

image-20261022091558628

深入ReAct模式

基础ReAct

LLM每一步都输出Thought+Action,然后执行Action,观察结果继续循环

整体流程
  1. 输入用户问题 + 工具列表 + 历史轨迹 送入 LLM

  2. Thought(思考,模型输出)

    : 模型基于已有信息分析:现在知道什么、缺什么、下一步该做什么;判断是否还需要调用工具,还是直接出答案

    示例:Thought: 用户想知道今天石家庄气温,我缺少实时数据,需要调用天气查询工具

  3. Action(行动,模型输出结构化指令)

    : 输出工具名称 + 参数,交给框架 / 调度器执行;不是模型自己调用,是外层系统执行工具调用

    示例:Action: SearchWeather (city=”石家庄”)

  4. Observation(观察,系统回填,不是模型生成)

    : 工具执行返回结果(搜索内容、计算结果、接口返回、报错信息),追加到上下文历史里

    示例:Observation: 石家庄今日 22℃,晴

  5. 循环判断(ReAct Loop): 把 Observation 并入对话历史,回到第 2 步,再次交给 LLM 思考; 当模型判断信息足够,输出 Final Answer,终止循环; 一般会加最大步数上限,防止死循环。

未命名绘图.drawio

1
2
3
Thought: 用户要我创建一个 Java 项目,我需要用 create_project 工具
Action: create_project({"name": "demo", "type": "java"})
Observation: 项目已创建

Reflexion

ReAct 执行循环 + 评估器 Evaluator + 反思 Reflector + episodic 记忆库;不微调模型权重,用自然语言复盘、沉淀教训,跨轮次复用经验

image-20261022110911725

在ReAct的基础上添加了反思的功能,例如我本次需要让Agent去创建HelloCli的工程在code_agent文件夹下,当我没有去创建文件夹code_agent他就会回顾自己的行动,总结成功教训,保存到记忆中,下次遇到就会首先检查文件夹是否创建与是否存在,导致可能覆盖的状况。

1
Thought: 刚才创建项目时我没有检查目录是否存在,导致可能覆盖已有文件。下次应该先 list_dir 检查。

模型工具(Function/Tool)

  1. name(工具名称):唯一标识,模型用来指定调用哪个工具,比如 get_weather
  2. description(工具描述):告诉模型这个工具能干什么、什么时候该调用
  3. parameters(参数 schema):入参定义,参数名、类型、是否必填、说明

示例

1
2
3
4
5
6
7
8
9
10
11
{
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type":"string","description":"城市名"}
},
"required": ["city"]
}
}

一句话分工: name:找谁;description:什么时候用;parameters:带什么参数

Plan和DAG

Plan-and-Execute 把一次任务交给两个角色。规划器(Planner)负责出计划,它调用模型时不给任何工具,只要求模型输出一份 JSON 格式的计划。执行器(PlanExecuteAgent)拿着这份计划,按依赖关系一批一批地跑任务。正常情况下规划器只调用一次模型;用户审阅时补充要求,或者任务失败后需要重新规划,规划器会再调用模型。

核心思想:一路往深处走,走不通再回溯,优先深度、后广度,像走迷宫,一条路走到头,碰壁再退回来试别的分支。

核心流程
  1. 访问当前节点,标记已访问(防止环路重复走)
  2. 依次遍历当前节点的相邻子节点
  3. 如果子节点没访问过,递归进入这个子节点(继续往下深挖)
  4. 所有子节点遍历完 → 回溯,回到上一层,尝试其他分支

口诀:先深挖,走到底,无路回退,再探旁支

特性 ReAct Plan-and-Execute
LLM 调用次数 多(每步都调) 少(初始规划一次,执行阶段调用轻量,异常才重规划)
执行速度 慢(每步都有 LLM 网络往返) 快(规划一次,后续步骤本地 / 轻量执行)
Token 消耗 高 低
灵活性 高,边执行边调整,遇到意外随时换路线 低,优先按照预先制定的计划执行
可预测性 低,路径不可控,容易跑偏绕路 高,计划可见,步骤可审计、可人工预审
错误恢复 容易,单步失败后下一轮 Thought 即时调整策略 一般,单步出错需要触发重规划流程,成本更高
适用场景 探索类、不确定环境、调试代码、信息检索、未知路径任务 流程固定、长步骤流水线、批量任务、需要事前审核方案的任务
  • image-20261022150339878
  • ReAct:边走边想(Thought-Action-Observation 循环)
  • Plan-and-Execute:先全局规划,再按计划执行,失败才重规划

什么时候用 ReAct

  • 任务简单,1-3 步就能完成
  • 需要探索性操作,不确定具体步骤
  • 用户想看到思考过程
  • 需要频繁的人机交互

比如“查看当前目录有什么文件”,直接 ReAct 一步完成。

什么时候用 Plan-and-Execute

  • 任务复杂,需要多步操作
  • 步骤之间有明确依赖关系
  • 追求执行效率
  • 需要可预

比如“搭建一个完整的 Web 项目,包括前后端、数据库、部署”,用 Plan-and-Execute 更合适。