Промпт-инжиниринг и loop engineering. Простое объяснение
По своей сути агент это цикл while:
- Модель выполняется
- Она запрашивает вызовы инструментов
- Результаты работы инструментов возвращаются в контекст
- Модель запускается снова, пока не перестанет запрашивать инструменты
Подход ReAct описал такую форму цикла ещё в 2022–2023 годах, и почти все современные агентные системы и фреймворки используют похожую реализацию.
Поэтому сами циклы это далеко не новая идея. Описанная выше реализация была решена уже давно.
Но оставался нерешённым цикл вокруг этого цикла. Именно о нём недавно говорили Борис Черни и Питер.
В наиболее распространённой схеме внешним циклом управляешь ты.
- Пишешь промпт
- Читаешь шаги, которые выполняет агент
- Пишешь следующий промпт
- Повторяешь процесс, отслеживая ошибки по мере работы
Сейчас появляются попытки автоматизировать и внешний цикл, чтобы исключить человека из процесса.
- Запуск происходит по расписанию или по событию
- Агент выполняет множество шагов без новых промптов между ними
- Сам решает, когда работа завершена
- Возвращается к человеку только тогда, когда действительно требуется его участие
Рассмотрим пример с упавшим тестом в CI.
Сейчас ты копируешь сообщение об ошибке в агента, читаешь предложенное исправление, запускаешь тесты и снова передаёшь следующую ошибку, пока все тесты не пройдут.
То есть каждый шаг проходит через тебя.
При автоматизированном цикле агент выполняет те же самые шаги самостоятельно.
Он запускается по расписанию, считывает ошибку, готовит исправление в отдельной ветке, запускает тесты и передаёт следующую ошибку самому себе как новый шаг, пока тесты не пройдут или не будет достигнут лимит шагов.
Отдельный ревьюер проверяет исправление, открывает PR, если всё в порядке, или передаёт его человеку, если обнаруживает проблемы.
Внутренний цикл всегда был автоматическим. Сейчас автоматизируют именно твоё участие в этом процессе.
Но бесплатно это не даётся.
> Пока ты управлял внешним циклом, ты мог остановить процесс, обладал памятью о проекте и выступал в роли ревьюера. Теперь все эти функции должны существовать внутри самой системы.
> И хотя участие в цикле замедляло работу, зато ты понимал, что именно происходит.
Главный недостаток исключения человека из цикла в том, что ответственность остаётся за тобой, а понимание происходящего, скорее всего, теряется.
> Сам по себе цикл не умеет определять, когда действительно пора остановиться. Он просто поверит агенту, что задача выполнена, и может завершиться даже при падающих тестах. Поэтому условие остановки должно проверяться независимо, а также необходим лимит шагов или токенов, чтобы избежать бесконечных циклов.
> Контекст увеличивается на каждом шаге, и по мере его роста качество работы модели снижается.
Поэтому цикл должен сокращать контекст, сохраняя только сводки вместо полной истории, переносить большие результаты в файлы и разбивать крупные задачи на отдельные запуски.
> Наконец, агент не должен сам проверять собственную работу, потому что он примет любое своё решение как правильное.
Такую проверку должна выполнять отдельная модель или бинарный/детерминированный тест.
Стоимость тоже быстро растёт, потому что на каждом шаге заново передаётся весь контекст. Поэтому длинный цикл может стоить во много раз дороже, чем выполнение одного промпта.
Если хочешь разобраться глубже, можно прочитать подробный разбор - от описанного выше цикла до полностью автономного запуска, который завершает работу самостоятельно, с примерами кода для каждого этапа.
Читайте дальше 🐸
Post #3389
18.4K