Как ограничить ИИ-агента: бюджет шагов, тайм-аут и безопасная остановка
ИИ-агент может зациклиться даже на простой задаче: снова открыть ту же страницу, повторить неудачный вызов или бесконечно уточнять собственный план. Обычный чат раздражает лишним текстом, а агент с инструментами расходует деньги и способен многократно выполнить действие. Поэтому пределы задают до первого запуска и исполняют в коде, а не вежливой строкой промпта.
Опишите завершение наблюдаемым событием
Фраза «сделай всё» не сообщает системе, когда остановиться. Запишите готовность так, чтобы её мог проверить простой код: файл создан и прошёл валидатор; запись сохранена с нужным идентификатором; страница вернула HTTP 200; отчёт содержит обязательные поля. Рядом укажите состояния «нужен человек» и «невозможно продолжить». Тогда агент не будет маскировать нехватку доступа новыми попытками.
Разделите план и действие. Сначала агент перечисляет шаги и требуемые права, затем исполнитель разрешает только ближайший шаг. Для необратимых операций нужен отдельный шлюз подтверждения. Принципы минимальных прав подробнее разобраны в песочнице для агента и гайде по сетевым границам.
Поставьте четыре независимых лимита
Первый — число шагов. Для узкой задачи начните с 8–12 вызовов инструментов. Второй — общее время, например пять минут. Третий — денежный или токенный бюджет. Четвёртый — число повторов одного и того же действия с одинаковыми аргументами. Последний особенно важен: общий лимит в сто шагов всё равно позволяет сто раз нажать одну кнопку.
Каждый счётчик живёт вне модели. После шага оркестратор увеличивает значение и решает, можно ли продолжать. Модель видит остаток, но не может его сбросить. Если задача закономерно требует больше времени, человек создаёт новый запуск с объяснением, а не снимает ограничение навсегда.
Найдите цикл по следам действий
Сохраняйте нормализованный отпечаток: имя инструмента, адрес ресурса, безопасную часть аргументов и результат. Три одинаковых вызова подряд — простой сигнал. Более сложный цикл выглядит как A → B → C → A, поэтому полезно сравнивать последние 6–10 отпечатков. Не записывайте секреты целиком; токен заменяется меткой, а чувствительный текст — хешем или разрешённым фрагментом.
Причина повтора тоже важна. Ошибка 429 требует паузы и ограниченного retry, 401 — остановки и проверки доступа, 404 — пересмотра адреса. Повторять любую ошибку одинаково нельзя. Таблица политик должна находиться в коде и проходить тесты.
Сделайте остановку полезной
Аварийное завершение не должно выбрасывать всю работу. Сохраните цель, завершённые шаги, созданные черновики, последнюю подтверждённую точку и причину остановки. Для файла используйте временное имя и атомарное перемещение после проверки. Для внешней системы добавляйте идемпотентный ключ, чтобы повторный запуск не создал второй заказ или пост.
Сообщение человеку должно отвечать на три вопроса: что уже сделано, почему процесс остановлен и какое одно решение требуется. «Не удалось выполнить задачу» бесполезно. «Черновик создан, публикация не отправлена: сервер вернул 401; требуется новый ключ с правом publish» позволяет продолжить безопасно.
Проверьте ограничитель до рабочего доступа
Создайте учебную среду и намеренно сломайте её. Верните бесконечную пагинацию, одинаковую ошибку, медленный ответ и противоречивую инструкцию внутри документа. Убедитесь, что срабатывают разные пределы, журнал не содержит секретов, а частичный результат помечен как черновик. Затем перезапустите задачу и проверьте, что идемпотентность не создаёт дублей.
Отдельно испытайте prompt injection: вложенный документ просит игнорировать лимит и отправить данные наружу. Агент может процитировать эту фразу, но политика инструментов должна запретить действие. Модель угроз описана в материале что такое prompt injection.
Минимальная рабочая конфигурация
Для первого пилота достаточно десяти шагов, пяти минут, двух повторов одинакового вызова и ручного подтверждения записи. Добавьте журнал без секретов, идентификатор запуска и конечные состояния success, needs_review, failed и stopped_by_budget. Не называйте success сам факт выполнения команды: успешный HTTP-ответ ещё не доказывает правильность результата.
После двадцати реальных запусков посмотрите распределение шагов и причин остановки. Если нормальная задача часто упирается в предел, сначала упростите маршрут и инструменты. Повышать бюджет стоит только для понятного сценария, а не чтобы скрыть плохую постановку.
FAQ
Достаточно попросить агента остановиться через десять шагов?
Нет. Это полезная подсказка, но реальный счётчик должен находиться в оркестраторе и блокировать следующий вызов.
Какой тайм-аут выбрать?
Чуть выше измеренного времени обычного сценария. Отдельные сетевые вызовы получают собственные короткие тайм-ауты.
Можно ли автоматически продолжить после лимита?
Только если сохранена контрольная точка, понятна причина и новый запуск не повторит необратимое действие.
Что важнее: токены или число действий?
Нужны оба ограничения. Короткий ответ может сопровождать опасный вызов, а длинное рассуждение — не выполнять никаких действий.