跳到主要内容

ReAct提示

Yao等人,2022 提出了一个名为ReAct的框架,其中LLM被用于以交错的方式生成推理轨迹任务特定动作

生成推理轨迹使模型能够诱导、跟踪和更新行动计划,甚至处理异常情况。行动步骤允许与外部来源(如知识库或环境)进行接口和信息收集。

ReAct框架可以使LLM与外部工具进行交互,检索额外信息,从而产生更可靠和准确的响应。

结果显示,ReAct在语言和决策任务上可以胜过几种最先进的基线模型。ReAct还提高了LLM的人类可解释性和可信度。总体而言,作者发现最佳方法是将ReAct与“思维链”(CoT)结合使用,允许在推理过程中使用内部知识和获取的外部信息。

工作原理

ReAct受到“行动”和“推理”之间的协同作用的启发,这使得人类能够学习新任务并做出决策或推理。

“思维链”(CoT)提示展示了LLM执行推理轨迹以回答涉及算术和常识推理等问题的能力,但其无法访问外部世界或无法更新知识可能导致问题,如事实幻觉和错误传播。

ReAct是一个将推理和行动与LLM结合的通用范式。ReAct提示LLM为任务生成口头推理轨迹和行动。这使系统能够执行动态推理,为行动创建、维护和调整计划,同时还能与外部环境(例如维基百科)进行交互,将额外信息纳入推理过程。下图显示了ReAct的示例以及执行问答所涉及的不同步骤。

REACT 图片来源:Yao等人,2022

在上述示例中,我们传递了一个提示,类似于来自HotpotQA的以下问题:

除了苹果遥控器,还有哪些设备可以控制最初设计用于与之交互的苹果遥控器的程序?

请注意,提示中还添加了上下文示例,但出于简单起见,我们在此省略。我们可以看到,模型生成了任务解决轨迹(思考,行动)。Obs表示与之交互的环境(例如搜索引擎)的观察。实质上,ReAct可以检索信息以支持推理,而推理有助于确定接下来检索什么。

ReAct提示

为了演示ReAct提示的工作原理,让我们按照论文中的一个示例进行操作。

第一步是从训练集(例如HotPotQA)中选择案例,并组成ReAct格式的轨迹。这些用作提示中的少量示例。轨迹由多个思考-行动-观察步骤组成,如上图所示。自由形式的思考用于实现不同任务,如分解问题、提取信息、执行常识/算术推理、引导搜索制定和综合最终答案。

以下是ReAct提示示例的样子(从论文中获取并简化为一个示例):

问题:科罗拉多造山运动的东部区域的海拔范围是多少?
思路1:我需要搜索科罗拉多造山运动,找到东部区域延伸的范围,然后找到该地区的海拔范围。
行动1:搜索[科罗拉多造山运动]
观察1:科罗拉多造山运动是科罗拉多及周边地区的一次造山运动事件。
思路2:它没有提到东部区域。所以我需要查找东部区域。
行动2:查找[东部区域]
观察2:(结果1 / 1)东部区域延伸至高原,被称为中央平原造山运动。
思路3:科罗拉多造山运动的东部区域延伸至高原。所以我需要搜索高原并找到其海拔范围。
行动3:搜索[高原]
观察3:高原指的是两个不同的陆地区域之一。
思路4:我需要改为搜索高原(美国)。
行动4:搜索[高原(美国)]
观察4:高原是大平原的一个子区域。从东到西,高原的海拔从约1,800到7,000英尺(550到2,130米)不等。[3]
思路5:高原的海拔从约1,800到7,000英尺,所以答案是1,800到7,000英尺。
行动5:完成[1,800到7,000英尺]
...

请注意,不同类型的任务使用不同的提示设置。对于需要推理能力的任务(例如 HotpotQA),任务解决轨迹使用多个思考-行动-观察步骤。对于涉及大量行动步骤的决策任务,思考步骤使用得较少。

知识密集型任务的结果

该论文首先评估了 ReAct 在知识密集型推理任务上的表现,例如问答(HotPotQA)和事实验证(Fever)。PaLM-540B 被用作提示的基础模型。

REACT1 图片来源:Yao et al., 2022

使用不同提示方法在 HotPotQA 和 Fever 上的提示结果显示,ReAct 在这两个任务上通常比仅涉及行动的 Act 表现更好。

我们还可以观察到,ReAct 在 Fever 上优于 CoT,但在 HotpotQA 上落后于 CoT。论文中提供了详细的错误分析。总结如下:

  • CoT 存在事实臆断
  • ReAct 的结构约束降低了其在制定推理步骤方面的灵活性
  • ReAct 高度依赖其检索的信息;无信息的搜索结果会使模型的推理出现偏差,并导致难以恢复和重新构思思路

将 ReAct 和 CoT+Self-Consistency 结合并支持在它们之间切换的提示方法通常优于所有其他提示方法。

决策任务的结果

该论文还报告了展示 ReAct 在决策任务上表现的结果。ReAct 在两个名为 ALFWorld(基于文本的游戏)和 WebShop(在线购物网站环境)的基准上进行了评估。这两个任务都涉及需要推理才能有效行动和探索的复杂环境。

需要注意的是,针对这些任务,ReAct 的提示设计不同,但仍保持了将推理和行动结合的核心思想。以下是涉及 ReAct 提示的 ALFWorld 问题的示例。

REACT2 图片来源:Yao et al., 2022

ReAct 在 ALFWorld 和 Webshop 上均优于 Act。没有任何思考的 Act 无法正确将目标分解为子目标。对于这些类型的任务,推理似乎对 ReAct 有利,但目前基于提示的方法在这些任务上仍远远落后于专业人类的表现。

详细结果请参阅论文。

LangChain 中的 ReAct 使用

以下是 ReAct 提示方法在实践中的高级示例。我们将使用 OpenAI 作为 LLM,LangChain 作为它已经内置了利用 ReAct 框架构建代理执行任务的功能。

首先,让我们安装并导入必要的库:

%%capture
# 更新或安装必要的库
!pip install --upgrade openai
!pip install --upgrade langchain
!pip install --upgrade python-dotenv
!pip install google-search-results

# 导入库
import openai
import os
from langchain.llms import OpenAI
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from dotenv import load_dotenv
load_dotenv()

# 加载 API 密钥;如果尚未获取,请获取这些密钥
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["SERPER_API_KEY"] = os.getenv("SERPER_API_KEY")

现在,我们可以配置 LLM、我们将使用的工具以及允许我们结合 ReAct 框架与 LLM 和工具一起使用的代理。

llm = OpenAI(model_name="text-davinci-003" ,temperature=0)
tools = load_tools(["google-serper", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

配置完成后,我们现在可以使用所需的查询/提示运行代理。请注意,这里不需要像论文中所解释的提供少量示例。

agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")

链式执行如下所示:

> 进入新的 AgentExecutor 链...
我需要找出奥利维亚·王尔德(Olivia Wilde)的男朋友是谁,然后计算他的年龄的0.23次方。
行动:搜索
行动输入:"奥利维亚·王尔德 男朋友"
观察:奥利维亚·王尔德在结束与杰森·苏戴奇斯(Jason Sudeikis)多年的订婚后开始与哈里·斯泰尔斯(Harry Styles)约会 — 请查看他们的恋情时间线。
思考:我需要找出哈里·斯泰尔斯的年龄。
行动:搜索
行动输入:"哈里·斯泰尔斯 年龄"
观察:29岁
思考:我需要计算29的0.23次方。
行动:计算器
行动输入:29^0.23
观察:答案:2.169459462491557

思考:我现在知道了最终答案。
最终答案:哈里·斯泰尔斯,奥利维亚·王尔德的男朋友,今年29岁,他的年龄的0.23次方是2.169459462491557。

> 链结束。

我们得到的输出如下:

"Harry Styles, Olivia Wilde 的男友,今年 29 岁,他的年龄提高到 0.23 次方后是 2.169459462491557。"

我们改编了这个例子,原文出自 LangChain 文档,特此致谢。我们鼓励学习者尝试不同的工具和任务组合。

你可以在这里找到这段代码的笔记本:https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb