ReAct 与 LLM Agentic 范式:从推理到行动的完整技术科普

一、引言:AI 从"问答机"到"自主代理"的跃变

早期的大语言模型(LLM)就像一个超级问答机------你问,它答,交互止步于此。然而 2022 年之后,一类新的 AI 使用范式开始兴起:让 LLM 不仅能"想",还能"做"。

这一范式被称为 Agentic LLM(智能体化大语言模型),其核心思想是:给模型配备工具、赋予它执行计划的能力,让它自主地完成多步骤任务------就像一个真正的"助理",而不是被动的"搜索引擎"。

在这一演进中,ReAct 是最具代表性、影响力最大的技术框架之一。本文将从 ReAct 出发,系统讲解 LLM Agent 体系的核心概念,包括:

● ReAct:推理与行动的交织

● Tool Use(工具调用):Agent 的"手"

● Harness(测试框架):确保 Agent 按规则行动

● Spec-Driven(规范驱动):用规范约束 Agent 行为

● 以及其他相关概念

二、ReAct:思考与行动的统一范式

2.1 背景:两条独立的路

在 ReAct 出现之前,研究者们主要沿着两条路发展 LLM 能力:

路线一:Chain-of-Thought(CoT,思维链)

让模型在回答前先写出推理步骤,就像做数学题时先列过程再给答案。这显著提升了模型的逻辑推理能力,但它是纯粹"在脑子里想",没有与外部世界交互。

路线二:Action Generation(行动生成)

让模型直接生成行动序列(如搜索关键词、点击按钮),直接"做事"。但这种方式缺乏显式推理,模型容易"行动过头"------不知道为什么做,只是机械执行。

2.2 ReAct 的核心思想:交织推理与行动

2022 年,Yao 等人在论文《ReAct: Synergizing Reasoning and Acting in Language Models》(arXiv:2210.03629)中提出了 ReAct 框架。

ReAct = Reasoning(推理)+ Acting(行动),两者交替进行、相互增强。

其运行方式如下(以一个回答问题的 Agent 为例):

Thought: 我需要查一下这个人的出生年份

Action: Search["某某人物"]

Observation: 某某生于1985年,是...

Thought: 好,现在我知道出生年份了,还需要计算年龄

Action: Calculator["2026 - 1985"]

Observation: 41

Thought: 已经有足够信息了

Action: Finish["该人物今年41岁"]

这里有三个关键元素:

● Thought(思考):模型的内心独白,分析当前情况,规划下一步

● Action(行动):调用外部工具,如搜索引擎、计算器、API

● Observation(观察):工具返回的结果,作为下一轮思考的输入

这个循环不断迭代,直到任务完成。

2.3 为什么 ReAct 有效?

ReAct 的强大之处在于:

  1. 思考为行动导航:Thought 步骤让模型在行动前先理清思路,避免盲目操作
  2. 行动更新知识:每次 Observation 为模型提供新信息,更新其对世界的认知
  3. 错误可以被发现和纠正:如果某个行动结果出乎意料,模型可以在 Thought 中调整策略
  4. 可解释性强:整个推理-行动过程是透明的,人类可以审查
    实验证明,在知识密集型任务(如 HotpotQA 多跳问答)和决策型任务(如 ALFWorld 家庭环境操作)中,ReAct 都显著优于纯 CoT 或纯行动方法。

三、Tool Use(工具调用):给 LLM 装上"手"

3.1 什么是 Tool Use?

ReAct 框架里的 Action 步骤,本质上就是调用工具。Tool Use(工具调用)是 LLM Agentic 范式的核心能力之一。

工具可以是任何外部能力:

● 搜索引擎:Google、Bing,让模型能获取最新信息

● 计算器:精确处理数学运算(LLM 本身做数学经常出错)

● 代码执行器:运行 Python/JS 代码,处理数据、操作文件

● API 接口:天气、股票、地图、日历、邮件...几乎任何服务

● 数据库查询:SQL 查询、向量搜索

● 浏览器控制:截图、点击、填表单

3.2 Function Calling:工具调用的标准化

工具调用的标准化形式是 Function Calling(函数调用),由 OpenAI 于 2023 年引入并广泛采用。

其工作原理如下:

  1. 定义工具:用结构化格式(JSON Schema)描述工具的名称、功能和参数
csharp 复制代码
{
  "name": "get_weather",
  "description": "获取指定城市的当前天气",
  "parameters": {
    "city": {"type": "string", "description": "城市名称"}
  }
}
  1. 模型决策:LLM 看到工具定义和用户请求,决定是否调用工具以及传入什么参数
csharp 复制代码
{"tool": "get_weather", "arguments": {"city": "深圳"}}
  1. 执行并返回结果:程序执行工具,将结果返回给 LLM 继续处理
    这个流程将 LLM 的"语言理解和决策能力"与"外部系统的执行能力"优雅地结合在一起。
    3.3 工具调用的挑战
    工具调用看似简单,实际上有很多难点:
    ● 工具选择:当有几十个工具时,模型如何选对工具?
    ● 参数填写:模型可能填错参数类型或遗漏必要字段
    ● 错误处理:工具调用失败时,模型能否理解错误信息并重试?
    ● 多工具协同:复杂任务需要按正确顺序调用多个工具
    研究表明(arXiv:2401.07324),小参数量的 LLM 在工具调用方面相比大模型明显弱,这促使了多模型协同(Multi-LLM)架构的出现------用专门的小模型负责工具调用,大模型负责整体推理。

四、Harness(测试框架):让 Agent 行为可约束、可测量

4.1 什么是 Harness?

"Harness"字面意思是"驾具"(套在马身上控制方向的装置)。在 LLM Agent 领域,Harness 是一套围绕 Agent 构建的约束、测试和评估框架。

当 LLM 作为 Agent 运行时,它可能做出"违规"操作------比如在国际象棋比赛中走出非法棋步(arXiv:2603.03329 指出,Gemini-2.5-Flash 78% 的失败都是因为非法棋步),或在生产环境中误删数据。Harness 就是为了解决这类问题而设计的。

4.2 Harness 的核心组成

一个完整的 Agent Harness 通常包含:

(1)环境模拟层(Environment Simulator)

● 模拟 Agent 要操作的真实环境(网页、文件系统、API 等)

● 提供沙箱隔离,让 Agent 的危险操作不影响真实系统

● 记录 Agent 的所有操作日志

(2)动作约束层(Action Constraints)

● 定义哪些操作是合法的(Action Space)

● 在 Agent 尝试非法操作时立即拦截并返回错误

● 例如:棋类游戏 Harness 会检验棋步是否合规

(3)评估指标层(Evaluation Metrics)

● 任务完成率

● 操作效率(步骤数)

● 安全性(有无危险操作)

● 可信度(行动是否符合预期逻辑)

(4)基准测试(Benchmarks)

● 标准化的任务集,用于横向比较不同 Agent 的性能

● 常见基准:ALFWorld、WebArena、AgentBench、SWE-Bench 等

4.3 AutoHarness:自动生成约束

最新研究(arXiv:2603.03329)提出了 AutoHarness 的概念------用 LLM 自动为 Agent 生成代码约束(harness),替代手工编写规则。

其思路是:

  1. 观察 Agent 在某任务上的常见错误
  2. 用另一个 LLM 自动生成检查代码
  3. 将检查代码嵌入执行环境,实时验证 Agent 的行动合法性
    这大幅降低了为新任务编写 Harness 的人工成本。

五、Spec-Driven(规范驱动):用规范定义 Agent 的边界

5.1 什么是 Spec-Driven?

Spec-Driven(规范驱动) 是一种 Agent 开发方法论,强调在构建 Agent 之前,先用形式化或半形式化的方式定义:

● Agent 能做什么(能力边界)

● Agent 应该怎么做(行为规范)

● Agent 不能做什么(禁止行为)

● Agent 完成任务的判定标准(成功条件)

这些规范构成了 Agent 行为的"宪法"。

5.2 规范驱动的具体形式

(1)工具规范(Tool Specification)

