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

DeepLearning.AI 18,3 тыс. 12 мин 3 мин 21.06.2024
Главное

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

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

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

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

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

🛠️ Архитектура агента и программная среда 1:20

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

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

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

📝 Системный промпт: Прошивка интеллекта 3:24

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

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

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

🐕 Практическая работа с инструментами 4:41

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

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

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

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

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

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

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

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

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


💬 Цитаты

«В этом паттерне LLM сначала думает о том, что делать, а затем решает, какое действие предпринять.»

Представитель DeepLearning.AI 00:25

«Мы увидим, какие задачи ложатся на LLM, а какие управляются кодом вокруг модели — тем, что мы называем рантаймом.»

Представитель DeepLearning.AI 00:13
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
ReAct
Метод построения промптов, который побуждает модель рассуждать о своих действиях (Reasoning + Acting).
Few-shot prompting
Техника обучения модели в контексте промпта путем предоставления нескольких примеров ожидаемого поведения.
Runtime (среда исполнения)
Программный код на Python, который обрабатывает запросы к API, выполняет функции и передает результаты обратно в LLM.
Temperature 0
Настройка модели, при которой она всегда выбирает наиболее вероятный следующий токен, исключая случайность в ответах.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект DeepLearning.AI ReAct pattern OpenAI Python LangGraph