# Как создать ИИ-агента с нуля: разбираем паттерн ReAct

Источник: https://www.youtube.com/watch?v=Lj9npd7u1Ms
Канал: DeepLearning.AI
Опубликовано: 21.06.2024

---

Разработка автономных агентов на базе больших языковых моделей (LLM) часто воспринимается как нечто магическое и сверхсложное. Однако, как показывают эксперты DeepLearning.AI, базового агента можно собрать буквально «на коленке», используя стандартный Python и API OpenAI. В этом материале мы разберем механику работы паттерна ReAct и процесс создания среды исполнения, которая превращает обычную нейросеть в инструмент для решения многоэтапных задач.

## 🧠 Основы паттерна ReAct: Мышление и действие
[[JUMP:00:00]]

Создание агента начинается с понимания того, как разделить задачи между самой языковой моделью и кодом, который её окружает (так называемым «рантаймом», или средой исполнения). В основе проекта лежит паттерн **ReAct** (Reasoning + Acting) — концепция, объединяющая рассуждение и действие [00:25].

Суть паттерна заключается во внедрении циклического процесса:

*   **Thought (Мысль):** LLM сначала обдумывает поставленный вопрос.
*   **Action (Действие):** Модель решает, какое конкретное действие (вызов функции или инструмента) необходимо предпринять.
*   **Pause (Пауза):** Модель останавливает генерацию текста, передавая управление программному коду.
*   **Observation (Наблюдение):** Код выполняет действие, получает результат из внешней среды (например, из базы данных) и возвращает его модели [00:38].

Этот цикл повторяется до тех пор, пока LLM не решит, что информации достаточно для выдачи финального ответа. По словам автора видео, в качестве основы для реализации на Python используется подход, описанный в блоге разработчика Саймона Уилсона (Simon Wilson) [01:03].

## 🛠️ Архитектура агента и программная среда
[[JUMP:01:20]]

Для реализации агента используется модель GPT-4 от OpenAI. Важным техническим нюансом является установка параметра `temperature = 0`. Это делает поведение модели детерминированным (предсказуемым), что критически важно для стабильной работы агента при вызове инструментов [03:11].

Класс агента в Python выполняет роль «памяти» и интерфейса взаимодействия. Основные компоненты класса:

1.  **System Message:** Системная инструкция, задающая правила поведения.
2.  **Message History:** Список, в который записываются все реплики: вопросы пользователя, мысли модели, результаты работы инструментов и финальные ответы [02:00].
3.  **Execute Method:** Метод, который отправляет накопленную историю сообщений в OpenAI и возвращает текстовый ответ модели [02:57].

## 📝 Системный промпт: Прошивка интеллекта
[[JUMP:03:24]]

Самая важная часть агента — это не Python-код, а системный промпт. Именно он объясняет модели, как работать в цикле ReAct. В промпте четко прописывается структура ответа: модель обязана использовать ключевые слова «Thought», «Action», «Pause» и «Observation» [03:50].

Кроме структуры, в промпт включается описание доступных инструментов. В данном примере агенту дают доступ к двум функциям:

*   **calculate:** выполнение математических вычислений.
*   **average_dog_weight:** получение справочных данных о весе собак различных пород [04:15].

Интересной деталью является использование техники **few-shot prompting**: в промпт включен пример успешного диалога (trace). Это помогает модели наглядно понять, как именно она должна переходить от мыслей к действиям и как реагировать на наблюдения [04:29].

## 🐕 Практическая работа с инструментами
[[JUMP:04:41]]

Для демонстрации работы были созданы две простые функции:

1.  Функция вычисления, использующая стандартный `eval()` в Python.
2.  Функция `average_dog_weight`, возвращающая фиксированные значения веса для таких пород, как шотландский терьер, бордер-колли и той-пудель [04:55].

При первом запуске с вопросом «Сколько весит той-пудель?», агент не выдает ответ мгновенно. Вместо этого он пишет: «Thought: Мне нужно найти вес собаки через функцию average_dog_weight. Action: average_dog_weight: toy poodle» и ставит маркер «Pause» [05:34]. 

На этом этапе программный код перехватывает управление, видит название функции и аргумент, выполняет Python-код, получает результат (7 фунтов) и отправляет его обратно в модель в виде сообщения с заголовком «Observation» [05:46]. Только после этого модель генерирует финальный ответ: «A toy poodle weighs 7 pounds» [06:15].

## 🔄 Решение сложных задач и автоматизация цикла
[[JUMP:07:08]]

Преимущество агента перед обычным чат-ботом проявляется в сложных сценариях. Например, на вопрос: «У меня две собаки: бордер-колли и шотландский терьер. Каков их суммарный вес?», агент строит многоэтапный план [07:22]:

1.  Сначала запрашивает вес бордер-колли.
2.  Получив результат, запрашивает вес шотландского терьера.
3.  Получив оба числа, вызывает инструмент `calculate` для сложения (37 + 20).
4.  Только после третьего цикла выдает итоговую цифру — 57 фунтов [08:13].

Чтобы не выполнять эти шаги вручную, разработчики создают автоматизированный цикл (Loop) [08:39]. В коде используется регулярное выражение (Regex), которое ищет в ответе модели строку с «Action». Если действие найдено, код исполняет функцию и возвращает «Observation» в новом цикле. Если в ответе содержится только «Answer», цикл завершается [10:48]. 

Для безопасности вводится параметр `max_turns` (максимальное количество итераций), чтобы агент не ушел в бесконечный цикл, если вдруг не сможет найти решение [09:05].

---