Представьте: пятница, вечер. Ваш AI-бот бодро закрывает продажи, команда уже разошлась по домам, а вы мысленно подсчитываете недельную конверсию. И тут — бац — главный LLM-провайдер «ложится». Или, что ещё коварнее, начинает отвечать с задержкой в 30 секунд. Клиенты видят крутящиеся спиннеры, поддержка захлебывается в тикетах, а вы... вы считаете упущенную выручку и думаете, как объяснить это руководству в понедельник. Знакомо? Это классический сценарий отсутствия катастрофоустойчивости.
Мы сами прошли через это не один раз. Помню случай, когда один из крупных LLM-провайдеров «прилёг» аккурат в разгар промо-акции нашего клиента. За два часа простоя бизнес потерял около 200 потенциальных заявок. После этого мы переосмыслили подход к архитектуре и теперь готовы поделиться выводами.
Даже лучшие модели — да, и GPT-4, и Claude, и Llama — иногда падают. Иногда они начинают галлюцинировать, выдавая абсолютно уверенные, но совершенно бредовые ответы. Иногда возвращают ответы в формате, который ломает ваш фронтенд (привет, неожиданный markdown в JSON-поле). Для бизнеса это не просто «технический сбой» — это прямой удар по NPS, репутации и деньгам. В этой статье мы разберем, как построить систему, которая продолжит работать (пусть и в упрощенном режиме), даже когда у вендора «пожар».
Для кого этот гайд: Для CTO, технических лидов и архитекторов, которые хотят спать спокойно, зная, что их бот не превратится в «кирпич» при первом же сбое API. А ещё — для всех, кто устал объяснять бизнесу, почему «умный бот» вдруг стал немым.
Одна из самых распространённых ошибок, которую мы видим у команд, впервые запускающих AI-бота в продакшн — это копирование SLA провайдера в свои договоры. Логика кажется простой: «OpenAI обещает 99.9% — значит, и мы можем». Но это ловушка.
Дело в том, что ваша система — это не только LLM. Это ещё и ваш бэкенд, база данных, сетевые соединения, CDN, интеграции с CRM и ещё десяток компонентов. Каждый из них добавляет свои риски. В теории вероятностей это называется «цепочка надёжности»: общая надёжность системы равна произведению надёжностей всех её компонентов. Если у вас пять систем по 99.9%, итоговая доступность уже 99.5%. А если какая-то интеграция работает на честном слове — считайте сами.
Поэтому золотое правило: ваша надёжность всегда ниже или равна надёжности самого слабого звена. И внешний SLA должен быть консервативнее внутреннего SLO — это ваш буфер для манёвра.
| Метрика (SLI) | Внутренняя цель (SLO) | Что обещаем клиенту (SLA) | Почему так |
|---|---|---|---|
| Доступность | ≥ 99.5% (допускаем ~3.6ч простоя в месяц) | 99.0% (оставляем себе буфер на форс-мажоры) | У LLM бывают «микро-штормы» доступности, которые трудно компенсировать мгновенно. |
| Latency (P95) | < 4 сек (генерация первого токена) | < 7 сек | Клиент готов ждать умный ответ, но до определенного предела. 7 сек — это уже "долго". |
| Точность (Accuracy) | < 1% галлюцинаций в knowledge-base | Best effort (юридически не гарантируем 100%) | Ни одна LLM не дает 100% гарантии фактов. Не подставляйте себя юридически. |
Совет: Всегда закладывайте «подушку безопасности» между вашим внутренним SLO и внешним SLA. Это ваше время на реакцию и переключение рубильников. Мы обычно рекомендуем разницу минимум в 0.5% — кажется мелочью, но в масштабе месяца это дополнительные часы на манёвр.
Самое неприятное в сбоях LLM — они редко происходят резко. Чаще система деградирует постепенно: сначала чуть вырастает время ответа, потом появляются редкие таймауты, затем ошибки становятся чаще... И вот вы уже в полноценном инциденте, хотя могли среагировать на полчаса раньше.
Не ждите полного падения с HTTP 500. К этому моменту ваши клиенты уже давно ушли к конкурентам. Лучше настройте алерты на ранние симптомы — те самые «тревожные звоночки», которые говорят: «Эй, что-то идёт не так, пора смотреть».
Вот на что стоит обратить внимание:
Главный принцип: лучше получить ложный алерт и проверить, что всё в порядке, чем пропустить начало инцидента. Настройте пороги так, чтобы дежурный просыпался раз в неделю по ложной тревоге — это нормально. Но если алертов нет месяцами, вероятно, вы что-то пропускаете.
Когда что-то идёт не так, у большинства ботов есть два состояния: «работает» и «упал». Но между ними — целый спектр промежуточных режимов, которые могут спасти ваш бизнес.
Представьте аварийное питание в здании: когда отключается электричество, лифты перестают работать, но свет в коридорах горит, а пожарная сигнализация продолжает функционировать. Никто не говорит, что здание «сломалось» — оно просто перешло в режим пониженного энергопотребления. С ботами должно быть так же.
Вместо того чтобы показывать пользователю унылое «Сервис недоступен», переводите бота в один из защитных режимов. Пользователь получит хоть какую-то пользу, а вы — время на восстановление.
Отключаем генерацию ответов полностью. Бот ищет только по заранее заготовленной базе Q&A (FAISS, Elasticsearch или даже простой JSON). Это как справочник: спросили — нашли — показали. Работает молниеносно и никогда не выдумывает.
Плюс: 0% галлюцинаций, мгновенный ответ, нулевая нагрузка на LLM.
Минус: Нет эмпатии и гибкости, только сухие заготовленные ответы. Если вопроса нет в базе — бот честно скажет «не знаю».
Бот может рассказать о статусе заказа, показать историю покупок, ответить на вопросы о товарах (все GET-запросы), но не может ничего изменить: ни оформить заказ, ни обновить данные, ни создать заявку.
Когда использовать: Если сломалась запись в БД, CRM лежит или есть проблемы с платёжным шлюзом. Лучше дать пользователю информацию, чем ничего.
Если основная модель недоступна, переключаемся на более простую: GPT-4 → GPT-3.5, Claude → более лёгкая версия, или вообще на локальную Llama. Да, ответы будут менее «умными», но бот продолжит работать.
Важный нюанс: Разные модели по-разному понимают инструкции. Заранее подготовьте упрощённый системный промпт для резервной модели — без сложных цепочек рассуждений и хитрых форматов.
Последний рубеж: бот честно признаётся «Я сейчас испытываю технические трудности, соединяю с оператором». Иногда лучше сразу передать разговор человеку, чем мучить клиента глючным ботом.
Критически важно: Убедитесь, что у вас действительно есть свободные операторы в этот момент. Иначе вы просто перенесёте затор из бота в колл-центр, и клиент будет злиться вдвойне.
Какой режим выбрать? Зависит от того, что именно сломалось. Если проблема только с LLM — включайте «Библиотекаря» или fallback-модель. Если лежит CRM — переходите в «Только чтение». А если всё плохо и вы не понимаете, что происходит — честно эвакуируйте на людей, пока разбираетесь.
Звучит просто: основная модель упала — включаем резервную. На практике всё сложнее. Нельзя просто взять и поменять модель на лету, как лампочку в люстре.
У каждой LLM свой «характер». Claude любит структурированные ответы, GPT иногда добавляет лишние пояснения, Llama может иначе интерпретировать инструкции. Если ваш промпт заточен под одну модель, на другой он может выдать совершенно неожиданный результат — например, JSON с другими ключами или текст вместо структуры.
Вот несколько правил, которые мы выработали на практике:
Знаете, что отличает хороший сервис от плохого в момент перегрузки? Коммуникация. Когда вы видите на сайте «Вы в очереди, время ожидания примерно 2 минуты», вы, скорее всего, подождёте. Это понятно, это честно, это даёт ощущение контроля. А если сайт просто висит с крутящимся спиннером — вы закроете вкладку через 30 секунд.
С ботами всё то же самое. Когда запросов больше, чем может обработать система, не нужно пытаться обслужить всех одновременно — это гарантированный путь к тому, что плохо будет всем. Вместо этого используйте очередь с обратной связью.
Как это работает на практике:
Этот подход называется backpressure — управляемое противодавление. Суть проста: лучше обслужить 80% клиентов качественно и быстро, а 20% честно попросить подождать, чем заставить страдать 100% пользователей от тормозящей системы.
Бонус: очередь даёт вам видимость. Вы можете посмотреть, сколько запросов ждут обработки, и понять масштаб проблемы. Без очереди вы узнаёте о перегрузке только когда клиенты начинают жаловаться.
Когда всё горит, ваша первая линия поддержки — настоящие герои. Они принимают на себя весь негатив от клиентов, пока инженеры разбираются с проблемой. И ваша задача — дать им инструменты, чтобы они не чувствовали себя беспомощными.
Мы рекомендуем сделать в админке простой и заметный рубильник: «Включить режим ЧП». Одна кнопка, которую может нажать даже не-технический сотрудник. Никаких конфигов, никакого SSH — просто клик.
Что происходит при включении этого режима:
И не забудьте про обратную связь для самих операторов. Простой чат или канал в Slack/Telegram, где дежурный инженер пишет: «Знаем о проблеме, работаем, ETA — 30 минут». Это снимает с поддержки необходимость гадать и придумывать ответы на вопросы «А что случилось?».
Три часа ночи, сработал алерт, вы продираете глаза и пытаетесь понять, что происходит. Это худший момент для того, чтобы принимать решения. Голова не работает, контекста нет, паника нарастает.
Именно поэтому всё должно быть прописано заранее. Runbook (книга инструкций) — это ваш друг в 3 часа ночи. Открыл, прочитал, сделал. Без раздумий, без созвонов, без «а давайте подумаем, что делать».
Вот как может выглядеть типичный таймлайн:
Главное правило: runbook должен быть написан так, чтобы его мог выполнить человек, который не спал всю ночь и вообще впервые видит эту систему. Никаких «очевидных» шагов, никаких предположений о контексте. Каждое действие — пошагово, с командами и ссылками.
Когда пожар потушен и все выдохнули, возникает соблазн забыть об инциденте как о страшном сне. Не надо так. Любой сбой — это болезненный, но ценный урок. Он подсвечивает слабые места, о которых вы, возможно, даже не догадывались.
Проведите постмортем — встречу по разбору инцидента. Но только без поиска виноватых. Серьёзно, это важно. Как только люди начинают бояться наказания, они перестают честно рассказывать, что произошло. А без честности вы не поймёте реальные причины.
Главный вопрос не «Кто уронил прод?», а «Почему система позволила это сделать?» Или ещё лучше: «Как сделать так, чтобы даже если Вася случайно уснул на клавиатуре и нажал Delete, всё продолжило работать?» Виноват никогда не человек — виновата система, которая позволила человеческой ошибке превратиться в инцидент.
Обязательные элементы хорошего постмортема:
И последнее: публикуйте постмортемы (хотя бы внутри компании). Это создаёт культуру открытости и помогает другим командам учиться на ваших ошибках.
Собрали несколько вопросов, которые нам чаще всего задают на консультациях. Возможно, вы тоже об этом думали.
Катастрофоустойчивость — это не про «если что-то сломается», а про «когда что-то сломается». И чем раньше вы это примете, тем спокойнее будете спать.
Резюмируя всё вышесказанное, вот чек-лист для самопроверки:
Если у вас сейчас нет и половины этих пунктов — не паникуйте. Начните с малого: настройте базовый мониторинг и создайте хотя бы один резервный режим. Остальное можно добавлять итеративно, по мере роста системы и бюджета.
Мы уже прошли через десятки инцидентов и знаем, где обычно «стреляет». Поможем спроектировать архитектуру с резервными моделями, настроить мониторинг, написать runbook и провести первые учения. Обсудим вашу ситуацию на бесплатной консультации.
Записаться на консультацию