ReAct: 在语言模型中协同推理与行动

论文概述

ReAct引入了一种范式,其中大型语言模型以交错的方式生成推理轨迹和特定任务的行动,在两种能力之间创造协同效应。推理轨迹帮助模型推导、跟踪和更新行动计划,同时处理异常情况,而行动允许它与外部源(如知识库或环境)交互以收集额外信息。这种方法克服了纯推理或纯行动方法的局限性,在可解释性和可信度方面取得了显著改进。

论文信息:

  • 发布时间:2022-10-06
  • 作者:Shunyu Yao, Jeffrey Zhao, Dian Yu等
  • 机构:Princeton University, Google Research
  • 研究方向:提示工程 (Prompt Engineering), 大型语言模型推理 (LLM Reasoning)
  • 核心技术:推理与行动协同 (ReAct)

研究背景

大型语言模型在各类任务中展现出强大的能力,但纯推理方法容易产生幻觉,而纯行动方法缺乏规划能力。本研究针对以下问题展开:

现有问题

  • 纯思维链推理容易产生幻觉和错误传播
  • 缺乏与外部环境和知识源的交互能力
  • 难以在推理和执行之间找到平衡

研究动机

本研究旨在探索推理和行动的协同方式,使模型既能进行深思熟虑的推理,又能与外部源交互以获取信息和验证结果,特别关注ReAct、推理 (reasoning)、行动 (acting) 等关键技术。

核心方法

方法概述

ReAct提示大型语言模型以交错的方式生成推理轨迹和特定任务的行动。推理轨迹指导模型创建、跟踪和更新行动计划,同时处理异常情况。行动使模型能够与外部源交互(例如,用于问答任务的维基百科API,或用于决策任务的环境),允许模型收集额外信息并在事实知识中根植其推理。

本方法的核心在于将内部推理和外部行动有机结合,形成一个迭代的思考-行动循环。

关键创新点

创新 1:引入ReAct范式,以交错方式协同推理和行动

创新 2:使大型语言模型能够与外部知识库和环境交互

创新 3:克服思维链推理中的幻觉和错误传播问题

创新 4:在ALFWorld和WebShop基准测试上分别实现34%和10%的绝对成功率提升

创新 5:仅用1-2个上下文示例就能生成类人的、可解释的任务解决轨迹

技术特点

  • 推理与行动结合:内部思考和外部交互相互促进
  • 减少幻觉:通过外部知识验证降低幻觉
  • 可解释性强:清晰的推理和行动轨迹
  • 灵活交互:支持多种外部工具和环境
  • 少样本高效:仅需1-2个示例即可工作

实验结果

Benchmark 性能

在四个不同的任务上进行了评估:(1) 问答(HotpotQA)和事实验证(Fever)- 配合维基百科API的ReAct克服了CoT中的幻觉问题;(2) 交互式决策(ALFWorld和WebShop)- ReAct仅用1-2个示例就在成功率上超越模仿学习和强化学习34%和10%。结果表明,相比基线方法,在准确性、可解释性和可信度方面都有改进。

性能分析

实验结果表明,该方法在多个主流基准测试上都取得了显著的性能提升,特别是在需要与外部交互的任务上表现突出。

关键发现

  • 协同效应明显:推理和行动相互促进,优于单独使用
  • 减少幻觉:外部知识验证有效减少错误
  • 可解释性提升:清晰展示决策过程
  • 泛化能力强:适用于不同类型的任务和环境

实际应用

适用场景

  • 知识密集型问答:需要查询外部知识库的问答
  • 事实验证:验证陈述的真实性
  • 交互式任务:需要与环境交互的决策任务
  • 工具使用:调用外部工具和API完成任务

实现建议

在实际项目中应用ReAct时,建议:

  1. 设计行动空间:明确定义可用的外部行动
  2. 结构化提示:清晰区分推理步骤和行动步骤
  3. 迭代优化:根据任务特点调整推理-行动循环
  4. 错误处理:设计异常情况的处理机制

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# ReAct实现示例
def react_agent(model, question, max_steps=10):
prompt = f"Question: {question}\n"

for step in range(max_steps):
# 生成推理
thought_prompt = prompt + "Thought:"
thought = model.generate(thought_prompt)
prompt += f"Thought: {thought}\n"

# 决定行动
action_prompt = prompt + "Action:"
action = model.generate(action_prompt)
prompt += f"Action: {action}\n"

# 如果得出最终答案,退出
if action.startswith("Answer:"):
return action[8:].strip()

# 执行行动,获取观察
observation = execute_action(action)
prompt += f"Observation: {observation}\n"

return "未找到答案"

# 示例:使用维基百科查询
def execute_action(action):
if action.startswith("Search["):
query = extract_query(action)
return wikipedia_search(query)
elif action.startswith("Lookup["):
term = extract_term(action)
return lookup_in_page(term)
# 其他行动...

相关资源

  • arXiv 论文arXiv:2210.03629
  • 相关论文:Chain-of-Thought Prompting、Toolformer、WebGPT
© 2025 Generative AI Discovery All Rights Reserved.
Theme by hiero