|
|
|
@ -0,0 +1,178 @@
|
|
|
|
|
# ReAct Prompting
|
|
|
|
|
|
|
|
|
|
import { Callout, FileTree } from 'nextra-theme-docs'
|
|
|
|
|
import {Screenshot} from 'components/screenshot'
|
|
|
|
|
import REACT from '../../img/react.png'
|
|
|
|
|
import REACT1 from '../../img/react/table1.png'
|
|
|
|
|
import REACT2 from '../../img/react/alfworld.png'
|
|
|
|
|
|
|
|
|
|
[Yao и др., 2022](https://arxiv.org/abs/2210.03629) представили фреймворк под названием ReAct, в котором использовались LLM для генерации *следов рассуждений* и *задачно-специфичных действий* в интерактивной манере.
|
|
|
|
|
|
|
|
|
|
Генерация следов рассуждений позволяет модели создавать, отслеживать и обновлять планы действий, а также обрабатывать исключительные ситуации. Действия позволяют взаимодействовать с внешними источниками информации, такими как базы знаний или окружения.
|
|
|
|
|
|
|
|
|
|
Фреймворк ReAct позволяет LLM взаимодействовать с внешними инструментами для получения дополнительной информации, что приводит к более надежным и фактическим ответам.
|
|
|
|
|
|
|
|
|
|
Результаты показывают, что ReAct может превзойти несколько современных базовых решений в языковых задачах и задачах на принятия решений. ReAct также приводит к улучшенной человеко-интерпретируемости и надежности LLM. В целом авторы обнаружили, что наилучшим подходом является использование ReAct в сочетании с цепочкой мыслей (CoT), что позволяет использовать как внутренние знания, так и внешнюю информацию, полученную в процессе рассуждения.
|
|
|
|
|
|
|
|
|
|
## Как это работает?
|
|
|
|
|
|
|
|
|
|
ReAct вдохновлен взаимодействием между "действием" и "рассуждением", которое позволяет людям изучать новые задачи и принимать решения или рассуждать.
|
|
|
|
|
|
|
|
|
|
Промптинг цепочкой мыслей (CoT) продемонстрировал возможности LLM для проведения следов рассуждений и генерации ответов на вопросы, включающих арифметическое и общезначимое рассуждение, среди других задач [(Wei и др., 2022)](https://arxiv.org/abs/2201.11903). Однако его ограниченный доступ к внешнему миру или невозможность обновления знаний могут приводить к проблемам, таким как выдумывание фактов и распространение ошибок.
|
|
|
|
|
|
|
|
|
|
ReAct - это общая парадигма, объединяющая рассуждение и действие с помощью LLM. ReAct побуждает LLM генерировать вербальные следы рассуждений и действий для задачи. Это позволяет системе выполнять динамическое рассуждение для создания, поддержки и корректировки планов действий, а также обеспечивает взаимодействие с внешними средами (например, Википедия), чтобы включить дополнительную информацию в рассуждение. На приведенной ниже схеме показан пример ReAct и различные шаги, необходимые для выполнения вопросно-ответной задачи.
|
|
|
|
|
|
|
|
|
|
<Screenshot src={REACT} alt="REACT" />
|
|
|
|
|
Источник изображения: [Yao и др., 2022](https://arxiv.org/abs/2210.03629)
|
|
|
|
|
|
|
|
|
|
В приведенном выше примере мы передаем подобный вопрос, взятый из [HotpotQA](https://hotpotqa.github.io/):
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Обратите внимание, что для простоты мы не включаем примеры контекста. Мы видим, что модель генерирует *траектории решения задач* (Мысли, Действия). Обозначение Obs соответствует наблюдениям из взаимодействующей среды (например, поисковой системы). По сути, ReAct может извлекать информацию для поддержки рассуждений, а рассуждение помогает определить, что следует извлекать далее.
|
|
|
|
|
|
|
|
|
|
## ReAct Prompting
|
|
|
|
|
Чтобы продемонстрировать, как работает промптинг 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](https://fever.ai/resources.html)). В качестве базовой модели для промптинга используется PaLM-540B.
|
|
|
|
|
|
|
|
|
|
<Screenshot src={REACT1} alt="REACT1" />
|
|
|
|
|
Источник изображения: [Yao и др., 2022](https://arxiv.org/abs/2210.03629)
|
|
|
|
|
|
|
|
|
|
Результаты промптинга на HotPotQA и Fever с использованием разных методов промптинга показывают, что ReAct в целом работает лучше, чем только действие (Act) в обеих задачах.
|
|
|
|
|
|
|
|
|
|
Можно также заметить, что ReAct превосходит CoT на задаче Fever, но уступает CoT на HotpotQA. Подробный анализ ошибок представлен в статье. В кратком виде:
|
|
|
|
|
|
|
|
|
|
- CoT страдает от выдумывания фактов
|
|
|
|
|
- Структурное ограничение ReAct уменьшает его гибкость в формулировке рассуждений
|
|
|
|
|
- ReAct сильно зависит от получаемой информации; неинформативные результаты поиска сбивают модель с рассуждения и затрудняют восстановление и переформулировку мыслей
|
|
|
|
|
|
|
|
|
|
Методы промптинга, которые комбинируют и поддерживают переключение между ReAct и CoT+Self-Consistency, в целом показывают лучшие результаты по сравнению с другими методами промптинга.
|
|
|
|
|
|
|
|
|
|
## Результаты на задачах принятия решений
|
|
|
|
|
|
|
|
|
|
Статья также представляет результаты, демонстрирующие производительность ReAct на задачах принятия решений. ReAct оценивается на двух бенчмарках, называемых [ALFWorld](https://alfworld.github.io/) (текстовая игра) и [WebShop](https://webshop-pnlp.github.io/) (среда онлайн-шопинга). Оба они включают сложные среды, требующие рассуждения для эффективного действия и исследования.
|
|
|
|
|
|
|
|
|
|
Обратите внимание, что промпты ReAct разработаны по-разному для этих задач, сохраняя ту же основную идею объединения рассуждения и действия. Вот пример проблемы ALFWorld, включающей промпт ReAct.
|
|
|
|
|
|
|
|
|
|
<Screenshot src={REACT2} alt="REACT2" />
|
|
|
|
|
Источник изображения: [Yao и др., 2022](https://arxiv.org/abs/2210.03629)
|
|
|
|
|
|
|
|
|
|
ReAct превосходит Act как на ALFWorld, так и на Webshop. Act, без мыслей, не может правильно разложить цели на подцели. Рассуждение оказывается выгодным для этих типов задач, но текущие методы промптинга все еще значительно отстают от профессиональных людей в выполнении этих задач.
|
|
|
|
|
|
|
|
|
|
Для получения более подробных результатов рекомендуется обратиться к статье.
|
|
|
|
|
|
|
|
|
|
## Использование ReAct в LangChain
|
|
|
|
|
|
|
|
|
|
Ниже приведен пример того, как подход промптинга ReAct работает на практике. Мы будем использовать OpenAI для LLM и [LangChain](https://python.langchain.com/en/latest/index.html), так как в нем уже есть встроенные функции, которые используют фреймворк ReAct для создания агентов, выполняющих задачи, объединяя мощность LLM и различных инструментов.
|
|
|
|
|
|
|
|
|
|
Сначала установим и импортируем необходимые библиотеки:
|
|
|
|
|
|
|
|
|
|
``` python
|
|
|
|
|
%%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["SERPAPI_API_KEY"] = os.getenv("SERPAPI_API_KEY")
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Теперь мы можем настроить LLM, инструменты, которые мы будем использовать, и агента, который позволяет нам использовать фреймворк ReAct вместе с LLM и инструментами. Обратите внимание, что мы используем API поиска для поиска внешней информации и LLM в качестве математического инструмента.
|
|
|
|
|
|
|
|
|
|
``` python
|
|
|
|
|
llm = OpenAI(model_name="text-davinci-003" ,temperature=0)
|
|
|
|
|
tools = load_tools(["serpapi", "llm-math"], llm=llm)
|
|
|
|
|
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
После настройки мы можем запустить агента с желаемым запросом/промптом. Обратите внимание, что здесь не требуется предоставлять экземпляры с малым количеством примеров, как объясняется в статье.
|
|
|
|
|
|
|
|
|
|
``` python
|
|
|
|
|
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Цепочка выполнения выглядит следующим образом:
|
|
|
|
|
|
|
|
|
|
``` yaml
|
|
|
|
|
> 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://python.langchain.com/en/latest/modules/agents/getting_started.html), поэтому заслуги принадлежат им. Мы рекомендуем исследовать различные комбинации инструментов и задач.
|
|
|
|
|
|
|
|
|
|
Вы можете найти ноутбук для этого кода здесь: https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb
|