# ReAct Prompting

В 2022 году[Yao и др., 2022](https://arxiv.org/abs/2210.03629) представили фреймворк под названием ReAct, в котором использовали большие языковые модели (LLM) для формирования последовательности рассуждений и действий, нацеленных на конкретные задачи, в интерактивном режиме.

Генерация последовательности рассуждений позволяет модели формировать, отслеживать и обновлять планы действий, а также обрабатывать исключительные ситуации. Действия предоставляют возможность взаимодействия с внешними источниками информации, такими как базы знаний или окружение.

Фреймворк ReAct дает возможность большим языковым моделям (LLM) взаимодействовать с внешними инструментами для получения дополнительной информации, что приводит к более надежным и фактически обоснованным ответам.

Проще говоря, представьте, что у нас есть умная программа, которая умеет думать и принимать решения. Она может создавать планы и следить за ними, даже если что-то идет не так. Она также может выполнять действия, используя информацию извне, например, из баз данных. ReAct - это как помощник для этой программы. Он помогает ей получать дополнительную информацию извне, чтобы давать более надежные и правильные ответы.

Исследования показывают, что ReAct работает лучше, чем другие подходы, когда дело касается языковых задач и принятия решений. Он также делает результаты более понятными для людей и делает большие языковые модели более надежными. В общем, авторы выяснили, что самый эффективный способ - это использовать ReAct совместно с промптингом цепочки мыслей (CoT), чтобы модель могла комбинировать свои знания с дополнительной информацией для более точных ответов.\\

## Как это работает?

***

ReAct черпает свою идею из взаимодействия между "действием" и "рассуждением", которое позволяет людям изучать новые задачи, принимать решения и анализировать ситуации.

Использование метода промптинга цепочкой мыслей (CoT) демонстрирует, что большие языковые модели (LLM) успешно могут проводить логические рассуждения и генерировать ответы на вопросы, включая задачи с арифметическими и общими логическими рассуждениями, среди других задач [(Wei и др., 2022)](https://arxiv.org/abs/2201.11903). Однако ограниченный доступ к внешнему миру или отсутствие возможности обновления знаний могут вызывать проблемы, такие как вымышленные факты и распространение ошибок.

ReAct - это общая концепция, которая объединяет рассуждение и действие с помощью больших языковых моделей (LLM). ReAct стимулирует LLM генерировать речевые следы рассуждений и действий для решения задачи. Этот подход позволяет системе проводить динамические рассуждения для создания, поддержки и корректировки планов действий. Также ReAct позволяет взаимодействовать с внешними средами, например, Википедией, чтобы включить дополнительную информацию в процесс рассуждения. На приведенной ниже схеме показан пример использования ReAct и различные этапы, которые нужно пройти для выполнения звопросно-ответной задачи.

<figure><img src="https://3840355729-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgFPj8AgoQsj90ueaMFr7%2Fuploads%2FMILHZ5scwrzaBUqJCIoA%2F%D1%81%D0%BA%D1%80%D0%B8%D0%BD%202.png?alt=media&#x26;token=ca1eca9b-10f6-4989-b789-9b3f418cdbbf" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3840355729-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgFPj8AgoQsj90ueaMFr7%2Fuploads%2FU0tT0A4zHQH4GP9XvQcP%2Fcrhby%202%D0%B1.jpg?alt=media&#x26;token=aeba3510-e2ac-4aac-b712-b779e3e96eae" alt=""><figcaption></figcaption></figure>

Источник изображения: [Yao и др., 2022](https://arxiv.org/abs/2210.03629)

В приведенном выше примере мы передаем подобный вопрос, взятый из [HotpotQA](https://hotpotqa.github.io/):

{% hint style="info" %}
Кроме пульта Apple Remote, какие другие устройства могут управлять программой, для которой изначально создавался пульт Apple Remote?
{% endhint %}

Обратите внимание, что для упрощения мы не включаем примеры контекста. Мы видим, что модель создает пути решения задач (Рассуждение, Действия). Обозначение "Obs" означает наблюдения из взаимодействующей среды (например, поисковой системы). По сути, ReAct может извлекать информацию, чтобы поддержать рассуждения, а рассуждение помогает определить, какую информацию следует извлекать далее.

## ReAct промптинг

***

Чтобы продемонстрировать, как работает ReAct промптинг, давайте рассмотрим пример из статьи.

Первый шаг - выбрать примеры из учебных материалов (например, из HotPotQA) и создать путь в формате ReAct. Путь представляет собой последовательность шагов: рассуждение - действие - наблюдение. Это как инструкция с пошаговыми действиями. Мы используем разные способы мышления для решения разных задач, например, разбор вопроса, нахождение информации, логическое/арифметическое рассуждение, создание поискового запроса и формирование окончательного ответа.

> *HotPotQA - это набор данных, который используется для обучения и тестирования систем искусственного интеллекта на задаче вопросов и ответов. В этом наборе данных содержатся вопросы и текстовые параграфы с информацией, из которых нужно извлечь ответы на вопросы. Это помогает компьютерам научиться понимать вопросы, анализировать тексты и находить правильные ответы. Набор данных HotPotQA предоставляет реальные задачи, с которыми искусственный интеллект может справляться.*

Вот пример траекторий ReAct-промпта (полученный из статьи и сокращенный до одного примера для простоты):

{% hint style="info" %}
**Вопрос:** В пределах какой высоты находится территория, в которую простирается восточный сектор Колорадской орогении?

**Рассуждение 1:** Мне нужно найти информацию о Колорадской орогении, выяснить, в какой район простирается восточный сектор этой орогении, а затем определить диапазон высот для этой территории.

**Действие 1:** Поиск \[Колорадская орогения]

**Наблюдение 1:** Колорадская орогения была периодом поднятия гор (орогения) в штате Колорадо и прилегающих районах.

**Рассуждение 2:** В нем не упоминается восточный сектор. Так что мне нужно найти информацию о восточном секторе.

**Действие 2:** Поиск информации о \[восточном секторе]

**Наблюдение 2:** (Результат 1 / 1) Восточный сектор простирается на Великие равнины и называется Центральная равнина орогении.

**Рассуждение 3:** Восточный сектор Колорадской орогении простирается на Великие равнины. Теперь мне нужно найти информацию о Великих равнинах и их высотном диапазоне.

**Действие 3:** Поиск \[Великие равнины]

**Наблюдение 3:** Термин "Великие равнины" относится к одному из двух различных регионов.

**Рассуждение 4**: Я должен вместо этого искать "Великие равнины" (Соединенные Штаты).

**Действие 4:** Поиск "Великие равнины (Соединенные Штаты)"

**Наблюдение 4:** Великие равнины являются подрегионом Больших равнин. С востока на запад высота Великих равнин возрастает от примерно 1,800 до 7,000 футов (от 550 до 2,130 метров).

**Рассуждение 5:** Великие равнины поднимаются в высоте от примерно 1,800 до 7,000 футов, значит, ответ составляет от 1,800 до 7,000 футов.

**Действие 5:** Завершение \[1,800 до 7,000 футов]

...
{% endhint %}

Обратите внимание, что в зависимости от типа задачи используются разные подходы в формулировки промптов. Например, для задач, где рассуждение является основным, таких как HotpotQA, используются траектории решения, включающие несколько шагов рассуждение-действия-наблюдение. В случае задач принятия решений, которые включают множество действий, шаги рассуждений редко используются.

## Результаты на задачах, требующих знаний.

***

Также стоит отметить, что в статье представлены результаты тестирования ReAct на задачах принятия решений. Эффективность ReAct была оценена на двух бенчмарках:  [ALFWorld](https://alfworld.github.io/) (текстовая игра) и [WebShop](https://webshop-pnlp.github.io/) (среда онлайн-шопинга). Оба эти бенчмарка включают сложные ситуации, в которых необходимо применять рассуждения для эффективных действий и принятия решений.

> *Бенчмарк" - это термин из области тестирования и оценки производительности. В контексте исследования и разработки, особенно в области искусственного интеллекта и компьютерных наук, "бенчмарк" означает стандартный набор задач или тестовых случаев, на которых оценивается производительность и качество новых методов, алгоритмов или моделей. Это позволяет сравнивать разные подходы и определять, какой из них лучше справляется с конкретными задачами.*

Обратите внимание, что промпты ReAct разработаны по-разному для этих задач, сохраняя ту же основную идею объединения рассуждения и действия. Вот пример проблемы ALFWorld, включающей промпт ReAct.

<figure><img src="https://3840355729-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgFPj8AgoQsj90ueaMFr7%2Fuploads%2FGHhMpWiWDy0hx6g9JKkl%2F%D1%81%D0%BA%D1%80%D0%B8%D0%BD%201.png?alt=media&#x26;token=c76b6b51-adfa-4f2d-923d-ee6c10dfd8dd" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3840355729-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgFPj8AgoQsj90ueaMFr7%2Fuploads%2FcXelwAyC6TWmLCBfAJ5j%2F111.translated.jpg?alt=media&#x26;token=d0f8dd99-83f5-435e-a17b-b819418dad05" alt=""><figcaption></figcaption></figure>

Источник изображения: [Yao и др., 2022](https://arxiv.org/abs/2210.03629)

ReAct продемонстрировал лучшие результаты по сравнению с методом действий (Act) как на задачах ALFWorld, так и на Webshop. Без рассуждений метод Act не может эффективно разбивать общие цели на более мелкие подцели. Рассуждение играет важную роль в решении таких задач, но текущие методы использования промптинга все равно значительно уступают профессиональным специалистам в этой области.

Для получения более подробных результатов рекомендуется обратиться к статье [Yao и др., 2022](https://arxiv.org/abs/2210.03629).

## Использование ReAct в LangChain

***

Приведенный пример демонстрирует, как применяется подход ReAct с использованием OpenAI для LLM и [LangChain](https://python.langchain.com/en/latest/index.html), так как в нем уже есть встроенные функции, которые используют фреймворк ReAct для создания агентов, выполняющих задачи, объединяя мощность LLM и различных инструментов.

Сначала установим и импортируем необходимые библиотеки:

{% hint style="info" %} <mark style="color:red;">%</mark>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

<mark style="color:red;">import</mark> openai

<mark style="color:red;">import</mark> os

<mark style="color:red;">from</mark> langchain.llms <mark style="color:red;">import</mark> OpenAI

<mark style="color:red;">from</mark> langchain.agents <mark style="color:red;">import</mark> load\_tools

<mark style="color:red;">from</mark> langchain.agents <mark style="color:red;">import</mark> initialize\_agent

<mark style="color:red;">from</mark> dotenv import load\_dotenv

<mark style="color:purple;">load\_dotenv</mark>()

\
\# load API keys; you will need to obtain these if you haven't yet

os.environ\["<mark style="color:green;">OPENAI\_API\_KEY</mark>"] <mark style="color:red;">=</mark> os.<mark style="color:purple;">getenv</mark>("<mark style="color:green;">OPENAI\_API\_KEY</mark>")

os.environ\["<mark style="color:green;">SERPER\_API\_KEY</mark>"] <mark style="color:red;">=</mark> os.<mark style="color:purple;">getenv</mark>("<mark style="color:green;">SERPER\_API\_KEY</mark>")
{% endhint %}

Теперь мы можем настроить большую языковую модель (LLM), выбрать инструменты, которые будем использовать, и создать агента, который объединяет фреймворк ReAct с LLM и инструментами. Важно отметить, что мы используем API поиска для получения внешней информации и LLM в роли математического инструмента.

{% hint style="info" %}
llm = <mark style="color:purple;">OpenAI</mark>(model\_name=<mark style="color:green;">"text-davinci-003"</mark> ,temperature<mark style="color:red;">=</mark><mark style="color:blue;">0</mark>)

tools = <mark style="color:purple;">load\_tools</mark>(\["<mark style="color:green;">google-serper", "llm-math"</mark>], llm<mark style="color:red;">=</mark>llm)

agent = <mark style="color:purple;">initialize\_agent</mark>(tools, llm, agent<mark style="color:red;">=</mark><mark style="color:green;">"zero-shot-react-description"</mark>, verbose=True)
{% endhint %}

После настройки мы можем запустить агента с желаемым промптом. Обратите внимание, что здесь не требуется предоставлять экземпляры с малым количеством примеров, как объясняется в статье.

{% hint style="info" %}
agent<mark style="color:purple;">.run</mark>(<mark style="color:green;">"Кто является парнем Оливии Уайлд? Каков его текущий возраст, возведенный в степень 0,23?"</mark>)
{% endhint %}

Последовательность шагов выполнения выглядит так:

{% hint style="info" %}
&#x20;<mark style="color:red;">></mark> Ввод новой цепочки AgentExecutor...

<mark style="color:orange;">Мне нужно выяснить, кто является бойфрендом Оливии Уайлд, а затем вычислить его возраст, возведенный в степень 0,23.</mark>

<mark style="color:red;">Действие:</mark> <mark style="color:green;">Поиск</mark>

<mark style="color:red;">Действие:</mark> <mark style="color:green;">"Парень Оливии Уайлд"</mark>

<mark style="color:red;">Наблюдение:</mark> <mark style="color:green;">Оливия Уайлд начала встречаться с Гарри Стайлзом после того, как расторгла многолетнюю помолвку с Джейсоном Судейкисом - см. хронологию их отношений.</mark>

<mark style="color:red;">Рассуждение:</mark> <mark style="color:green;">Мне нужно узнать возраст Гарри Стайлза.</mark>

<mark style="color:red;">Действие:</mark> <mark style="color:green;">Поиск</mark>

<mark style="color:red;">Входное действие:</mark> <mark style="color:green;">"Возраст Гарри Стайлза"</mark>

<mark style="color:red;">Наблюдение:</mark> <mark style="color:green;">29 лет</mark>

<mark style="color:red;">Рассуждение:</mark> <mark style="color:green;">Мне нужно вычислить 29, возведенное в степень 0,23.</mark>

<mark style="color:red;">Действие:</mark> <mark style="color:green;">Калькулятор</mark>

<mark style="color:red;">Входное действие:</mark> <mark style="color:green;">29^0.23</mark>

<mark style="color:red;">Наблюдение:</mark> <mark style="color:blue;">Ответ: 2,169459462491557</mark>\
\
\ <mark style="color:red;">Рассуждение:</mark> <mark style="color:green;">Теперь я знаю окончательный ответ.</mark>\ <mark style="color:red;">Окончательный ответ:</mark> <mark style="color:green;">Гарри Стайлзу, бойфренду Оливии Уайлд, 29 лет, а его возраст, возведенный в степень 0,23, равен 2,169459462491557.</mark>

&#x20;<mark style="color:red;">></mark>Завершение цепочки.
{% endhint %}

Полученный результат выглядит следующим образом:

{% hint style="info" %}
"Гарри Стайлзу, бойфренду Оливии Уайлд, 29 лет, а его возраст, возведенный в степень 0,23, составляет 2,169459462491557".
{% endhint %}

Мы использовали адаптированный пример из [документации LangChain](https://python.langchain.com/docs/modules/agents), поэтому все заслуги принадлежат их авторам. Мы советуем попробовать разные комбинации инструментов и задач для дополнительного исследования.
