单 Agent 实现模式

ReAct 模式 - 边做边想

什么是 ReAct 模式

通过提示词的方式,让大模型交替生成"思考","行动","观察"的循环。

为什么这个模式会被创造出来?

2022 年的论文《ReAct: Synergizing Reasoning and Acting in Language Models》。作者发现,把推理和行动放在一个闭环里面,能显著提升大模型在知识密集、多步推理任务上的表现。

工作原理

ReAct 会形成一个 Thought -> Action -> Observation -> Thought -> ... 的循环:

  • Thought(思考):模型分析当前状况,决定要做什么。

  • Action(行动):执行一个具体动作,例如调用搜索引擎、查询数据库、使用计算器、操作 API 等。

  • Observation(观察):接收到外部环境返回的结果(比如搜索到的文字、计算结果)。

然后模型再根据观察生成新的思考,如此循环直到得出最终答案。

工程中如何实现

  1. 在系统提示词中注入 ReAct 格式要求,让 LLM 主动用 Thought/Action/Observation 格式思考和输出。并强制要求必须通过 sub_agent_task Tool 创建独立上下文的验证子 Agent 检查工作。

prompt 大致如下:

text 复制代码
## 🧠 ReAct 推理模式(带强制独立验证)

你必须使用 ReAct(Reasoning + Acting)模式来解决问题。请严格按照以下格式:

**循环执行以下步骤,直到可以给出最终答案:**

1. 🤔 **Thought(思考)**: 分析当前情况,说明你需要做什么、为什么这样做

2. 🔧 **Action(行动)**: 如果需要查找信息、读取文件、执行命令等,调用相应的工具

3. 👁️ **Observation(观察)**: 观察工具返回的结果,分析是否足够回答问题

4. 如果信息不足,回到步骤 1 继续推理

**🔍 强制验证步骤(重要!给出最终答案前必须执行):**

5. 在给出最终答案之前,你必须调用 `sub_agent_task` 工具,创建一个独立的验证子 Agent 来检查你的工作。这是强制性的,不可跳过!

需要注意的是: sub_agent_task 工具是需要你自己实现的,并且要限制循环的次数,避免陷入无限死循环,无限消耗 token

  1. 对于不同类型的 Agent,需要注入不同的 system prompt 强制 Agent 执行验证工作。下面是我自己项目中 Code Agent 的 prompt :
text 复制代码
你是代码验证者,职责是批判性地检查代码输出。

你必须独立运行工具进行验证,不采信主 Agent 的声明。

验证步骤:

1. 使用 read_file 读取被修改或创建的代码文件

2. 使用 execute_command 运行 `mvn compile`(如果是 Java 项目)或对应的编译命令

3. 如果编译失败,报告具体的错误信息和行号

4. 如果编译通过,检查代码是否满足用户的原始需求(对照 prompt 中的需求描述)

5. 快速检查是否存在明显的逻辑错误、空指针或资源泄漏

返回格式(二选一):

PASS: <简要说明验证通过>

FAIL: <具体问题描述,包含文件名和行号>

重要:你必须切实执行验证工具,不能仅凭描述判断。

与我们普通的对话有什么区别?

好处很明显:在一些复杂任务上,输出的质量会更高。

坏处也很明显:消耗的 token 更多了,响应的时间也变长了。

ReWOO (Reasoning Without Observation) - 谋定而后动

什么是 ReWOO

先制定计划,在批量执行所有工具调用,最后收集所有结果,进行综合推理。

为什么会被创造出来

为了解决 ReAct 高成本、低效率的问题

工程中如何实现

ReWOO 一共有 3 个组件。

Planner -> Worker -> Solver

  • Planner:一次性制定出完整的执行计划,包括需要调用哪些工具、调用顺序以及参数,但此时并不真正执行

  • Worker:严格按照规划器的计划,批量执行所有工具调用,并收集结果

  • Solver:接收最初的计划和工作器收集到的所有结果,进行综合推理,生成最终答案给用户

LLMCompiler - 并行加速

什么是 LLMCompiler

以并行执行为核心,将规划建模为有向无环图,无依赖的任务并行执行。

可以理解为 LLMCompiler 是 ReWOO 的升级版,将串行调用改为并行调用

工程中如何实现

LLMCompiler 整体实现和 ReWOO 大差不差。区别在于,会要求大模型生成的规划是一个有向无环图,程序要将其解析为有向无环图,然后在同一层的并发执行。

Plan and Execute 模式 - 战略与战术分离

什么是 plan and Execute

先制定计划再根据计划执行,如果计划实施不了,则会重新生成计划。

为什么会被创造出来?

为了解决 ReAct 的在复杂、多步任务中的 2个核心问题。

  1. 走一步看一步,缺乏大局观。

  2. 执行过程无法预测。

工程中如何实现

plan and execute 由 3 个组件组成:Planner, Executor, Replanner

Planner

使用专门的 planner 模型构建系统提示,借助 TodoTool,要求模型按照接收入参返回。TodoTool 内部则对大模型返回的 task 进行校验,主要是检测是否为有向无环图。

Execute

遍历计划中的每一步,顺序执行。

执行完成后,LLM 作为评估器判断结果,分为三档:

  • PASS → 标记 COMPLETED,继续下一步

  • RETRY → 临时故障,最多重试 maxRetryPerStep 次(默认 3)

  • REPLAN → 计划有缺陷,触发重规划

Replan

当评估器返回 REPLAN 时触发。基于执行失败的原因,重新生成任务。

参考链接

相关推荐
小Ti客栈5 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
Ai拆代码的曹操6 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
IT_陈寒7 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱7 小时前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端
Wang's Blog8 小时前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
Conan在掘金8 小时前
鸿蒙报错速查:struct 里嵌 namespace 声明就炸,根因 + 真解法
后端
东方小月9 小时前
从零开发一个 Coding Agent(三):EventStream 事件流通道设计与实现
前端·人工智能·后端
卫子miao9 小时前
如何评价当前大语言模型的记忆机制?
后端·架构
神奇小汤圆9 小时前
为什么 AQS 成为 Java 并发的基石?
后端
星栈10 小时前
MCP 从 stdio 迁到 SSE,踩了 5 个传输层坑
人工智能·后端·架构