Четверг, семь вечера. Смена смен на складе. Дата-саентисты радостно пушат новую модель маршрутизации роботов-комплектовщиков. На отложенной выборке метрики сияют: ROC-AUC пробил небеса, среднее время пути сократилось на восемь процентов. Релиз. Через пятнадцать минут на узловых перекрестках склада образуется пробка из железа стоимостью в годовой бюджет вашего отдела. Система встала намертво. Отката по одной кнопке нет, потому что никто не думал, что лучшая по офлайн-тестам версия ляжет на реальном железе под пиковой нагрузкой. Именно здесь начинается A/B-тестирование ML-моделей в проде.
Сказки про стопроцентное покрытие тестами оставьте для конференций. Реальность такова, что офлайн-метрики врут всегда.
Вы можете сколько угодно вылизывать точность или MAPE на исторических датасетах. Но исторические данные мертвы. Они не учитывают петлю обратной связи. Как только ваша модель начинает влиять на реальный мир — выдавать рекомендации, отклонять транзакции или поворачивать тележку на складе — мир меняется. Пользователь кликает иначе. Мошенник меняет паттерн. Робот упирается в препятствие, которого не было в логах прошлой недели. Сравнивать офлайн-оценку с поведением в дикой природе — это как проверять подвеску автомобиля на стоящем на месте стенде. Чтобы понять, не сломали ли вы бизнес, нужен онлайн-эксперимент.
Теневой режим против канарейки: битва за безопасность выкатки
Безопасная выкатка модели в продакшен никогда не бывает бинарной. Нельзя просто переключить рубильник с версии А на версию Б. Сначала в дело вступает теневой режим, он же shadow mode. Вы поднимаете новую модель параллельно с текущей. Старая модель по-прежнему управляет процессом, но трафик дублируется на новую. Ее ответы просто пишутся в логи. Никакого влияния на бизнес.
Здесь мы ловим чистую инженерию: сколько памяти жрет ваша новая архитектура, не течет ли контекст, как модель держит p99 latency под реальным RPS. Теневой режим спасает сервера, но он совершенно слеп к продуктовым метрикам.
Чтобы проверить реакцию живой системы, нужна канарейка. Мы переводим один процент реального трафика на новую модель. И вот здесь многие ломаются. Выкатить канарейку мало, нужно уметь ее убить. Если на этом одном проценте количество HTTP-ошибок пятисотого семейства ползет вверх или метрика конверсии рушится, система обязана переключить трафик на старую версию автоматически. Никаких красивых дашбордов и судорожных звонков дежурному среди ночи. Нужен жесткий триггер. Бизнес-метрика вышла за пределы доверительного интервала — автоматический откат бездушным скриптом.
Настоящее A/B-тестирование ML-моделей и ловушка статзначимости
Когда модель выжила в тени и не убила канарейку, начинается честный A/B-тест. Бой старой надежной классики против свежей генерации за реальные деньги. Главное правило этого этапа — навсегда забудьте про ML-метрики. Точность предсказаний больше никого не волнует. Вас интересует только бизнес-метрика: средний чек, время доставки, retention, доля брака на конвейере. Вы можете выкатить нейросеть, которая предсказывает спрос с феноменальной точностью, но если из-за ее задержки в триста миллисекунд клиенты уходят с экрана оплаты, ваша модель — мусор.
Кстати, о сроках тестирования. Желание продактов остановить эксперимент на второй день, как только графики разошлись, уничтожило больше компаний, чем экономические кризисы.
Вы обязаны дождаться статистической значимости. И нет, это не просто магия p-value меньше пяти сотых. Длительность теста должна покрывать естественную сезонность вашего трафика. Выходные отличаются от будней. Утро отличается от ночи. Если вы тестируете скоринг кредиток, поведение людей в день зарплаты и за три дня до нее — это две разные вселенные. Остановите тест раньше, зафиксируете случайный шум как победу, раскатаете модель на сто процентов пользователей и получите системную просадку выручки к концу месяца.
У нас в Morana Labs процесс развертывания индустриального ИИ жестко зашит в инфраструктуру. Ни одна заказная нейросеть не касается управления производственным оборудованием, пока не отработает в shadow-режиме минимум неделю, собирая профиль нагрузки на изолированном контуре клиента. Затем идет канареечный выкат с хардкод-триггерами на деградацию p99 latency и пропускной способности. Только после этого мы переходим к замеру финансовой эффективности в честном A/B-тесте. Железо не прощает иллюзий дата-саентистов, а заводской конвейер не умеет ждать, пока вы перезагружаете потекший контейнер. Выкатка модели должна быть самым скучным и предсказуемым событием в вашей инженерной практике.