单 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 时触发。基于执行失败的原因,重新生成任务。

参考链接

相关推荐
IT_陈寒3 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
fliter4 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
fliter5 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪5 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter5 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶6 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿6 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端
爱勇宝6 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员
科米米6 小时前
嵌入式日志模块
后端