Суть
Обычный деплой отвечает на вопрос «работает ли код». Для агента этого мало: он может работать безупречно и при этом отвечать хуже — недетерминизм и «тихая» деградация качества не ловятся ни одним исключением в логах.
Канарейка ограничивает радиус поражения: если новая связка испортила ответы, это увидели 1% пользователей, а не все.
этап 1 PR + офлайн-эвалы прогон тестового набора против текущей версии
этап 2 Shadow · 1–2 недели зеркало 10–25%, судья сравнивает пары
этап 3 Canary 1→5→20→50% гейт на каждой ступени, ступень ≥ 24 ч
этап 4 100% stable мониторинг продолжается, v(n−1) остаётся тёплой ≥ 24 ч
Любой провал гейта — автоматический откат на тёплую версию. Серьёзный инцидент — postmortem (Blameless Postmortem).
Версия — это связка, а не строка в коде
Версия агента складывается из провайдера, модели, промпта и параметров генерации. Менять их по отдельности бессмысленно: промпт, отлаженный под одну модель, на другой ведёт себя иначе. Канареечная выкатка катит связку целиком, и откат тоже возвращает связку целиком (см. Feature Flags LLM).
Два правила разбиения трафика
Липкость (sticky canary). Пользователь, попавший в канареечную когорту, остаётся в ней всю сессию. Иначе он получает ответы попеременно от двух версий с разным стилем и разной логикой — опыт становится бессвязным, а метрики загрязняются.
Однородные когорты. Не смешивать enterprise и free-tier в одной выборке: у них разные пороги стоимости, разные требования комплаенса и разный характер запросов. Смешанная когорта даёт среднее по несопоставимым группам.
Статистика: почему 1500 сессий не хватит
Для классического UI-теста с кликами хватает ~1500 сессий. Для агентной системы с шумной метрикой качества, чтобы зафиксировать эффект в 5%, нужно 10 000+ сессий на вариант.
Три причины:
- Недетерминизм раздувает дисперсию — один и тот же запрос даёт разные ответы, разброс метрики шире.
- Фидбэк запаздывает — сигналы качества приходят минутами и часами позже самого ответа.
- Нужна стратификация — запросы разбиваются по типам (интентам) до анализа. Без неё редкий класс тонет: если фрод составляет 9% обращений банковского агента, регресс именно на нём не виден в общем среднем.
Инструменты проверки: доверительный интервал Уилсона (показывает, репрезентативна ли выборка), критерий сравнения двух пропорций (различие или шум), расчёт необходимого объёма выборки и проверка, что трафик действительно разделился как задумано — 5/95, а не иначе.
Гейты и пороги отката
Пороги фиксируются заранее, до выкатки — иначе в момент инцидента начинается спор, считать ли текущие цифры регрессом. Минимальный набор: eval-fail-rate, p99 латентности, стоимость запроса, доля ухода в fallback.
Как это выглядит в хорошем случае:
17:04 деплой за флагом — canary 1%, пороги заданы
17:10 алерт: eval-fail-rate канарейки пробил порог 2%
17:12 автооткат на тёплую v(n−1)
Восемь минут и 1% пользователей вместо пятничного вечера в полном составе.
Стратификация не должна опираться на LLM-классификатор. Если признак, по которому режут трафик, сам вероятностный, ошибки классификации перемешивают страты и съедают ровно тот выигрыш в точности, ради которого стратификация делалась. Резать надо по детерминированным признакам, которые известны и без модели: канал обращения, тип клиента, язык, длина запроса, время суток, наличие вложений. Они грубее интентов, но не шумят.
Если разрез по смыслу принципиален, классификатор используют, но фиксируют его версию на весь эксперимент и считают его частью связки-версии (Feature Flags LLM) — иначе смена классификатора посреди выкатки меняет состав страт, и сравнение перестаёт быть сравнением.
Если трафика на статистику не хватает
Отказываться от канареечной выкатки не надо — надо перестать ждать от неё того, чего она на малом трафике не даёт. Порядок действий по убыванию полезности:
- Растянуть окно вместо уменьшения выборки. Сессии копятся по времени; неделя вместо дня часто закрывает вопрос, а цена — только отсрочка выката.
- Поднять минимальный обнаружимый эффект осознанно. Признать, что вы ловите не «просадку на 1%», а «просадку на 10%», и записать это как границу метода, а не делать вид, что маленькая выборка даёт тот же вывод.
- Заменить статистику на парное сравнение. Shadow Mode прогоняет обе версии на одном и том же трафике, поэтому дисперсия между пользователями уходит из сравнения и нужный объём падает на порядок.
- Опереться на детерминированные гейты. Схемные ошибки, нарушения лимитов и падения фиксируются на единицах случаев и не требуют статистики вовсе — их и стоит ставить условием отката, а качество ловить офлайн-набором (Agent Evals).
Чего делать нельзя — объявлять победу по трёмстам сессиям: разница, не пережившая проверку размером выборки, чаще всего оказывается шумом, и откат придётся делать уже по жалобам.
Сравнение стратегий
| Стратегия | Трафик на кандидата | Что проверяет | Риск |
|---|---|---|---|
| Shadow | копия, 0% | Поведение на реальном трафике, регрессии качества | нулевой |
| Canary | малая доля живого | То же плюс реакцию людей | ограниченный радиус |
| Blue-green | всё или ничего | Мгновенное переключение веток | высокий |
Deploy ≠ Release и конкретные триггеры отката
Принцип, отделяющий доставку от выдачи: код и веса доставлены на серверы — это deploy; доступ пользователей к ним управляется маршрутизацией трафика — это release. Разделение и делает возможным всё описанное выше: откат становится изменением маршрутизации, а не повторным деплоем, и потому занимает секунды, а не минуты сборки.
Триггеры автоматического отката делятся на три группы, и держать нужно все три — они ловят разное:
Инфраструктурные. Доля ошибок 5xx выше 1,0% на протяжении трёх минут; p99 задержки выше двукратного baseline; перезапуски подов по причине нехватки видеопамяти.
Порог 1,0% относится именно к гейту канарейки и намеренно строже, чем порог продакшен-алерта (2% за 2 минуты) и тем более порога circuit breaker (15% за 30 секунд) — сравнение всех трёх в AI Observability Stack. Откат канарейки дёшев и затрагивает малую когорту, поэтому здесь выгоднее ошибиться в сторону лишнего срабатывания.
Качественные. Падение достоверности ниже baseline − 0,05; доля отрицательных оценок в канареечной когорте более чем вдвое выше контрольной группы.
Безопасность. Обнаружение хотя бы одной утечки персональных данных — порог здесь единица, а не процент, потому что вторая утечка уже не меняет юридических последствий первой.
Механика липкости. Детерминированное хеширование пользователя (например, MurmurHash3 от user_id) даёт привязку к когорте без хранения состояния: один и тот же пользователь при каждом запросе попадает в одну и ту же версию, а сервису не нужна таблица соответствий. Это и есть техническая реализация правила sticky canary из раздела выше — важная в том числе для корректности последующего анализа эксперимента.
Связано с
- Shadow Mode — предыдущий этап конвейера
- Feature Flags LLM — механизм, которым канарейка включается и откатывается
- Incident Management AI — что происходит, когда гейт всё же пропустил проблему
- Agent Evals — офлайн-набор, с которого начинается конвейер
- LLM as Judge — оценка качества на живом трафике