Постмортем: как зацикленный LLM-агент жёг токены 40 минут — и чеклист, чтобы это не повторилось
LLM-агент попал в retry-петлю из-за изменения формата API. 40 минут, 1.6 млн токенов, $50. Разбираю что сломалось, почему стандартные метрики не помогли и какие три защиты добавить прямо сейчас.
Хватит терять деньги на зациклившихся агентах
Ночной кошмар каждого, кто запускает LLM-агентов в продакшне: просыпаешься утром — на дашборде минус $580. Агент всю ночь гонял один и тот же запрос по кругу. CPU спокоен, память в норме, логи выглядят как обычная работа. Только счёт за токены кричит.
Разберу по косточкам реальный инцидент: что сломалось, почему стандартный мониторинг не спас, и что нужно внедрить прямо сейчас.
Что произошло: анатомия retry-петли
Агент забирает данные из внешнего API, отправляет в GPT-4 для анализа, возвращает результат. Стандартный паттерн.
Внешний API изменил формат ответа — поле из JSON-объекта стало plain string. Без предупреждения.
Дальше цепочка:
- Агент вызывает GPT-4 для парсинга ответа
- GPT-4 получает невалидный вход и возвращает невалидный JSON
- Retry-хэндлер просит GPT-4 «починить» сломанный JSON
- GPT-4 снова получает тот же невалидный вход — снова мусор
- И так по кругу
Каждый цикл: ~2 000 токенов. Интервал: 3 секунды. При ценах GPT-4 — $1.20 в минуту. За 40 минут: $50. За ночь: $580.
Почему стандартный мониторинг не помог
LLM-петли не выглядят как обычные петли:
- CPU спокоен — вызовы к API это I/O
- Память стабильна — каждый запрос независим
- Логи выглядят нормально — агент генерирует новые промпты каждый раз
- HTTP-коды 200 — API OpenAI отвечает успешно, ошибок нет
Единственная метрика, показывающая аномалию — расход токенов за единицу времени. С 200 до 40 000 токенов в минуту — рост в 200 раз. Но если не мониторить эту метрику в реальном времени — вы слепы.
Корневая причина: LLM как retry-механизм
Стандартный счётчик max_retries = 3 не работает — каждый retry выглядит как уникальная попытка, потому что промпт формируется заново.
Как просить перевести текст на несуществующем языке: каждый раз выглядит как честная попытка, каждый раз неудача.
Правильная проверка — не количество попыток, а сходство входных данных. Три раза подряд те же данные → четвёртая попытка не поможет.
Три уровня защиты
1. Валидация входа до LLM-вызова (Input Gate)
Перед каждым вызовом LLM проверяй схему. Если вход невалиден — логируй, пропускай цикл, отправляй алерт. Не пытайся LLM'ить свой путь через сломанные данные.
2. Circuit Breaker с input fingerprinting
Стандартный circuit breaker считает ошибки. Для LLM нужен умнее — хэшировать входные данные. Три одинаковых входа подряд → стоп. Пауза 5 минут. Перезапуск с чистым состоянием.
Ключевая идея: хэш sha256 от json.dumps(input_data, sort_keys=True). Если хэш встречался 3+ раз в последних 10 вызовах — circuit open.
3. Cost Budget per Run + аномалия-детектор
Жёсткий лимит токенов на один запуск (например, 50 000 токенов / $2.00). При превышении — BudgetExceeded.
Сверху — аномалия-детектор на скорость:
- Baseline: средний расход за последние 100 циклов
- Алерт: расход > 5× baseline
- Auto-kill: расход > 10× baseline в течение 60 секунд
В конкретном инциденте heartbeat-мониторинг с per-cycle tracking обнаружил аномалию за 60 секунд. Без него — узнал бы из billing-дашборда утром.
Чеклист защиты
- Schema validation на входе — отсекает невалидные данные до LLM-вызова
- Input fingerprinting — детектирует повторяющиеся входы
- Max retries по сходству входа — останавливает петлю, а не просто считает попытки
- Cost budget per run — жёсткий потолок расхода на запуск
- Token velocity monitor — алерт при аномальной скорости расхода
- Auto-stop + cooldown + restart — убивает процесс, ждёт, перезапускает чисто
- Per-cycle token logging — данные для постмортема и baseline
Масштаб проблемы
- 10 агентов в продакшне, каждый может зациклиться → потенциально $5 000 за ночь
- Claude Opus или GPT-4 Turbo с длинным контекстом → стоимость цикла в 3–5× выше
- Агент с tool use, который в петле вызывает внешние API → каскадные затраты
Это не edge case. Любой retry-механизм, использующий LLM для «исправления» собственных ошибок, потенциально уязвим.
Главный урок
Токены — это ваш CPU для LLM-агентов. Мониторьте их как мониторите CPU и память. Token velocity (токены в минуту) — самая надёжная метрика здоровья агента.
Circuit breaker, cost budget, input validation — три вещи, которые внедряются за день и экономят месяцы нервов. Если у вас есть LLM-агенты в продакшне без этих трёх защит — вопрос не «если», а «когда».