Что делать, когда сгорело: обработка ошибок и восстановление
🤔 Зачем это читать
Пятница, вечер, у тебя на работе агент сам разбирает входящие заявки. И тут падает один сервис — допустим, та система, откуда агент тянет остатки на складе. Не агент сломался, а одна труба, к которой он ходит. И дальше — два сценария, оба плохие. Либо агент встаёт колом на ровном месте: одна заявка не прошла — и вся очередь замерла, гора необработанных писем растёт, а ты узнаёшь об этом в понедельник. Либо наоборот — он начинает долбиться в мёртвый сервис снова и снова, без остановки, и к утру ты видишь счёт за вызовы модели, от которого холодеет внутри.
Знакомо? Или вот ближе к жизни: тебе на демо показывают идеально работающего агента. Всё гладко, все кивают, проект запускают. А через месяц он спотыкается на первой же кривой строчке данных — потому что на демо данные были чистые, а в реальности приходит мусор, таймауты (превышение времени ожидания), формат, который агент не ждал. И «гладкий агент» оказывается тем самым, который либо виснет, либо жжёт деньги по кругу.
Дело в том, что в реальной работе что-нибудь обязательно «сгорит»: сервис не ответит, формат придёт кривой, истечёт время ожидания. Вопрос не «случится ли», а «что агент сделает, когда случится». И хороший агент на одном сбое не падает целиком — он замечает проблему, пробует выкрутиться, а если не выходит — аккуратно зовёт человека, а не крутится в пустоту.
После этой темы ты сможешь разобрать любой сбойный сценарий на части и сказать, что агент должен сделать: повторить попытку, пойти запасным путём, отдать частичный результат или позвать тебя — и, главное, где поставить предохранитель, чтобы он не сжёг бюджет на бесконечных повторах. Это ровно та разница между «агент на демо» и «агент, которому можно доверить пятничный вечер».
Задержись на 10 секунд. Вспомни последний раз, когда у тебя на работе что-то «отвалилось» — не упало совсем, а именно один кусок: банк-клиент завис, поставщик не прислал накладную вовремя, выгрузка пришла битой. Что ты тогда сделал? Скорее всего, не бросил всю работу и не стал тупо жать одну кнопку сто раз. Ты подождал, попробовал по-другому, а если совсем никак — позвонил кому надо. Подержи эту картинку. Окажется, что грамотный агент ведёт себя ровно как ты в тот момент.
🔥 Сгорел стейк — это ещё не конец смены
В теме 5.2 про зацикливание мы разобрали, как агент может застрять в бесконечном круге и сжечь бюджет, и поставили туда простой предохранитель — лимит на число кругов. Эта тема — про то же самое, только под другим углом: что делать, когда круг ломается не из-за самого агента, а потому что снаружи что-то сгорело. И снова проще всего понять на кухне.
Представь обычную кухню в час пик. У повара на гриле горит стейк, под рукой кладовая, бригада, шеф где-то рядом. И вот — авария: гриль вырубился прямо посреди заказа. Что делает нормальная кухня? Точно не одно из двух: не закрывает весь ресторан из-за одной сгоревшей конфорки и не пытается жарить на мёртвом гриле снова и снова, пока кухня не сгорит. Нет. Кухня обрабатывает аварию по лестнице — от лёгкого к тяжёлому.
Сначала повар замечает, что гриль не греет (а не подаёт гостю сырое мясо). Потом пробует выкрутиться сам: перекинуть стейк на второй гриль; если второго нет — дожарить на сковороде; если и сковорода занята — предложить гостю похожую позицию из меню. И только если совсем тупик — зовёт шефа, который решает на своём уровне. А сгоревший продукт, который уже не спасти, повар откладывает в сторону — не суёт обратно в кастрюлю, чтобы не испортить остальное блюдо.
Вот эта лестница и есть то, что по-научному называется обработка ошибок и восстановление (error handling и recovery). Три большие ступени, давай разберём каждую.
🪜 Лестница из трёх ступеней
Когда что-то «сгорает», грамотный агент проходит ровно три стадии — обнаружить, обработать, восстановиться. Они идут по порядку, и на каждой агент пытается остаться на месте, прежде чем подниматься выше (а выше — это всегда дороже и медленнее).
Ключевая мысль всей лестницы: не падать целиком из-за одного сбоя и не долбиться в стену бесконечно. Один сгоревший стейк — не повод закрывать ресторан. Но и жарить на мёртвом гриле двести раз — не вариант. Между этими двумя крайностями и живёт грамотная обработка ошибок.
🍳 Выкрутиться можно по-разному — какой приём когда
Вторая ступень — «обработать» — самая интересная, потому что внутри неё несколько разных приёмов, и важно не путать, когда какой уместен. Разберём по порядку, от самого лёгкого к самому грубому.
Повтор (retry) — просто попробовать ещё раз. Самый первый и дешёвый приём. Сервис не ответил из-за секундного сбоя сети? Повтори запрос — скорее всего, со второй попытки пройдёт. Это как перекинуть стейк на соседний, рабочий гриль. Одна тонкость: повторять стоит не сразу встык, а с нарастающей паузой (подожди мгновение, потом подольше) — чтобы не задолбить запросами сервис, который и так на ладан дышит. Но тут зарыта главная ловушка темы. Повтор имеет смысл только если есть шанс, что в следующий раз получится. Сервис мигнул — повтор поможет. А вот если ты послал в систему заведомо невалидный запрос (неправильный формат, несуществующий номер клиента), то хоть сто раз повтори — результат будет тот же, ты просто сто раз заплатишь за один и тот же провал. Это и есть «жарить на мёртвом гриле». Поэтому у повторов всегда стоит лимит, и он намеренно маленький — обычно две-три попытки. Логика простая: если сервис не ожил за пару-тройку попыток, он почти наверняка лёг всерьёз, а не мигнул, — и каждая лишняя попытка после этого только жжёт деньги и время впустую. Точное число — вопрос настройки под конкретный случай; важно не магическое «три», а сам принцип потолка: не прошло за лимит — стоп, повторы тут не работают, идём дальше по лестнице.
Запасной путь (fallback) — добиться того же другим способом. Не получилось через основной канал — попробуй обходной. Не отвечает «умный» сервис — возьми данные из более простого. Не работает дорогая модель — переключись на запасную попроще. Это сковорода вместо гриля: блюдо то же, путь другой.
Мягкая деградация (graceful degradation) — отдать частичное, но честно. Иногда полного результата не собрать вообще: один из пяти источников намертво лёг. Тогда лучше отдать то, что есть, и честно пометить, чего не хватает, — чем не отдать ничего. Это «у нас сегодня нет вашей позиции, но есть очень похожая». Гость не уходит голодным — но и не получает обещанного молча, его честно предупредили.
И отдельно — про сгоревший продукт. Когда шаг провалился, его «отход» (кривой ответ сервиса, ошибку, обрывок) нельзя молча подмешивать в работу дальше — испортит всё блюдо. Но и совсем выбрасывать жалко: сам факт ошибки агенту полезен. Что с ним делать аккуратно — в следующем разделе.
📝 Ошибку — в контекст, но коротко
Когда шаг «сгорел», у агента на руках остаётся описание того, что пошло не так. Возникает соблазн скормить агенту всё это целиком, чтобы он «разобрался». Так делать не надо — и вот почему это важно понять как владельцу.
Техническое описание сбоя — это часто простыня на полэкрана (программисты зовут её «стектрейс»): где именно, в какой строке, по какой внутренней причине. Для повара это как если бы при сгоревшем гриле ему зачитали вслух заводскую инструкцию по ремонту электрики на двадцать страниц. Ему это не нужно и только забивает рабочий стол (помнишь из темы 5.2 — у агента ограниченное «поле зрения», и каждый лишний кусок текста его захламляет и стоит денег).
Агенту нужна короткая суть: «пересолено», «гриль не греет», «такого клиента нет в базе». Одна-две строки — что сломалось и достаточно ли этого, чтобы выбрать следующий шаг. Этого хватает, чтобы агент на следующем круге не повторил ту же ошибку вслепую, а попробовал иначе. Полную простыню — в журнал (про журналы и наблюдаемость — отдельная тема модуля), но не в голову агента.
И вторая половина того же правила, прямая опора на тему про зацикливание: когда лимит повторов исчёрпан — это стоп и человек, а не ещё один круг. Если агент пару-тройку раз попробовал и каждый раз сгорело — продолжать бессмысленно, дальше он просто жжёт бюджет по кругу. Тут и работает потолок: упёрлись в лимит — агент не пытается снова, а откладывает задачу и зовёт человека. Лучше честное «я застрял, посмотри» через минуту, чем тихий пожар на всю ночь.
🧾 Как это выглядит изнутри (на пальцах)
Разложим один сбой по лестнице на псевдокоде — это просто логика на человеческом языке, не настоящий код. Сцена: агент готовит ответ клиенту и должен подтянуть остаток товара со склада, но складской сервис барахлит.
задача = «Узнать остаток товара № 88 и ответить клиенту»
счётчик_попыток = 0
# --- ОБНАРУЖИТЬ + ОБРАБОТАТЬ (повтор с лимитом) ---
пока остаток не получен И счётчик_попыток < 3:
спрашиваю склад про остаток товара № 88
если сгорело (нет ответа / таймаут):
счётчик_попыток = счётчик_попыток + 1
запоминаю КОРОТКО: «склад не ответил» # не всю простыню
# --- если три раза не вышло — НЕ долбимся дальше ---
если остаток так и не получен:
ЗАПАСНОЙ ПУТЬ: беру вчерашнюю выгрузку остатков из почты
если и её нет:
МЯГКАЯ ДЕГРАДАЦИЯ: отвечаю клиенту про товар честно,
но помечаю «точный остаток уточняется» # отдать частичное
# --- ВОССТАНОВИТЬСЯ: если дело критичное — зову человека ---
если клиент ждёт ТОЧНЫЙ остаток (предоплата, опт):
ЭСКАЛАЦИЯ: откладываю задачу, пишу менеджеру «склад недоступен, нужен ты»
# → агент не упал и не зациклился. Выкрутился, где смог, позвал, где не смог.
Видишь устройство? Агент прошёл лестницу сверху вниз: попробовал повтор с лимитом в три попытки, не вышло — пошёл запасным путём, не вышло и там — отдал честный частичный ответ, а где цена ошибки высокая — позвал человека. Ни на одном шаге он не встал колом и ни на одном не ушёл в бесконечный круг. Это и есть «не падать целиком и не долбиться в стену» в чистом виде.
🎮 Сгорело — твоя реакция?
Четыре сбоя из реальной работы агента. В каждом выбери, что он должен сделать. Подсказка-опора: поднимайся по лестнице от лёгкого к тяжёлому (повтор → запасной путь → мягкая деградация → человек), и помни про ловушку — повтор бессмыслен там, где вход заведомо не пройдёт. Жми вариант — сразу увидишь разбор. Это не экзамен, это тренировка чутья.
📖 Ключевые понятия
- Обработка ошибок и восстановление (error handling и recovery)
- Что агент делает, когда шаг «сгорел» (сервис не ответил, формат кривой, истекло время ожидания). Лестница из трёх ступеней: обнаружить → обработать → восстановиться. Смысл — не падать целиком из-за одного сбоя и не долбиться в стену бесконечно.
- Обнаружение (detection)
- Первая ступень: понять, что шаг не удался — сервис вернул ошибку, истёк таймаут (время ожидания), пришёл формат, которого агент не ждал. Без этого агент подаст «сырое» и пойдёт дальше с мусором.
- Обработка (handling)
- Вторая ступень — зонтик над тремя приёмами «выкрутиться на месте»: повтор, запасной путь, мягкая деградация. Идут от лёгкого к грубому; цель — справиться, не поднимаясь до человека.
- Повтор (retry)
- Самый дешёвый приём обработки: попробовать тот же шаг ещё раз, лучше с нарастающей паузой. Помогает при разовом сбое (сеть мигнула). Бессмыслен на заведомо невалидном входе — там повтор только жжёт деньги. Поэтому у повторов есть лимит, намеренно маленький (обычно две-три попытки): не ожил за пару попыток — значит, лёг всерьёз, дальше стоп.
- Запасной путь (fallback)
- Добиться того же результата другим способом: вместо основного канала — обходной, вместо дорогой модели — запасную попроще. Сковорода вместо сломанного гриля: блюдо то же, путь другой.
- Мягкая деградация (graceful degradation)
- Отдать частичный результат и честно пометить, чего не хватает, — когда полного собрать нельзя. Лучше «похожая позиция в меню» с предупреждением, чем пустая тарелка или молчание.
- Эскалация
- Вершина лестницы: когда на месте выкрутиться не вышло, а цена ошибки высока (деньги, необратимое действие) — агент откатывает начатое в чистое состояние и зовёт человека. Лучше честное «я застрял» сейчас, чем тихий пожар на всю ночь.
🛡️ Частые заблуждения
«Если повторять запрос настойчиво, рано или поздно пройдёт»
Не всегда — и это самая дорогая ошибка. Повтор лечит только разовый сбой (сеть мигнула, сервис на секунду икнул). Если же вход заведомо невалиден (кривой формат, несуществующий номер), хоть тысячу раз повтори — ответ будет тот же, ты просто тысячу раз заплатишь за один провал. Поэтому у повторов всегда лимит — около трёх, — после которого агент идёт дальше по лестнице, а не долбится в стену.
«Раз шаг сломался — пусть агент честно остановится и ничего не делает»
«Падать целиком» из-за одного сбоя — другая крайность, не лучше бесконечных повторов. Сгорел один стейк — это не повод закрывать ресторан. У агента есть целая лестница: повторить, пойти запасным путём, отдать частичное честно. Останавливаться и звать человека стоит только когда выкрутиться на месте реально нельзя или цена ошибки высока, — а не на первой же кочке.
«Чтобы агент разобрался в сбое, надо отдать ему всё техническое описание ошибки целиком»
Наоборот, вредно. Полная техническая простыня забивает агенту «поле зрения», путает его и стоит денег за каждый лишний кусок текста. Агенту нужна короткая суть — «склад не ответил», «такого клиента нет», — одной-двух строк хватает, чтобы выбрать следующий шаг. Полное описание — в журнал, для людей, но не в голову агента.
🧠 AI-чутьё (AI Judgment)
Между «падает целиком» и «долбится в стену» — узкая, но единственно правильная тропа
Главная рамка темы: у любого сбоя есть две тупиковые крайности, и обе дорого стоят. Первая — агент встаёт колом из-за одной отвалившейся трубы: вся очередь замирает, работа стоит, а узнаёшь ты об этом постфактум. Вторая — агент уходит в слепые повторы на заведомо невалидном входе и жжёт бюджет по кругу, пока кто-то не заметит счёт. Грамотная обработка ошибок — это узкая тропа между ними: выкручиваемся, где можно, дёшево; поднимаемся по лестнице, только когда нужно; зовём человека там, где цена ошибки высокая или попытки исчерпаны.
Практический вывод владельца: когда тебе показывают «идеально работающего агента», главный вопрос не «как он работает, когда всё хорошо», а «что он делает, когда что-нибудь сгорит». Спроси прямо: сколько повторов и при каких ошибках? Что он делает, когда повторы исчерпаны, — есть ли запасной путь? Может ли отдать частичный результат честно? И на каких действиях он обязан остановиться и позвать человека? Если на демо данные были стерильные, а на эти вопросы внятного ответа нет — перед тобой не система, а репетиция. Разница вскроется в первую же пятницу.
И помни связку с темой про зацикливание: лимит на попытки плюс эскалация человеку — это один и тот же предохранитель, вид сбоку. Он стоит копейки относительно ночного счёта за повторы и относительно репутации, которую агент сожжёт, если будет либо молча стоять, либо тихо гореть.
🎯 Практика
Одно задание на пять минут — оно превращает книжную «лестницу» в твой рабочий чек-лист для любого AI-проекта.
- Возьми задачу, которую ты бы хотел отдать агенту (или которую уже отдал). Выпиши, на какие внешние системы он при этом опирается: склад, банк-клиент, CRM, почта, какой-то сервис. Это и есть точки, где может «сгореть».
- Выбери одну такую систему и пройди по лестнице вслух. Что делать, если она не ответит? Есть ли смысл в повторе (сбой разовый или вход невалидный)? Есть ли запасной путь — другой источник тех же данных? Можно ли отдать частичный результат честно? И на каком шаге обязателен человек, потому что действие необратимо или дорого?
- Найди в своём сценарии хотя бы одно действие, на котором агент обязан остановиться и позвать тебя, что бы ни случилось (перевод денег, отправка письма клиенту, списание со склада). Подчеркни его. Это твой главный предохранитель — и первый вопрос, который ты теперь зададишь любому, кто принесёт тебе «готового агента».
Помнишь холодок из начала страницы — агент, который либо встал колом, либо жёг деньги всю ночь? Теперь у тебя есть рамка, чтобы этого не допустить: лестница реакций и один внятный вопрос к каждому «готовому» агенту — «а что он делает, когда сгорит?».