🚀 在我们的新课程中掌握提示工程并构建 AI Agent!使用 PROMPTING20 优惠码可享 8 折优惠 ➜ 立即报名

ReAct 提示词

Yao 等人,2022 年 (在新标签页中打开) 引入了一个名为 ReAct 的框架,其中 LLM 用于以交错的方式生成推理轨迹任务特定行动

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

ReAct 框架使 LLM 能够与外部工具交互,检索额外信息,从而生成更可靠、更符合事实的回应。

结果表明,ReAct 在语言和决策任务上优于多个最先进的基线方法。ReAct 还提高了 LLM 的人类可解释性和可信度。总的来说,作者发现最佳方法是 ReAct 与思维链(CoT)结合使用,这样可以在推理过程中同时利用内部知识和获取的外部信息。

工作原理

ReAct 的灵感来源于“行动”和“推理”之间的协同作用,这使得人类能够学习新任务并进行决策或推理。

思维链(CoT)提示词已展示了 LLM 进行推理轨迹以生成涉及算术和常识推理等问题答案的能力 (Wei 等人,2022 年) (在新标签页中打开)。但由于缺乏对外部世界的访问或无法更新其知识,可能导致事实幻觉和错误传播等问题。

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

REACT

图片来源:Yao 等人,2022 年 (在新标签页中打开)

在上面的示例中,我们传递了一个提示词,例如来自 HotpotQA (在新标签页中打开) 的以下问题

Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?

请注意,提示词中也添加了上下文示例,但为简单起见,此处已省略。我们可以看到模型生成了任务解决轨迹(思考,行动)。Obs 对应于与环境(例如搜索引擎)交互后获得的观察结果。本质上,ReAct 可以检索信息来支持推理,而推理则有助于确定下一步检索什么。

🎓

在我们的新 AI 课程中了解更多关于 ReAct 提示词和 ReAct agent 的信息。立即加入! (在新标签页中打开) 使用优惠码 PROMPTING20 可额外享受 8 折优惠。

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 被用作提示的基础模型。

REACT1

图片来源:Yao 等人,2022 年 (在新标签页中打开)

使用不同提示方法在 HotPotQA 和 Fever 上的提示结果表明,ReAct 在两项任务上普遍优于 Act(仅涉及行动)方法。

我们还可以观察到,ReAct 在 Fever 上优于 CoT,但在 HotpotQA 上略逊于 CoT。论文中提供了详细的错误分析。总而言之

  • CoT 存在事实幻觉问题
  • ReAct 的结构约束降低了其在制定推理步骤时的灵活性
  • ReAct 在很大程度上依赖于其检索到的信息;非信息性的搜索结果会使模型的推理偏离方向,并导致难以恢复和重新制定思考过程

结合并支持在 ReAct 和 CoT+自我一致性之间切换的提示方法通常优于所有其他提示方法。

决策任务上的结果

论文还报告了 ReAct 在决策任务上的表现结果。ReAct 在两个基准测试中进行了评估,分别是 ALFWorld (在新标签页中打开)(基于文本的游戏)和 WebShop (在新标签页中打开)(在线购物网站环境)。这两者都涉及复杂的环境,需要推理才能有效行动和探索。

请注意,针对这些任务,ReAct 提示词的设计有所不同,但仍保留了结合推理和行动的同一个核心思想。下面是一个涉及 ReAct 提示词的 ALFWorld 问题示例。

REACT2

图片来源:Yao 等人,2022 年 (在新标签页中打开)

ReAct 在 ALFWorld 和 Webshop 上均优于 Act。Act 在没有任何思考的情况下,未能正确地将目标分解为子目标。对于这些类型的任务,推理在 ReAct 中似乎具有优势,但目前基于提示的方法与人类专家在这些任务上的表现仍有很大差距。

请查阅论文以获取更详细的结果。

LangChain 中的 ReAct 用法

以下是一个关于 ReAct 提示方法如何在实践中工作的高层次示例。我们将使用 OpenAI 作为 LLM,并使用 LangChain (在新标签页中打开),因为它已经内置了利用 ReAct 框架构建 Agent 的功能,这些 Agent 通过结合 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 和工具结合使用的 Agent。请注意,我们使用搜索 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。请注意,此处我们不需要像论文中所解释的那样提供少样本示例。

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 (在新标签页中打开)

🎓

在我们的新 AI 课程中了解更多关于 ReAct 提示词和 ReAct agent 的信息。立即加入! (在新标签页中打开) 使用优惠码 PROMPTING20 可额外享受 8 折优惠。