用 OpenAPI / JSON Schema 等标准格式精确定义每个工具的接口:

● 输入参数类型和约束

● 输出格式

● 错误代码含义

● 副作用说明(如"此操作不可撤销")

(2)行为规范(Behavioral Spec)

用自然语言或伪代码描述 Agent 在各种情况下的预期行为:

规则1: 当用户请求删除文件时,必须先确认文件名和路径

规则2: 任何涉及外部付款的操作,必须获得用户二次确认

规则3: 不得访问用户未明确授权的文件目录

(3)任务规范(Task Spec)

定义任务的起始状态、目标状态和约束条件,让 Agent 知道"完成"意味着什么。

(4)安全规范(Safety Spec)

专门针对安全性的规范,防止 Agent 被恶意输入(Prompt Injection)劫持或执行有害操作。

5.3 为什么 Spec-Driven 很重要?

没有规范的 Agent 就像没有说明书的机器------也许能跑,但你不知道它什么时候会出问题。

规范驱动的好处:

● 可预测性:Agent 的行为在规范范围内是可预测的

● 可审计性:出了问题,可以检查 Agent 是否违反了哪条规范

● 可迭代:规范可以随产品演进而更新,不用重新训练模型

● 合规性:在金融、医疗等监管严格的领域,规范是合规的基础

六、Agentic 范式全景:更多核心概念

6.1 Plan-and-Execute(规划-执行架构)

ReAct 是一种"边想边做"的方式,而 Plan-and-Execute 则是先制定完整计划,再逐步执行:

csharp 复制代码
[Planner LLM] 接到任务 → 生成完整执行计划
[Executor LLM] 按计划逐步调用工具执行
[Verifier] 检查每步结果是否符合预期

这种架构适合需要长程规划的任务(如"帮我组织一场会议,包括找时间、发邀请、准备材料"),ReAct 则更适合需要随机应变的任务。

6.2 Multi-Agent(多智能体架构)

单个 Agent 受制于上下文长度和能力范围。Multi-Agent 架构将复杂任务拆分给多个专门的 Agent 协作完成:

csharp 复制代码
[Orchestrator Agent] 任务分发与协调
    ├── [Research Agent] 负责信息收集
    ├── [Code Agent]     负责代码编写
    ├── [QA Agent]       负责测试验证
    └── [Writer Agent]   负责报告撰写

代表框架:AutoGen、CrewAI、LangGraph。

6.3 Memory(记忆系统)

Agent 在执行过程中需要记住之前的信息,记忆系统分为四层:

csharp 复制代码
记忆类型	类比	实现方式
Sensory Memory	感官刺激	当前上下文窗口
Working Memory	工作记忆	中间变量、临时存储
Episodic Memory	情景记忆	向量数据库(记录历史对话/操作)
Semantic Memory	语义记忆	知识图谱、长期知识库

6.4 RAG(检索增强生成)

Retrieval-Augmented Generation 是一种将"检索"作为工具的特殊形式。Agent 在回答前,先从知识库中检索相关文档,再结合这些文档生成答案。

RAG 解决了 LLM 知识截止日期的问题,是企业 AI 应用中最常见的架构之一。

6.5 Reflection(自我反思)

受人类"元认知"启发,Reflection 机制让 Agent 周期性地审视自己之前的行动:

csharp 复制代码
[Agent 行动] → [结果不符合预期] → [Reflection: 分析哪里出了问题] → [修正策略,重试]

代表性工作:Reflexion(arXiv:2303.11366),让 Agent 将失败经验写入"记忆",在后续尝试中避免同样的错误。

七、ReAct 的局限与批评

公正地说,ReAct 并非完美。研究者也指出了它的一些问题:

(1)脆弱性(Brittleness)

Verma 等人(arXiv:2405.13966)发现,ReAct 的性能提升可能来自提示词中的表面特征,而非真正的推理能力提升。在分布外(Out-of-Distribution)的任务上,ReAct Agent 表现下降明显。

(2)幻觉传递

如果 Thought 步骤产生错误推理,后续的 Action 和 Observation 都会在错误基础上叠加,可能导致"越错越深"的情况。

