ReAct Prompting
Yao et al., 2022 (在新标签页中打开) 引入了一个名为ReAct的框架,其中LLMs被用来以交替的方式生成推理轨迹和任务特定动作。
生成推理轨迹使模型能够归纳、跟踪和更新行动计划,甚至处理异常。行动步骤允许与知识库或环境等外部源进行交互并收集信息。
ReAct框架可以让LLMs与外部工具交互,以检索额外的信息,从而得到更可靠和基于事实的响应。
结果表明,ReAct在语言和决策任务上可以超越多个最先进的基线。ReAct还提高了LLMs的人类可解释性和可信度。总体而言,作者发现最佳方法是结合ReAct和思维链(CoT),这种方法允许使用内部知识和推理过程中获得的外部信息。
它是如何工作的?
ReAct 的灵感来自于“行动”和“推理”之间的协同作用,这使得人类能够学习新任务并做出决策或推理。
思维链(CoT)提示已经展示了大型语言模型(LLMs)在执行推理轨迹以生成涉及算术和常识推理等任务的问题答案方面的能力(Wei et al., 2022) (在新标签页中打开)。但其缺乏对外部世界的访问或无法更新其知识可能导致事实幻觉和错误传播等问题。
ReAct 是一种结合推理和行动的通用范式,利用大型语言模型(LLMs)。ReAct 提示 LLMs 生成任务的口头推理轨迹和行动。这使得系统能够进行动态推理,以创建、维护和调整行动计划,同时还能与外部环境(例如,维基百科)进行交互,将额外信息纳入推理中。下图展示了 ReAct 的一个示例以及执行问答所涉及的不同步骤。
图片来源: Yao et al., 2022 (在新标签页中打开)
在上面的例子中,我们传递了一个提示,类似于来自HotpotQA(在新标签页中打开)的以下问题:
Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?
请注意,上下文示例也被添加到提示中,但为了简单起见,我们在这里排除了这些示例。我们可以看到模型生成了任务解决轨迹(思考,行动)。Obs对应于与之交互的环境的观察结果(例如,搜索引擎)。本质上,ReAct可以检索信息以支持推理,而推理有助于确定接下来要检索的内容。
ReAct 提示
为了展示ReAct提示的工作原理,让我们跟随论文中的一个示例。
第一步是从训练集(例如,HotPotQA)中选择案例并编写ReAct格式的轨迹。这些轨迹被用作提示中的少量示例。轨迹由多个思考-行动-观察步骤组成,如上图所示。自由形式的思考用于实现不同的任务,如分解问题、提取信息、执行常识/算术推理、指导搜索公式的制定以及综合最终答案。
以下是ReAct提示示例的样子(从论文中获取并简化为一个示例以便理解):
Question What is the elevation range for the area that the eastern sector of the
Colorado orogeny extends into?
Thought 1 I need to search Colorado orogeny, find the area that the eastern sector
of the Colorado orogeny extends into, then find the elevation range of the
area.
Action 1 Search[Colorado orogeny]
Observation 1 The Colorado orogeny was an episode of mountain building (an orogeny) in
Colorado and surrounding areas.
Thought 2 It does not mention the eastern sector. So I need to look up eastern
sector.
Action 2 Lookup[eastern sector]
Observation 2 (Result 1 / 1) The eastern sector extends into the High Plains and is called
the Central Plains orogeny.
Thought 3 The eastern sector of Colorado orogeny extends into the High Plains. So I
need to search High Plains and find its elevation range.
Action 3 Search[High Plains]
Observation 3 High Plains refers to one of two distinct land regions
Thought 4 I need to instead search High Plains (United States).
Action 4 Search[High Plains (United States)]
Observation 4 The High Plains are a subregion of the Great Plains. From east to west, the
High Plains rise in elevation from around 1,800 to 7,000 ft (550 to 2,130
m).[3]
Thought 5 High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer
is 1,800 to 7,000 ft.
Action 5 Finish[1,800 to 7,000 ft]
...
请注意,不同类型的任务使用不同的提示设置。对于推理为主要任务的任务(例如,HotpotQA),使用多个思考-行动-观察步骤来解决任务轨迹。对于涉及大量行动步骤的决策任务,思考的使用较为稀疏。
知识密集型任务的结果
本文首先评估了ReAct在知识密集型推理任务上的表现,例如问答(HotPotQA)和事实验证(Fever (在新标签页中打开))。PaLM-540B被用作提示的基础模型。
图片来源: Yao et al., 2022 (在新标签页中打开)
在HotPotQA和Fever上使用不同提示方法的结果显示,ReAct通常在这两项任务上表现优于Act(仅涉及行动)。
我们还可以观察到,ReAct在Fever上表现优于CoT,而在HotpotQA上则落后于CoT。论文中提供了详细的错误分析。总结如下:
- CoT 受到事实幻觉的影响
- ReAct的结构约束降低了其在制定推理步骤时的灵活性
- ReAct 在很大程度上依赖于它检索到的信息;无信息量的搜索结果会扰乱模型的推理,导致难以恢复和重新构建思路
结合并支持在ReAct和CoT+自我一致性之间切换的提示方法通常优于所有其他提示方法。
决策任务的结果
该论文还报告了展示ReAct在决策任务上性能的结果。ReAct在两个基准测试上进行了评估,分别是ALFWorld(在新标签页中打开)(基于文本的游戏)和WebShop(在新标签页中打开)(在线购物网站环境)。两者都涉及复杂的环境,需要推理才能有效地行动和探索。
请注意,ReAct提示针对这些任务的设计有所不同,但仍然保持了结合推理和行动的核心思想。下面是一个涉及ReAct提示的ALFWorld问题的示例。
图片来源: Yao et al., 2022 (在新标签页中打开)
ReAct在ALFWorld和Webshop上的表现优于Act。Act没有任何思考,无法正确将目标分解为子目标。对于这类任务,推理似乎在ReAct中具有优势,但当前基于提示的方法仍然远远不及人类专家在这些任务上的表现。
查看论文以获取更详细的结果。
LangChain ReAct 使用
以下是一个高级示例,展示了ReAct提示方法在实际中的应用。我们将使用OpenAI作为LLM,并使用LangChain(在新标签页中打开),因为它已经内置了利用ReAct框架构建代理的功能,这些代理通过结合LLM和不同工具的力量来执行任务。
首先,让我们安装并导入必要的库:
%%capture
# update or install the necessary libraries
!pip install --upgrade openai
!pip install --upgrade langchain
!pip install --upgrade python-dotenv
!pip install google-search-results
# import libraries
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()
# load API keys; you will need to obtain these if you haven't yet
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["SERPER_API_KEY"] = os.getenv("SERPER_API_KEY")
现在我们可以配置LLM、我们将使用的工具,以及允许我们利用ReAct框架与LLM和工具一起工作的代理。请注意,我们正在使用搜索API来搜索外部信息,并将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?")
链式执行如下所示:
> Entering new AgentExecutor chain...
I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.
Action: Search
Action Input: "Olivia Wilde boyfriend"
Observation: Olivia Wilde started dating Harry Styles after ending her years-long engagement to Jason Sudeikis — see their relationship timeline.
Thought: I need to find out Harry Styles' age.
Action: Search
Action Input: "Harry Styles age"
Observation: 29 years
Thought: I need to calculate 29 raised to the 0.23 power.
Action: Calculator
Action Input: 29^0.23
Observation: Answer: 2.169459462491557
Thought: I now know the final answer.
Final Answer: Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23 power is 2.169459462491557.
> Finished chain.
我们得到的输出如下:
"Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23 power is 2.169459462491557."
我们改编了来自LangChain文档(在新标签页中打开)的示例,因此功劳归他们所有。我们鼓励学习者探索不同的工具和任务组合。
你可以在这里找到此代码的笔记本:https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb (在新标签页中打开)