Почему AI-агенты зацикливаются и 4 паттерна контроля
Самый дорогой баг в продакшн-агенте — не баг логики, а бесконечный цикл. Агент получает задачу, дёргает тулы, получает ответы, снова дёргает, снова получает — и не может выйти. Модель думает, что делает работу. На самом деле она жжёт $40 за десять минут, переписывает файл в тридцатый раз и никуда не приходит.
В одной команде я видел счёт в $1200 за ночь — агент зациклился на "исправлении" тестов и делал это до утра, пока не сработал rate limit. Разбираю, почему это происходит и как ставить предохранители.
Почему агенты зацикливаются
Три типичные причины.
Нечёткая терминация. Агент не знает, что "готово". Задача "почини тесты" без критерия успеха превращается в бесконечное улучшение. Модель честно работает, пока не упрётся в лимит.
Tool, который возвращает противоречивые результаты. Агент делает grep, получает список, правит, делает grep снова, видит те же совпадения (потому что фикс не сработал), правит дальше. Если между итерациями нет проверки "изменилось ли состояние" — цикл вечный.
Модель не помнит, что уже пробовала. На длинных цепочках контекст уезжает, ранние шаги забываются, агент повторяет те же действия через 20 шагов. Это особенно бьёт в Sonnet на задачах > 30 tool-calls.
Паттерн 1: жёсткий лимит итераций
Простейший предохранитель. Счётчик tool-calls, после N — принудительный выход с сообщением пользователю "не смог решить за N шагов".
const MAX_STEPS = 20;
let steps = 0;
while (needsMoreWork) {
if (++steps > MAX_STEPS) {
return { status: "exhausted", reason: "Max steps reached" };
}
const resp = await client.messages.create({...});
// handle tools
}
Выбор N: для простых агентов 10, для сложных 30-50. Выше — почти всегда симптом плохой декомпозиции задачи.
Паттерн 2: бюджет по токенам и деньгам
Итерации — плохая метрика, если каждая жрёт 50k токенов. Лучше считать токены напрямую.
let totalInputTokens = 0;
const TOKEN_BUDGET = 200_000;
// после каждого ответа
totalInputTokens += resp.usage.input_tokens;
if (totalInputTokens > TOKEN_BUDGET) {
return { status: "budget_exhausted" };
}
В продакшне я всегда ставлю ещё и долларовый лимит на сессию. Переводите токены в $ по текущему прайсингу Claude, при превышении — жёсткий стоп. Это спасает от ночных сюрпризов.
Паттерн 3: детектор повторений
Самый полезный паттерн для реальных агентов. Перед каждым tool-call смотрите: не делали ли мы это уже?
const history = new Map<string, number>();
function shouldAllow(toolName: string, args: object) {
const key = `${toolName}:${JSON.stringify(args)}`;
const count = history.get(key) ?? 0;
history.set(key, count + 1);
if (count >= 3) {
return { allow: false, reason: "Tool called with same args 3 times" };
}
return { allow: true };
}
Если агент три раза подряд вызывает read_file("config.json") с одним и тем же аргументом — он явно не движется. Возвращаем ему это как сообщение ("ты уже читал этот файл, результат: ..."), модель обычно выходит из цикла.
Паттерн 4: структурированное завершение
Заставьте модель явно объявлять, когда задача закончена. Добавьте специальный тул finish(summary) и в системном промпте чётко скажите: вызывай его, когда закончил.
Доступные тулы: read_file, write_file, run_tests, finish.
Когда задача выполнена — вызови finish с кратким отчётом.
Без finish результат не засчитывается.
Модель начинает думать в терминах "когда я смогу вызвать finish". Это резко снижает зависания. Бонус: вы получаете структурированный отчёт вместо свободного текста.
Пятое: наблюдаемость
Всё вышеперечисленное не работает, если вы не видите, что происходит. Минимум для продакшн-агента:
- Лог каждого tool_call с аргументами и timestamp
- Лог каждой модельной "мысли" (thinking-блок, если используете)
- Метрика: количество шагов на задачу (p50, p95, p99)
- Алерт: сессия > 30 шагов или > $5 — сигнал
Без этого вы узнаёте о зависании, когда счёт за месяц приходит в 10 раз больше ожидаемого.
Чеклист перед запуском агента в прод
- Есть MAX_STEPS
- Есть TOKEN_BUDGET
- Есть детектор повторяющихся tool-calls
- Есть явный finish-тул
- Все tool-calls логируются
- Стоит алерт на длинные сессии
- В песочнице прогнали 10 реальных задач, p95 < 15 шагов
Если галочки не все — не запускайте. Дешевле доделать, чем потом разбираться, куда делось $800.
Нужна помощь сделать продакшн-агента с адекватными предохранителями? Напишите. Входит в пакет "Автоматизация на Claude".