010: Агент/Цикл
- Требуется:
Итеративная последовательность Запросов, направленная на достижение цели. Агент продолжает вызывать Запросы, обрабатывать результирующие Вызовы и возвращать результат в контекст до тех пор, пока LLM не сгенерирует Финальный Результат, сигнализируя о завершении задачи.
Цикл выполнения — это движок, который управляет всеми типами сообщений и протоколов из предыдущих глав. Он позволяет агенту выполнять многоэтапные задачи, итеративно создавая Запросы. Этот итеративный процесс сборки контекста, использования инструментов и обратной связи — это то, что обычно подразумевается под «агентом».
Цикл выполнения
Цикл выполнения является основным механизмом для автономного, многоэтапного исполнения. Он работает на основе вложенной структуры циклов:
-
Внешний цикл (Генерация запросов): Жизненный цикл агента — это последовательность Запросов. Он начинается с начального контекста и входит в цикл.
-
Потоковая передача запросов и вызовов: Внутри цикла он инициирует один Запрос. Запрос передает Вызовы по мере их генерации, которые собираются в очередь ожидания.
-
Внутренний цикл (Оркестрация вызовов): Для каждого Запроса внутренний цикл оркестрации отвечает за выполнение связанных с ним Вызовов. Этот процесс представляет собой реактивный, управляемый событиями цикл, который запускается двумя событиями: новый Вызов передается из LLM, или ранее запущенный Вызов завершается. Этот процесс является высококонкурентным:
-
Оркестратор непрерывно сканирует очередь ожидающих Вызовов, чтобы найти все, которые в данный момент не заблокированы (т. е. их зависимости удовлетворены).
-
Все незаблокированные Вызовы могут быть представлены для подтверждения, а затем выполнены параллельно. Это обеспечивает высокую пропускную способность, но требует тщательного управления состоянием. Если несколько одновременных Вызовов записывают данные в один и тот же путь в Состоянии, окончательное значение будет определено последним завершившимся вызовом, что может привести к недетерминированным результатам. Система использует подход «last-write-wins» (побеждает последняя запись) для разрешения этих конфликтов.
-
По мере завершения каждого Вызова его результат обновляет общий контекст, потенциально разблокируя другие ожидающие Вызовы.
-
Это реактивное, параллельное выполнение продолжается до тех пор, пока поток для текущего Запроса не будет закрыт и все его ожидающие Вызовы не будут обработаны. Эта модель значительно снижает задержку, так как агент может начать работать над несколькими независимыми шагами одновременно, даже до того, как станет известен полный план.
-
-
Завершение и продолжение: Как только внутренний цикл для данного Запроса завершается, агент проверяет итоговое Решение. Решение о продолжении основывается на поле
output:-
Если
outputравенnull, агент определяет, что его задача еще не завершена. Он возвращается к шагу 2, вызывая новый Запрос с обогащенным контекстом, который теперь содержит результаты выполненных Вызовов. -
Если
outputне равенnull, цель агента считается достигнутой. Внешний цикл завершается, и значениеoutput, соответствующее определенной пользователем схеме вывода, возвращается в качестве окончательного результата. Агент может генерировать какcalls, так и финальныйoutputза один шаг; наличиеoutputявляется окончательным сигналом для остановки.
-
Человек-в-цикле
Новый Цикл выполнения обеспечивает надежную поддержку человеческого контроля, помещая шаг подтверждения непосредственно перед выполнением. Это гарантирует, что пользователю предлагается действовать только в отношении тех вызовов, которые готовы к запуску:
- Подтверждение: Прежде чем незаблокированный Вызов будет выполнен, система может представить его пользователю для подтверждения. Это эффективный подход, так как он избавляет пользователя от необходимости просматривать и подтверждать вызовы, которые могут быть заблокированы зависимостями и никогда не запустятся.
- Корректировка: Пользователь может изменять параметры Вызова или даже заменять его на другой.
Важно отметить, что эти конкретные механизмы HITL не являются частью основного протокола. Архитектура просто обеспечивает необходимое разделение между предложением действий и их выполнением, предоставляя разработчикам гибкость для реализации любого вида вмешательства, от простого ручного подтверждения до сложной автоматизированной системы с тайм-аутами.
Эта возможность критически важна для безопасности и совместных задач, где агент выступает в роли помощника. Корректировки и обратная связь от пользователя могут быть использованы Планом, позволяя агенту уточнять свою стратегию на основе человеческого ввода.
Обработка ошибок и самокоррекция
Цикл выполнения спроектирован так, чтобы быть устойчивым, предоставляя реактивную систему безопасности, которая позволяет агенту обрабатывать и восстанавливаться как после собственных ошибок планирования, так и после непредвиденных сбоев во время выполнения. Это достигается путем перехвата ошибок и их возвращения в LLM в виде структурированной контекстуальной информации.
Сообщение об ошибке
Для этого система использует специализированное Сообщение об ошибке, основанное на Сообщении с данными. При перехвате ошибки цикл генерирует Сообщение об ошибке и добавляет его в контекст для следующей итерации. Его свойство data содержит две критически важные части информации:
call: Полный, сериализованный объектcall, который завершился с ошибкой.error: Объект или строка, детализирующие причину сбоя.
Цикл самокоррекции
Цикл перехватывает два основных типа необработанных сбоев:
- Структурные ошибки: Перехватываются до выполнения. Сюда входят ошибки валидации схемы параметров вызова, несоответствие типов или недействительные Ссылки на переменные.
- Ошибки времени выполнения: Перехватываются во время выполнения. Это происходит, когда явное Действие генерирует необработанное исключение (например, из-за сбоя API или внутренней логической ошибки).
Когда перехватывается ошибка любого из этих типов, цикл генерирует Сообщение об ошибке и добавляет его во временный список. В конце такта выполнения (когда больше нет незаблокированных вызовов), все собранные за этот ход Сообщения об ошибках добавляются в контекст.
Это предоставляет LLM прямую и действенную обратную связь. На следующем шаге он видит неудавшийся вызов и конкретную ошибку, которую он вызвал, что позволяет ему отладить и сгенерировать исправленный план.
Способность цикла перехватывать ошибки и сообщать о них LLM — это реактивная система безопасности для незапланированных сбоев. Однако самые надежные рабочие процессы изначально проектируются с учетом возможных сбоев.
Используя систему Планов с ветвящимися Выражениями, вы можете создавать явные «успешные» и «неудачные» пути для ваших инструментов. Действие может обрабатывать свои собственные ошибки внутренне и, вместо генерации исключения, возвращать определенное Сообщение с данными, которое направляет рабочий процесс по заранее спланированной ветке обработки ошибок. Этот проактивный подход подробно описан в главе о Планах.
От простых циклов к стратегическим планам
Цикл выполнения предоставляет динамическую структуру для поведения агента, но его сила заключается в выполнении тактических, одноразовых Запросов. Для управления сложными, многоэтапными рабочими процессами с зависимостями требуется более продвинутая система стратегического планирования.
Следующий документ, 011: Агент/Выражения, представляет протокол для определения этих долгосрочных стратегий в виде графа взаимосвязанных Вызовов инструментов.