Skip to content

高频面试题

ReAct 是什么?说说它的原理

ReAct 是理解工具型 Agent 的最小骨架:模型不再一次性给答案,而是在推理、行动、观察之间反复闭环。

适合阶段:Agent 核心理论 / 工具调用面核心能力:Reasoning · Acting · Observation · Agent Loop · Reliability

面试官角度分析,想考什么

  • ReAct 是什么?原理是什么?
    考 Thought -> Action -> Observation 循环,而不是一次性生成答案。

  • 它为什么能减少幻觉?和 CoT、Function Calling 什么关系?
    考接地:事实来自观察;Function Calling 是把 Action 结构化的工业化形态。

  • 缺点和现代用法是什么?
    考循环、成本和短视;现代 Agent loop 底层仍是 ReAct。

可直接抄走的 30 秒参考答案

text
ReAct 是 Reasoning and Acting 的组合,核心是让模型按“Thought -> Action -> Observation”的循环工作。Thought 负责判断当前缺什么信息和为什么要行动,Action 调用搜索、工具、浏览器或代码执行器,Observation 把真实环境反馈给模型,然后模型再决定下一步。它比纯 CoT 更适合 Agent,因为事实可以由工具接地,错误可以在下一轮修正。现代 function calling 可以看成把 ReAct 里的 Action 从文本格式升级成结构化工具调用,但底层循环仍然是 ReAct。

面试回答详解,知其所以然

这篇更偏“原理解释”,和“如何让 Agent 更可靠”相比,重点放在 ReAct 的内部循环、为什么 Thought 和 Action 要交替,以及它如何演化成现代工具调用 Agent。

1. ReAct 的来源和定义

ReAct 来自论文 Synergizing Reasoning and Acting in Language Models。名字里的 Re 指 Reasoning,Act 指 Acting。

核心思想:

  • 模型先生成推理轨迹,明确当前状态和下一步目标。
  • 模型再选择一个动作,比如搜索、查数据库、浏览网页、调用工具。
  • 外部环境返回观察结果。
  • 模型基于新观察继续推理和行动。

经典格式是:

text
Thought: 我需要先确认这个事实。
Action: search("...")
Observation: 搜索结果返回了证据。
Thought: 还缺第二个条件,需要继续查询。
Action: lookup("...")
Observation: 找到第二条证据。
Final Answer: 基于证据回答。

格式可以变化,但“推理和行动交替”是本质。

2. 为什么要交替,而不是先想完再行动

很多真实任务在执行前并不知道完整路径:

  • 搜索结果可能没有命中。
  • 页面可能需要登录。
  • 数据库可能没有目标字段。
  • 工具可能报错。
  • 用户问题可能缺条件。

如果模型先写一大段计划,再完全照计划做,很容易被环境变化打断。ReAct 的做法是短步前进:

text
局部推理 -> 小动作 -> 环境反馈 -> 修正下一步

这让 Agent 能在不确定环境里边做边调整。

3. Thought、Action、Observation 各自负责什么

  • Thought:内部决策层。说明当前理解、缺失信息、工具选择理由和下一步策略。
  • Action:外部交互层。调用搜索、数据库、浏览器、代码执行器、MCP tool 等能力。
  • Observation:环境反馈层。工具结果、网页内容、错误信息、执行输出、状态变化。
  • Final Answer:收束层。证据足够时停止循环,给用户可读结果。

它们之间的关系是:

text
Thought 负责决定要验证什么
Action 负责去外部世界验证
Observation 负责纠正模型的下一步 Thought

这也是 ReAct 比纯闭卷回答更适合 Agent 的原因。

4. ReAct 如何降低幻觉

ReAct 不是让模型“更聪明”,而是改变事实来源。

  • 纯生成:模型直接从参数记忆里回答,知识过期或模糊时容易编造。
  • CoT:模型能推理得更连贯,但事实仍可能来自模型内部记忆。
  • ReAct:模型把不确定事实交给工具查询,答案基于 Observation。

