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)

  1. Первая строка: целое m — число следующих JSON-строк.
    Это 1 (конфиг) + число событий.

  2. Строка 2: конфиг, например:

    {"split":{"A":0.7,"B":0.3},"sticky":"user"}

    Поле sticky есть для контекста, в этой задаче используем только "user".

  3. Далее m-1 строк-событий (по одному на строку):

    {"id":"...","user":"..."}

Формат вывода (stdout)

Один JSON, ключи — в лексикографическом порядке:

{"assignments":[...],"counts":{"A":...,"B":...}}

  • assignments — список выбранных вариантов в порядке входящих событий.

  • counts — словарь «вариант → сколько раз выбран», ключи упорядочены.

 

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи