04 ReAct Agent

ReAct Agent

LLM 如何连续地干活

本章聚焦  →  Agent 的核心行为范式 · 想—做—看—再想的 ReAct 循环

在上一章节中,我们已经给 LLM 安装上手脚了。光有手脚还不够,我们无法让它持续的工作,因为它只能处理原子任务,无法胜任复杂工作流程。接下来,我们将了解一下大模型领域最著名的核心“范式”(另一个被疯狂滥用的概念) - ReAct。

4.1 ReAct

所谓的 ReAct = Reasoning + Action,是一种 LLM 推理执行的范式,它规范了大模型通过多轮执行来处理复杂任务的过程:

LLM 接受任务 -> 思考下一步动作 -> 调用工具 -> 工具返回结果 -> 思考下一步动作 -> 调用工具 -> 工具返回结果 ... -> 回复用户 (即 Thought-> Action -> Observation Loop)

图 1 · ReAct Loop(Thought–Action–Observation)
接受任务 决定动作 工具返回 下一轮 · 回到 Thought 任务完成 任务Task 思考Thought 行动Action · 工具 观察Observation 回复用户尾声
每一轮 Loop 的尾声必是回复用户,中间是若干轮的工具调用:Thought 决定动作、Action 调用工具、Observation 拿回结果,不断往复,直到 Thought 判断任务完成才回复用户。

Agent 的核心就是这个 Loop,它就是 ReAct,也称为 AgentLoop。以下是一个简化但真实的 Trajectory:

[user]  请帮我查一下 AAPL 今天的收盘价

[assistant.thinking]
  用户问的是今天的股价。我没有实时数据,需要调 web_search[assistant.tool_call]
  web_search(query="AAPL closing price today")

[tool_result]
Found 3 results for: Apple Inc AAPL stock price today latest

1. Apple (AAPL) Stock Price Today, News, Chart, Earnings | Coinbase
   https://www.coinbase.com/stock/AAPL

2. NASDAQ:AAPL Stock Price - Apple Inc. - TradingView
   https://www.tradingview.com/symbols/NASDAQ-AAPL/

3. Apple Inc. (AAPL) Stock Price Today - WSJ
   https://www.wsj.com/market-data/quotes/AAPL

[assistant.thinking]
  我将打开第一个网址,查看具体股价信息

[assistant.tool_call]
  web_fetch(url="https://www.coinbase.com/stock/AAPL")

[tool_result]
  Apple (AAPL) closed at $235.18 on May 10, 2026...

[assistant.thinking]
  搜索结果给出了具体价格 $235.18 和日期 May 10。
  日期对的话,我可以直接回复用户。

[assistant.content]
  Apple (AAPL) 在 2026 年 5 月 10 日收盘价为 $235.18。

这就是 ReAct 的真实模样。LLM 把思考、行动、观察交错地输出,像一个有自我意识的程序员在干活时的自言自语。

类比 · 程序员的自言自语

把那句“自言自语”展开,就是程序员在工位上干活的样子——一边想、一边动、一边看:

查资料、跑一条命令Action 伸手去动外部世界
盯着报错和输出看Observation 接住外部反馈
琢磨“原来错在这,下一步该……”Thought 想清楚下一步
改一改、再试一次进入下一轮 Loop

程序员并不会在动手前就把每一步都想全,而是边想边干、看一步走一步,直到把事情做完。ReAct 就是把这套“想—做—看—再想”的工作方式,变成了 LLM 的运转范式。

注意:

有一个非常容易与 ReAct 产生混淆的概念,就是“思维链”(Chain of Thought)。这两者有这本质的区别。思维链的工作模式是:输入问题->思考步骤 1->思考步骤 2...->最终答案。我们进一步对比一下两者的核心区别:

维度CoTReAct
是否有外部交互是(调工具)
信息来源模型内部知识内部知识 + 工具返回
适合场景数学题、逻辑推理决策、检索、状态修改
幻觉风险较高较低(有外部 grounding)
图 2 · CoT vs ReAct:有没有外部交互
CoT 闭门思考直到答案 模型内部 问题 步骤 1 步骤 2 答案 ReAct 思考 ↔ 外部世界来回 Action 调用 Observation 返回 grounding 后作答 模型Thought 外部工具/环境 回复
左边 CoT 把所有推理关在模型内部,一条箭头都不出框;右边 ReAct 让思考与外部世界来回握手——Action 出去调用、Observation 带回结果,答案落在真实反馈之上(grounding),这也正是它幻觉更低的原因。

4.2 Coding Bot

给具备较强 ReAct 能力的 LLM 武装足量的工具,如文件读写、shell 调用、检索等等,它就演进成为了一个 Bot,也就是我们当前广义上认知的 Agent。

在此基础上,Agent 已经能够完成很多复杂任务了。

图 · 真实的 agent_loop(对应 mybot)
agent_loop(while iter < max_iterations)工具群filesystemread·write·edit·list_dirbash跑命令webfetch抓页面websearch搜索apply_patchdiff 编辑MCP toolschrome·etcreceive taskuser messageLLM stream+ tools schemaresponse 含tool_calls?ToolRegistry.execute逐个工具调用return assistant contentappend tool_result到 messages否,finish_reason=stop
把 ReAct 装进真实工程:agent_loopmax_iterations 内循环——每轮带上 tools schema 请求 LLM,若响应含 tool_calls 就交给 ToolRegistry 逐个调用(filesystem / bash / webfetch / websearch / apply_patch / MCP 等工具群),把结果 append 回 messages 再进入下一轮;否则 finish_reason=stop,返回 assistant content。

例如,我们可以让它写一个 server-client 的程序

使用 nodejs 生成一个图像处理项目,它需要实现基本的图像处理功能。你除了编写该项目的核心后端功能代码以外,还需要为我实现一个现代化的前端页面,有配套的测试用例、接口文档

你在后台能够看到 LLM 会以 ReAct 的方式疯狂的干活,直到它完成目标,或者遇到一个任务中断点需要返回给用户。

- 创建项目结构 (mkdir, write_file)
- 写 package.json、写后端代码、写前端 HTML
- bashnpm install
- 输出 → 哪个依赖装错了?调整 package.json 重试
- 写代码 -> pytest 跑测试 → 发现 bug → edit_file 修
...
- 写 API 文档 (write_file README.md)
- 直到所有测试通过
图 3 · Coding Bot 的自驱动循环
依赖装错?调整 package.json 重试 发现 bug → edit_file 修,重试 或遇中断点 建结构mkdir 写代码write_file installnpm install pytest跑测试 测试通过 ✓目标达成 返回用户任务中断点 · 需人工介入
Coding Bot 在后台以 ReAct 方式连轴转:建结构 → 写代码 → 装依赖 → 跑测试,一路向右;装错了就调 package.json 重试,测出 bug 就回头改代码——带着回环不断自我修正,直到测试全绿,或遇到需要人工介入的中断点才停下。

整个过程都是 Agent 在后台自行完成的,全程无需人工来干预。当然,在最新的技术进展中,人工干预也是被设计出来的必要环节,目的是为了让 Agent 的工作目标以及工作质量定时与人工保持对齐,这是后话。总之,具备了一些关键工具的 ReAct Agent,就完全有能力作为一个强大性能的 Coding Bot 来使用了。

现场演示 · mybot 前端

启动 demo/serve.sh 后,给它一个多步任务(如“写一个小的 server-client 程序”),看它以 ReAct 方式连续调用工具,直到完成。

Agent Loop 演示看点
  • filesystem 工具——读写文件、组织项目结构
  • shell 工具——运行命令、编译与自测
  • web 工具——按需联网检索资料

4.3 小结与思考

本章小结
  • ReAct = 想—做—看—再想——Thought(想下一步)→ Action(动外部世界)→ Observation(接住反馈),循环往复直到回复用户。
  • Trajectory 的典型形状——每一轮 Loop 的尾声必是回复用户,中间则是若干轮的工具调用。
  • 能力来自训练——ReAct 是主流 LLM Agent 的基础范式,主要靠强化学习获得,而非靠 prompt 拼出来。
  • Coding Bot 就是 agent_loop——给一个多步任务,Agent 以 filesystem / shell / web 工具边做边测边改,直到完成。
思考题
  • 在 Agent Loop 中如何优雅地支持用户中断
  • 如何阻止 Agent 使用工具的一些边界行为(例如 rm -rf/sudo...)
  • 如果 Agent 在没有做完工作时缺回复完成,应当如何识别并处理
  • 如何实现 Trajectory Replay
源码浏览器
选择左侧文件查看源码