(3)评估困难

Lee 等人(arXiv:2601.11903)指出,现有评估框架很难可靠地衡量 Agentic LLM 的可信度和协调性,特别是在多智能体场景下。

(4)Token 消耗大

Thought-Action-Observation 的交替循环会产生大量 token,成本较高,速度较慢。

八、实践:如何构建一个 ReAct Agent?

以一个简单的 Python 示例(使用 LangChain 框架)展示 ReAct 的实现:

from langchain.agents import create_react_agent

from langchain.tools import DuckDuckGoSearchTool, PythonREPLTool

from langchain_openai import ChatOpenAI

1. 定义工具

csharp 复制代码
tools = [
    DuckDuckGoSearchTool(),    # 搜索工具
    PythonREPLTool(),          # 代码执行工具
]

2. 初始化 LLM

csharp 复制代码
llm = ChatOpenAI(model="gpt-4", temperature=0)

3. 创建 ReAct Agent

agent = create_react_agent(llm=llm, tools=tools)

4. 运行

csharp 复制代码
result = agent.invoke({
    "input": "帮我查一下今年奥斯卡最佳影片,然后用 Python 统计片名的字符数"
})
print(result)
Agent 会自动执行:
Thought: 我需要先搜索今年奥斯卡获奖信息
Action: DuckDuckGoSearch("2026 Oscar Best Picture winner")
Observation: [搜索结果...]
Thought: 找到了,片名是 xxx,现在计算字符数
Action: PythonREPL("print(len('xxx'))")
Observation: 42
Thought: 任务完成
Final Answer: 今年奥斯卡最佳影片是 xxx,片名有 42 个字符

九、总结:Agentic AI 的大图景

核心洞察:

  1. ReAct 是基础:推理与行动的交织是 Agentic AI 的基本范式
  2. 工具是能力的延伸:LLM 本身有局限,工具调用让它无所不能
  3. 规范是安全的保障:没有约束的 Agent 是危险的,Harness 和 Spec 是工程化落地的必要条件
  4. 组合是未来方向:Multi-Agent + Memory + Reflection 的组合,正在让 AI 具备真正意义上的"自主完成复杂任务"的能力

参考文献

  1. Yao, S. et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629
  2. Plaat, A. et al. (2025). Agentic Large Language Models, a survey. arXiv:2503.23037
  3. Verma, M. et al. (2024). On the Brittle Foundations of ReAct Prompting for Agentic LLMs. arXiv:2405.13966
  4. Jiang, J. et al. (2024). KG-Agent: Autonomous Agent Framework for Complex Reasoning over KG. arXiv:2402.11163
  5. Lou, X. et al. (2026). AutoHarness: Improving LLM Agents by Automatically Synthesizing a Code Harness. arXiv:2603.03329
  6. Shinn, N. et al. (2023). Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366
  7. Lee, Y. et al. (2026). AEMA: Verifiable Evaluation Framework for Trustworthy and Controlled Agentic LLM Systems. arXiv:2601.11903
相关推荐
x-cmd2 小时前
[260416] 谷歌 Chrome 推出 Skills 功能!帮你保存、复用提示词
前端·chrome·ai·自动化·agent·x-cmd·skill
色空大师2 小时前
【Linux-安装nginx】
linux·运维·前端·nginx·部署
董董灿是个攻城狮2 小时前
封了几百万个账号的 Claude, 路走窄了
前端
Ruihong2 小时前
你的 Vue 3 TS 类型声明,VuReact 会处理成什么样的 React?
vue.js·react.js·面试
heytoo2 小时前
同一个模型,为什么结果差10倍?差的不是模型
前端·agent
霪霖笙箫2 小时前
「JS全栈AI学习」九、Multi-Agent 系统设计:架构与编排
前端·面试·全栈
慕斯fuafua2 小时前
CSS——定位
前端·css
Cache技术分享2 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
前端·后端
shadowcz0072 小时前
Chrome Skills 来了:把你的 AI 提示词变成一键工具
前端·人工智能·chrome