Разработка автономных агентов на базе больших языковых моделей (LLM) часто воспринимается как нечто магическое и сверхсложное. Однако, как показывают эксперты DeepLearning.AI, базового агента можно собрать буквально «на коленке», используя стандартный Python и API OpenAI. В этом материале мы разберем механику работы паттерна ReAct и процесс создания среды исполнения, которая превращает обычную нейросеть в инструмент для решения многоэтапных задач.
🧠 Основы паттерна ReAct: Мышление и действие 0:00
Создание агента начинается с понимания того, как разделить задачи между самой языковой моделью и кодом, который её окружает (так называемым «рантаймом», или средой исполнения). В основе проекта лежит паттерн ReAct (Reasoning + Acting) — концепция, объединяющая рассуждение и действие .
Суть паттерна заключается во внедрении циклического процесса:
- Thought (Мысль): LLM сначала обдумывает поставленный вопрос.
- Action (Действие): Модель решает, какое конкретное действие (вызов функции или инструмента) необходимо предпринять.
- Pause (Пауза): Модель останавливает генерацию текста, передавая управление программному коду.
- Observation (Наблюдение): Код выполняет действие, получает результат из внешней среды (например, из базы данных) и возвращает его модели .
Этот цикл повторяется до тех пор, пока LLM не решит, что информации достаточно для выдачи финального ответа. По словам автора видео, в качестве основы для реализации на Python используется подход, описанный в блоге разработчика Саймона Уилсона (Simon Wilson) .
🛠️ Архитектура агента и программная среда 1:20
Для реализации агента используется модель GPT-4 от OpenAI. Важным техническим нюансом является установка параметра temperature = 0. Это делает поведение модели детерминированным (предсказуемым), что критически важно для стабильной работы агента при вызове инструментов .
Класс агента в Python выполняет роль «памяти» и интерфейса взаимодействия. Основные компоненты класса:
- System Message: Системная инструкция, задающая правила поведения.
- Message History: Список, в который записываются все реплики: вопросы пользователя, мысли модели, результаты работы инструментов и финальные ответы .
- Execute Method: Метод, который отправляет накопленную историю сообщений в OpenAI и возвращает текстовый ответ модели .
📝 Системный промпт: Прошивка интеллекта 3:24
Самая важная часть агента — это не Python-код, а системный промпт. Именно он объясняет модели, как работать в цикле ReAct. В промпте четко прописывается структура ответа: модель обязана использовать ключевые слова «Thought», «Action», «Pause» и «Observation» .
Кроме структуры, в промпт включается описание доступных инструментов. В данном примере агенту дают доступ к двум функциям:
- calculate: выполнение математических вычислений.
- average_dog_weight: получение справочных данных о весе собак различных пород .
Интересной деталью является использование техники few-shot prompting: в промпт включен пример успешного диалога (trace). Это помогает модели наглядно понять, как именно она должна переходить от мыслей к действиям и как реагировать на наблюдения .
🐕 Практическая работа с инструментами 4:41
Для демонстрации работы были созданы две простые функции:
- Функция вычисления, использующая стандартный
eval()в Python. - Функция
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
Преимущество агента перед обычным чат-ботом проявляется в сложных сценариях. Например, на вопрос: «У меня две собаки: бордер-колли и шотландский терьер. Каков их суммарный вес?», агент строит многоэтапный план :
- Сначала запрашивает вес бордер-колли.
- Получив результат, запрашивает вес шотландского терьера.
- Получив оба числа, вызывает инструмент
calculateдля сложения (37 + 20). - Только после третьего цикла выдает итоговую цифру — 57 фунтов .
Чтобы не выполнять эти шаги вручную, разработчики создают автоматизированный цикл (Loop) . В коде используется регулярное выражение (Regex), которое ищет в ответе модели строку с «Action». Если действие найдено, код исполняет функцию и возвращает «Observation» в новом цикле. Если в ответе содержится только «Answer», цикл завершается .
Для безопасности вводится параметр max_turns (максимальное количество итераций), чтобы агент не ушел в бесконечный цикл, если вдруг не сможет найти решение .