Data science команда обучила новую модель, показывает прирост AUC на тесте, но бизнес не рискует деплоить без доказательств на реальных данных. A/B-тестирование ML-моделей — единственный способ достоверно измерить бизнес-эффект. Метрика на тестовом датасете показывает точность, но не отвечает на главный вопрос: принесёт ли это больше денег или лучший UX? Правильно настроенный A/B-тест даёт статистически обоснованный ответ с контролем рисков. Наши инженеры с опытом в MLOps провели более 30 проектов по внедрению экспериментов в продакшен — от банков до e-commerce. Экономия на инференсе за счёт правильного выбора модели составляет до 30% бюджета. Seldon Core настраивается в 3 раза быстрее, чем самодельный роутинг на Nginx. Хотите так же? Свяжитесь с нами для аудита вашей инфраструктуры.
Почему ML A/B сложнее классического?
В классическом A/B пользователи случайно распределяются между группами один раз. В ML A/B возникают дополнительные сложности:
- Новизна (novelty effect): пользователи реагируют на новинку, а не на качество модели.
- Долгосрочные эффекты: рекомендательные системы влияют на поведение, которое не видно в краткосрочном тесте.
- Перенос эффекта (carryover): результат предыдущего предсказания влияет на текущее поведение.
- Сетевые эффекты: в коллаборативных системах поведение одного пользователя влияет на других.
Эти эффекты требуют осторожного дизайна эксперимента. Например, для борьбы с новизной используют ramp-up с постепенным увеличением доли трафика с 5% до 50%.
Архитектура A/B для ML
Уровни распределения трафика
| Метод | Описание | Когда использовать |
|---|---|---|
| User-level split | Один и тот же пользователь всегда получает одну версию модели | Персонализация, рекомендации |
| Request-level split | Каждый запрос случайно направляется в одну из версий | Stateless сервисы (поиск, ценообразование) |
| Cohort-based split | Разбивка по сегментам пользователей | Баланс по демографическим характеристикам |
Роутинг трафика:
import hashlib def get_model_version(user_id: str, experiment_id: str) -> str: # Детерминированное хэширование для стабильного назначения hash_key = f"{experiment_id}:{user_id}" hash_value = int(hashlib.md5(hash_key.encode()).hexdigest(), 16) bucket = hash_value % 100 # 0-99 if bucket < 50: # 50% трафика return "model_v2" else: return "model_v1_control" Инструменты
Nginx / Envoy — маршрутизация на уровне инфраструктуры по заголовкам или весам. Seldon Core / KServe — Kubernetes-native инференс с встроенным A/B:
apiVersion: machinelearning.seldon.io/v1 kind: SeldonDeployment spec: predictors: - name: control traffic: 70 graph: name: model-v1 - name: treatment traffic: 30 graph: name: model-v2 Feature flags (LaunchDarkly, Unleash) — для гибкого управления экспериментами без деплоя.
Сравнение инструментов
| Инструмент | Управление трафиком | Статистика | Особенности |
|---|---|---|---|
| Seldon Core | Встроенное A/B, canary | Да (prometheus) | Kubernetes-native, поддерживает любые ML-фреймворки |
| KServe | InferenceGraph с % трафика | Нет встроенной | Простая конфигурация, интеграция с Knative |
| LaunchDarkly | Feature flags | Нет | Гибкое управление, не зависит от инфраструктуры ML |
Как выбрать метод распределения трафика?
Выбор зависит от природы сервиса и целей. User-level split хорош для персонализации, но может искажать долгосрочные эффекты. Request-level split проще, но подходит только для stateless нагрузок. Cohort-based split даёт контроль над смещениями, но требует предварительной сегментации. Мы помогаем подобрать оптимальную схему под вашу архитектуру.
Статистическая методология
Метрики для ML A/B:
- Primary metric: бизнес-метрика (конверсия, ARPU, retention)
- Guardrail metrics: latency, error rate — не должны деградировать
- Secondary metrics: proxy-показатели (CTR, engagement)
Размер выборки и мощность теста:
Для обнаружения эффекта размером 2% при baseline конверсии 5%, уровне значимости α=0.05 и мощности 80%, нужно ~15000 пользователей на группу. Используйте калькулятор мощности (scipy.stats.norm или онлайн-инструменты) перед запуском.
Остановка теста:
- Не останавливайте тест раньше запланированного срока из-за ранних результатов (проблема peek)
- Минимальная длительность: 1-2 недели для учёта дневных и недельных паттернов
- Используйте sequential testing (e-values) если нужно принимать решения раньше
Анализ результатов
from scipy import stats control_conversions = [0, 1, 0, 1, ...] # 0/1 для каждого пользователя treatment_conversions = [0, 1, 1, 0, ...] # t-тест для непрерывных метрик t_stat, p_value = stats.ttest_ind(control_conversions, treatment_conversions) # Chi-squared для бинарных метрик from scipy.stats import chi2_contingency contingency = [[control_success, control_fail], [treatment_success, treatment_fail]] chi2, p_value, dof, expected = chi2_contingency(contingency) print(f"Relative lift: {(treatment_rate - control_rate) / control_rate:.2%}") print(f"P-value: {p_value:.4f}") print(f"Statistically significant: {p_value < 0.05}") Что входит в работу
- Аудит текущей инфраструктуры и метрик
- Проектирование схемы распределения трафика (user-level, request-level, cohort)
- Настройка роутинга через Nginx/Envoy или Seldon Core
- Интеграция feature flags для управления экспериментами
- Расчёт необходимого размера выборки и длительности теста
- Мониторинг guardrail метрик (latency, error rate)
- Документирование результатов и передача знаний команде
Процесс работы
- Аналитика — изучаем вашу инфраструктуру, цели и доступные данные.
- Проектирование — выбираем тип сплита, метрики и инструменты.
- Реализация — настраиваем роутинг, интегрируем feature flags, подключаем мониторинг.
- Тест — запускаем пилотный эксперимент на 10% трафика, проверяем корректность.
- Деплой — полномасштабный тест с автоматическими стоп-правилами.
Сроки и стоимость
Сроки настройки A/B-тестирования — от 2 до 4 недель в зависимости от сложности инфраструктуры. Стоимость рассчитывается индивидуально после аудита. Получите консультацию — свяжитесь с нами, чтобы оценить ваш проект. Правильно настроенный A/B-тест позволяет принимать решения о деплое модели на основе данных с измеримым уровнем уверенности, а не интуиции.







