Универсальный ⏱ 9 мин надёжность

Что делать, когда сгорело: обработка ошибок и восстановление

🧊 Won't Have 💧 Could Have ☀️ Should Have 🔥 Must Have
☀️ Should Have
Не сердце механики, но именно это отделяет демо от системы, которой можно доверить реальную работу. Если планируешь запускать агента «в бой» — читай обязательно.

🤔 Зачем это читать

Пятница, вечер, у тебя на работе агент сам разбирает входящие заявки. И тут падает один сервис — допустим, та система, откуда агент тянет остатки на складе. Не агент сломался, а одна труба, к которой он ходит. И дальше — два сценария, оба плохие. Либо агент встаёт колом на ровном месте: одна заявка не прошла — и вся очередь замерла, гора необработанных писем растёт, а ты узнаёшь об этом в понедельник. Либо наоборот — он начинает долбиться в мёртвый сервис снова и снова, без остановки, и к утру ты видишь счёт за вызовы модели, от которого холодеет внутри.

Знакомо? Или вот ближе к жизни: тебе на демо показывают идеально работающего агента. Всё гладко, все кивают, проект запускают. А через месяц он спотыкается на первой же кривой строчке данных — потому что на демо данные были чистые, а в реальности приходит мусор, таймауты (превышение времени ожидания), формат, который агент не ждал. И «гладкий агент» оказывается тем самым, который либо виснет, либо жжёт деньги по кругу.

Дело в том, что в реальной работе что-нибудь обязательно «сгорит»: сервис не ответит, формат придёт кривой, истечёт время ожидания. Вопрос не «случится ли», а «что агент сделает, когда случится». И хороший агент на одном сбое не падает целиком — он замечает проблему, пробует выкрутиться, а если не выходит — аккуратно зовёт человека, а не крутится в пустоту.

После этой темы ты сможешь разобрать любой сбойный сценарий на части и сказать, что агент должен сделать: повторить попытку, пойти запасным путём, отдать частичный результат или позвать тебя — и, главное, где поставить предохранитель, чтобы он не сжёг бюджет на бесконечных повторах. Это ровно та разница между «агент на демо» и «агент, которому можно доверить пятничный вечер».

Задержись на 10 секунд. Вспомни последний раз, когда у тебя на работе что-то «отвалилось» — не упало совсем, а именно один кусок: банк-клиент завис, поставщик не прислал накладную вовремя, выгрузка пришла битой. Что ты тогда сделал? Скорее всего, не бросил всю работу и не стал тупо жать одну кнопку сто раз. Ты подождал, попробовал по-другому, а если совсем никак — позвонил кому надо. Подержи эту картинку. Окажется, что грамотный агент ведёт себя ровно как ты в тот момент.

🔥 Сгорел стейк — это ещё не конец смены

В теме 5.2 про зацикливание мы разобрали, как агент может застрять в бесконечном круге и сжечь бюджет, и поставили туда простой предохранитель — лимит на число кругов. Эта тема — про то же самое, только под другим углом: что делать, когда круг ломается не из-за самого агента, а потому что снаружи что-то сгорело. И снова проще всего понять на кухне.

Представь обычную кухню в час пик. У повара на гриле горит стейк, под рукой кладовая, бригада, шеф где-то рядом. И вот — авария: гриль вырубился прямо посреди заказа. Что делает нормальная кухня? Точно не одно из двух: не закрывает весь ресторан из-за одной сгоревшей конфорки и не пытается жарить на мёртвом гриле снова и снова, пока кухня не сгорит. Нет. Кухня обрабатывает аварию по лестнице — от лёгкого к тяжёлому.

Сначала повар замечает, что гриль не греет (а не подаёт гостю сырое мясо). Потом пробует выкрутиться сам: перекинуть стейк на второй гриль; если второго нет — дожарить на сковороде; если и сковорода занята — предложить гостю похожую позицию из меню. И только если совсем тупик — зовёт шефа, который решает на своём уровне. А сгоревший продукт, который уже не спасти, повар откладывает в сторону — не суёт обратно в кастрюлю, чтобы не испортить остальное блюдо.

Вот эта лестница и есть то, что по-научному называется обработка ошибок и восстановление (error handling и recovery). Три большие ступени, давай разберём каждую.

🪜 Лестница из трёх ступеней

Когда что-то «сгорает», грамотный агент проходит ровно три стадии — обнаружить, обработать, восстановиться. Они идут по порядку, и на каждой агент пытается остаться на месте, прежде чем подниматься выше (а выше — это всегда дороже и медленнее).

Что агент делает, когда шаг «сгорел»
👃
1. Обнаружить (detection)
Понять, что шаг не удался: сервис вернул ошибку, истекло время ожидания (таймаут), пришёл кривой формат. Повар нюхает и видит: гриль не греет. Без этого шага агент подаст «сырое».
🔧
2. Обработать (handling)
Попробовать выкрутиться на месте: повторить (retry), пойти запасным путём (fallback) или отдать частичный результат (мягкая деградация). Второй гриль → сковорода → похожая позиция в меню.
🧑‍🍳
3. Восстановиться (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-проекта.

  1. Возьми задачу, которую ты бы хотел отдать агенту (или которую уже отдал). Выпиши, на какие внешние системы он при этом опирается: склад, банк-клиент, CRM, почта, какой-то сервис. Это и есть точки, где может «сгореть».
  2. Выбери одну такую систему и пройди по лестнице вслух. Что делать, если она не ответит? Есть ли смысл в повторе (сбой разовый или вход невалидный)? Есть ли запасной путь — другой источник тех же данных? Можно ли отдать частичный результат честно? И на каком шаге обязателен человек, потому что действие необратимо или дорого?
  3. Найди в своём сценарии хотя бы одно действие, на котором агент обязан остановиться и позвать тебя, что бы ни случилось (перевод денег, отправка письма клиенту, списание со склада). Подчеркни его. Это твой главный предохранитель — и первый вопрос, который ты теперь зададишь любому, кто принесёт тебе «готового агента».

Помнишь холодок из начала страницы — агент, который либо встал колом, либо жёг деньги всю ночь? Теперь у тебя есть рамка, чтобы этого не допустить: лестница реакций и один внятный вопрос к каждому «готовому» агенту — «а что он делает, когда сгорит?».

🔗 Что дальше

Связанные темы:

Рядом в модуле 11: