Sticky A/B-маршрутизация LLM: задача на Python
Реализуйте воспроизводимое распределение пользователей между вариантами. В условии зафиксированы хэширование, порядок вариантов и веса: результат не должен меняться от запуска к запуску.
Напишите код и проверьте решение. Продолжить тему можно в курсе LLMOps & Evaluation: из песочницы в продакшн.
Задача: Sticky A/B-роутер по пользователю
Идея. У нас есть конфигурация сплита трафика на варианты (A/B/… с весами). Для каждого запроса нужно детерминированно выбрать вариант по user — так, чтобы один и тот же пользователь всегда попадал в один и тот же бакет (sticky hashing). Это ровно то, что используют в проде для стабильных A/B-экспериментов.
Требования к реализации
-
Хэш:
SHA-256(user), берём первые 8 hex-символов → переводим в число → нормируем в[0,1). -
Варианты сортируем лексикографически по имени и строим накопленные пороги по нормированным весам (веса могут быть долями, напр.
0.3, или целыми, напр.30— надо просто нормировать на сумму). -
Выбор варианта: первый порог, для которого
r < threshold. -
Вывести JSON с отсортированными по ключу полями (см. формат ниже).
Формат ввода (stdin)
-
Первая строка: целое
m— число следующих JSON-строк.
Это 1 (конфиг) + число событий. -
Строка 2: конфиг, например:
{"split":{"A":0.7,"B":0.3},"sticky":"user"}Поле
stickyесть для контекста, в этой задаче используем только"user". -
Далее
m-1строк-событий (по одному на строку):{"id":"...","user":"..."}
Формат вывода (stdout)
Один JSON, ключи — в лексикографическом порядке:
{"assignments":[...],"counts":{"A":...,"B":...}}
-
assignments— список выбранных вариантов в порядке входящих событий. -
counts— словарь «вариант → сколько раз выбран», ключи упорядочены.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Retry backoff, Retry-After и jitter: задача на Python
- RRF на Python: объединить BM25 и векторное ранжирование
- PromptOps: почему хороший промпт требует версий и тестов
- LLM streaming: задержка первого токена и полный ответ
- Расходы на LLM резко выросли: с чего начать проверку
- JSON-лог вызовов LLM на Python: задача с проверкой
