在上一章节中,我们已经给 LLM 安装上手脚了。光有手脚还不够,我们无法让它持续的工作,因为它只能处理原子任务,无法胜任复杂工作流程。接下来,我们将了解一下大模型领域最著名的核心“范式”(另一个被疯狂滥用的概念) - ReAct。
4.1 ReAct
所谓的 ReAct = Reasoning + Action,是一种 LLM 推理执行的范式,它规范了大模型通过多轮执行来处理复杂任务的过程:
LLM 接受任务 -> 思考下一步动作 -> 调用工具 -> 工具返回结果 -> 思考下一步动作 -> 调用工具 -> 工具返回结果 ... -> 回复用户 (即 Thought-> Action -> Observation Loop)
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 把思考、行动、观察交错地输出,像一个有自我意识的程序员在干活时的自言自语。
把那句“自言自语”展开,就是程序员在工位上干活的样子——一边想、一边动、一边看:
程序员并不会在动手前就把每一步都想全,而是边想边干、看一步走一步,直到把事情做完。ReAct 就是把这套“想—做—看—再想”的工作方式,变成了 LLM 的运转范式。
注意:
- 每一轮 ReAct Loop 的尾声必然是回复用户,中间则是若干轮的工具调用。这是 ReAct Trajectory 的典型特征。
- ReAct 是主流 LLM Agent 能力的基础范式,该能力主要通过训练获得(主流为强化学习方案)
有一个非常容易与 ReAct 产生混淆的概念,就是“思维链”(Chain of Thought)。这两者有这本质的区别。思维链的工作模式是:输入问题->思考步骤 1->思考步骤 2...->最终答案。我们进一步对比一下两者的核心区别:
| 维度 | CoT | ReAct |
|---|---|---|
| 是否有外部交互 | 否 | 是(调工具) |
| 信息来源 | 模型内部知识 | 内部知识 + 工具返回 |
| 适合场景 | 数学题、逻辑推理 | 决策、检索、状态修改 |
| 幻觉风险 | 较高 | 较低(有外部 grounding) |
4.2 Coding Bot
给具备较强 ReAct 能力的 LLM 武装足量的工具,如文件读写、shell 调用、检索等等,它就演进成为了一个 Bot,也就是我们当前广义上认知的 Agent。
在此基础上,Agent 已经能够完成很多复杂任务了。
agent_loop 在 max_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 - bash 跑 npm install - 输出 → 哪个依赖装错了?调整 package.json 重试 - 写代码 -> pytest 跑测试 → 发现 bug → edit_file 修 ... - 写 API 文档 (write_file README.md) - 直到所有测试通过
package.json 重试,测出 bug 就回头改代码——带着回环不断自我修正,直到测试全绿,或遇到需要人工介入的中断点才停下。整个过程都是 Agent 在后台自行完成的,全程无需人工来干预。当然,在最新的技术进展中,人工干预也是被设计出来的必要环节,目的是为了让 Agent 的工作目标以及工作质量定时与人工保持对齐,这是后话。总之,具备了一些关键工具的 ReAct Agent,就完全有能力作为一个强大性能的 Coding Bot 来使用了。
启动 demo/serve.sh 后,给它一个多步任务(如“写一个小的 server-client 程序”),看它以 ReAct 方式连续调用工具,直到完成。
- 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