Падение GigaChat: как три модели спасли нас от таймаутов
14:32, вторник. Приходит заявка на расчёт лизинга, спиннер крутится уже минуту, потом таймаут. Через три минуты в логах 142 ошибки и Slack орёт. GigaChat Pro отдавал 502, статус-page подтвердил инцидент. Клиентам, конечно, плевать на чужие проблемы — им нужен работающий сервис.
Мы подняли резерв за восемь минут без видимого даунтайма. Вот как это было устроено и где я раньше наступал на грабли.
Почему обычные ретраи не спасают
Сначала кажется: «поставим exponential backoff и будет ок». На практике ретраи просто жрут соединения и таймауты, когда модель лежит полностью. В первый серьёзный инцидент у нас из-за этого лёг даже FastAPI — запросы без LLM тоже встали. Вывод простой: ретраи — это про мелкие сетевые hiccup, а при полном падении нужен fallback на другом уровне.
Как у нас выглядит цепочка
Сейчас в проде три уровня:
- Основной — GigaChat Pro (лучшее качество и function calling).
- Резерв — YandexGPT 5 Pro (чуть слабее на сложном JSON, но стабильнее).
- Аварийка — self-hosted T-Lite на своём GPU (просто, независимо, но требует упрощённых промптов).
Каждый уровень — это не просто «слабее», а своя роль. Совать T-Lite промпт, заточенный под GigaChat, — верный путь к галлюцинациям.
Circuit breaker вместо try/except
Простой try/except здесь убивает latency: каждый запрос будет ждать таймаут основного провайдера (15–30 секунд), а потом только идти в резерв. Поэтому используем circuit breaker на Redis: считает ошибки за 60 секунд, при 5 подряд или 30 % ошибок открывается на 120 секунд и сразу шлёт трафик в Yandex. В тот день брейкер сработал к 14:33 и весь поток полетел мимо GigaChat.
Промпты тоже надо готовить
Первая версия fallback технично переключалась, но по качеству была ужасной. Yandex на промптах под GigaChat начал оборачивать JSON в markdown и менять названия полей. Пришлось сделать три вещи:
- Отдельный промпт под каждую модель (версионируем).
- Слой нормализации: выдираем JSON из блоков кода, чиним опечатки и валидируем через Pydantic.
- Автогенерация описания function calls под синтаксис каждого провайдера.
После этого Yandex стал выдавать 94 % валидных ответов вместо 71 %.
Что получилось по цифрам
GigaChat лежал 38 минут. За это время:
- 87 % запросов успешно обработал YandexGPT,
- 10 % ушли на T-Lite после неудачной валидации,
- 3 % отправились оператору.
Средняя задержка выросла с 2.1 до 3.4 секунды, жалоб было всего четыре вместо ожидаемых 80–100. Три процента «человек разберётся» — это осознанный выбор: лучше честно сказать, чем отдать галлюцинацию.
Где подход не работает
Fallback не ловит проблемы качества (когда модель отвечает 200, но плохо). Тут нужны метрики качества и canary. Плюс Yandex дороже, поэтому держим алерт: если резерв тянет больше 20 % трафика дольше 10 минут — инженеру пинг.
Что стоит взять на вооружение
Если у вас один LLM-провайдер — это SPOF, который однажды выстрелит. Минимальный набор, который я бы закладывал сразу:
- два независимых провайдера,
- circuit breaker, а не try/except,
- промпты под каждую модель,
- слой нормализации ответов,
- путь «человек посмотрит» как последняя страховка.
Сейчас в российском ландшауме уже есть из чего собирать: GigaChat, YandexGPT, T-Lite, Saiga. Главное — не ждать вторника 14:32, чтобы понять, что плана Б нет.
