ReAct框架结合了推理(Reasoning)与行动(Action)来解决复杂任务。请阐述其核心思想,并解释为何该方法在处理需要多步推理和外部交互的任务时优于传统的纯提示(pure prompting)方法。
ReAct(Reasoning + Acting)是目前工业界最主流的 Agent 推理范式,通过交替的推理-行动-观察循环解决复杂任务。核心优势:强制 LLM 基于真实工具返回的数据推理,而不是凭训练记忆瞎编,大幅降低幻觉。相比单纯的 Chain-of-Thought(CoT),ReAct 能与外部环境真实交互。
ReAct 三步循环
输入:用户问题->
Thought(思考):分析当前情况,决定下一步行动
->
Action(行动):调用具体工具(search / calculator / text2sql / code_executor)
->
Observation(观察):接收工具真实返回结果
->
判断:信息够了吗?
|- 否 -> 返回 Thought,继续循环
|- 是 -> 生成 Final Answer
完整代码实现
class ReActInference:def __init__(self, model, tools, max_steps=30):
self.model = model
self.tools = tools
self.max_steps = max_steps
def run(self, question: str) -> dict:
messages = [
{"role": "system", "content": self._get_system_prompt()},
{"role": "user", "content": question}
]
for step in range(self.max_steps):
response = self.model.generate(messages)
messages.append({"role": "assistant", "content": response})
if "<answer>" in response:
return {"answer": self._extract_answer(response), "steps": step + 1}
tool_call = self._parse_tool_call(response)
if tool_call:
try:
observation = self.tools.execute(tool_call)
except TimeoutError:
observation = "工具调用超时,请尝试其他方法"
except Exception as e:
observation = f"工具调用失败: {str(e)}"
messages.append({
"role": "user",
"content": f"<tool_response>{observation}</tool_response>"
})
return {"answer": "达到最大步数,无法完成", "status": "max_steps_exceeded"}
ReAct vs CoT vs IterResearch
| 框架 | 核心思路 | 上下文增长 | 适用场景 |
|---|---|---|---|
| CoT | 纯内部推理链 | 线性增长 | 数学推理、逻辑题 |
| ReAct | 推理+工具调用交替 | 线性增长 | 多工具任务、信息检索 |
| IterResearch | 演进报告作为中央记忆 | 恒定不变 | 深度研究、长 horizon 任务 |
ReAct(累积式):Round N: [Q, T1, A1, O1, T2, A2, O2, ..., Tn, An, On] <- 上下文线性增长!
IterResearch(常量式):
Round N: [Q, Report_{N-1}, Action_{N-1}, Observation_{N-1}] <- 大小恒定!
关键:用「演进报告 Report」压缩整合前轮信息,每轮只保留固定大小的工作空间
CoT 是纯内部推理,不与外部环境交互。ReAct 在推理之间插入真实工具调用(搜索/计算/SQL),能获取实时信息和外部数据,解决了 LLM 知识截止和幻觉问题。
Agent 可能陷入「循环搜索同一个词」的死循环。解决方案:维护最近 N 条 query 的哈希,检测到重复时提示 LLM 「你已经搜索过这个了,结果是...」,让 LLM 换一个角度。
当多个来源的答案高度一致(置信度 > 0.85),可以提前终止,不用跑完 max_steps。提升响应速度,同时避免无效重复检索。
DeepResearch 的核心推理框架。将研究过程建模为 MDP,用「演进报告(Evolving Report)」作为中央记忆,每轮只保留 [问题 + 上轮报告 + 上轮动作 + 上轮观察],上下文大小恒定,支持 100+ 步深度研究。
被问ReAct 和 CoT 的区别,不要只说ReAct 多了 Action 步骤。正确答案:CoT 是模型内部的纯推理链,不与外部环境交互,适合数学推理。ReAct 在推理之间插入真实的工具调用——搜索引擎、SQL 执行器、代码解释器——能获取实时信息和外部数据。本质区别:CoT 解决『如何思考』,ReAct 解决『如何行动』。在我们的 DeepResearch 项目中,ReAct 的 Thought->Action->Observation 循环支撑了整个多轮迭代搜索逻辑,对于需要 100+ 步的深度研究任务,我们用 IterResearch(演进报告机制)解决了上下文溢出问题。