它还有闭环纠错能力:

  • 第一次搜索无结果,换 query。
  • 工具报错,调整参数。
  • 两个来源冲突,继续交叉验证。
  • 信息不足,向用户追问。

所以 ReAct 的价值在于“接地”和“反馈”,而不是 Thought 文本本身。

5. 和 Function Calling 的关系

早期 ReAct 常用文本格式表达动作:

text
Action: search[query]

工程上需要用正则或 parser 解析,容易出错。现代模型 API 的 Function Calling / Tool Calling 把 Action 变成结构化字段:

text
模型返回 tool_calls
Runtime 执行工具
工具结果作为 observation 回灌
模型继续生成或调用下一步

因此可以说:

  • ReAct:一种推理与行动交替的范式。
  • Function Calling:把 Action 工程化为结构化工具调用的 API 机制。
  • Agent Runtime:负责循环、状态、停止条件、工具执行和错误处理。

Function Calling 没有淘汰 ReAct,它把 ReAct 的动作解析变稳了。

6. 失败模式和工程护栏

ReAct 也会失败:

  • 死循环:反复调用同一工具或同一 query。
  • 观察误读:把无关或过期结果当证据。
  • Thought 幻觉:推理里编出 Observation 没有的信息。
  • 过早结束:证据不够就 Final。
  • 长任务漂移:一步步做着做着忘了总目标。
  • 成本高:每步都要模型推理和工具调用。

护栏设计:

  • 最大步数、token 预算和超时。
  • 动作签名去重,重复调用触发换策略。
  • 证据槽位,关键问题没证据不能结束。
  • 工具返回带来源、时间和置信度。
  • 长任务外层用 Plan-and-Execute,局部用 ReAct。
  • trace 记录每步动作、参数、观察和停止原因。

面试官追问3个问题

追问一:ReAct 和 Chain-of-Thought 最大区别是什么?

  • 考察点:外部行动和环境反馈。
  • 回答方向:CoT 主要让模型内部推理更连贯;ReAct 让模型推理后执行外部动作,并用 Observation 修正下一步。需要事实和环境交互时,ReAct 更合适。

追问二:有了 Function Calling,ReAct 还重要吗?

  • 考察点:范式和工程机制分层。
  • 回答方向:重要。Function Calling 解决 Action 的结构化表达和解析,ReAct 解决“为什么多轮行动、观察、再决策”的循环范式。现代工具型 Agent 本质仍是 ReAct loop。

追问三:ReAct 怎么防止无限循环?

  • 考察点:停止条件设计。
  • 回答方向:外层 runtime 设置 max steps、token budget、超时、重复动作检测和证据槽位;循环停止不能只依赖模型自觉。卡住时换策略、降级、追问用户或失败返回。

扩展知识

ReAct 的最小伪代码

python
state = {"messages": [user_goal], "observations": []}

for step in range(max_steps):
    decision = model.next(state)
    if decision.type == "final":
        return decision.answer

    result = tool_executor.call(decision.tool, decision.args)
    state["observations"].append(result)

return ask_user_or_fail("Reached step limit")

真实系统会把这里的 statetool_executormax_steps、错误处理、审批和 trace 做得更复杂。

ReAct 和 Agent Loop 的关系

text
ReAct prompt 格式
  -> 结构化 tool calling
  -> Agent loop 状态机
  -> 加入 memory / planning / reflection / multi-agent

ReAct 是最小闭环,现代 Agent 是在这个闭环上补状态管理、权限、安全、可观测性和评估。

Thought 是否要展示给用户

生产产品通常不会逐字展示完整内部推理。更常见的是展示:

  • 做了哪些步骤。
  • 调用了哪些工具。
  • 引用了哪些证据。
  • 为什么得出结论的简短理由。

内部 trace 可以保存结构化过程,但用户可见内容要避免泄露系统提示、敏感信息或不稳定推理。

基于 MIT 协议开源