AACSearch / руководство
A/B-эксперименты
Распределяйте трафик поиска и рекомендаций между вариантами по сессиям, измеряйте их событиями, получайте уведомление о найденном победителе и продвигайте или откатывайте его.
Эксперимент делит трафик одной коллекции между вариантами. Вариант — это набор параметров поиска (и, при необходимости, рекомендаций), которые накладываются на запросы назначенных ему сессий. Отчёты сравнивают варианты по событиям, которые отправляет ваша витрина.
Для экспериментов нужна функция тарифа experiments (тариф Pro). Без неё любая
операция с экспериментами отвечает 403. Управление — полным ключом;
поисковые ключи участвуют только через заголовок сессии.
| Операция | Row label / название строки |
|---|---|
listExperiments — GET /experiments | все эксперименты |
createExperiment — POST /experiments | создать черновик |
getExperiment, updateExperiment, deleteExperiment — /experiments/{experimentId} | прочитать, изменить (не во время работы), удалить |
startExperiment, stopExperiment — POST …/start, POST …/stop | запустить и остановить |
getExperimentReport — GET …/report | метрики по вариантам |
promoteExperiment — POST …/promote | отдать весь трафик одному варианту |
rollbackExperimentPromotion — POST …/promotion/rollback | отменить последнее продвижение |
Создание
const experiment = await client.experiments.createExperiment({
name: "Сначала популярные",
collection: "products",
traffic: 0.5,
variants: [
{ id: "control", search_params: {} },
{ id: "popular", weight: 1, search_params: { sort_by: "popularity:desc,_text_match:desc" } },
],
});| Поле | Row label / название строки |
|---|---|
collection | Коллекция, запросы к которой участвуют |
traffic | Доля сессий, которые вообще участвуют, от 0 до 1 (по умолчанию 1). Остальные получают запрос без изменений |
variants | Не меньше двух. Первый — контрольный: оставьте у него пустые search_params |
variants[].id | 1–64 символа: буквы, цифры, _ или -; уникален в эксперименте |
variants[].weight | Относительная доля участвующих сессий (по умолчанию 1). Хотя бы один вес должен быть положительным |
variants[].search_params | Накладываются на каждый поиск варианта: например, sort_by, preset, curation_tags, synonym_sets, filter_by, query_by_weights |
variants[].recommendation_params | Накладываются на getRecommendations для сессий варианта |
Неверная конфигурация — 400. Новый эксперимент создаётся в статусе draft и
ничего не меняет до startExperiment.
Жизненный цикл
startExperimentпереводит эксперимент вrunningи записываетstarted_at. Если эксперимент уже запущен, ответ —409. Запуск сбрасывает победителя, найденного в прошлом прогоне.stopExperimentпереводит вstoppedи записываетstopped_at. Если эксперимент не запущен, ничего не меняется.updateExperimentотвечает409, пока эксперимент работает: остановите, измените, запустите снова.deleteExperimentудаляет эксперимент.
Запуск, остановка и продвижение отправляют вебхуки experiment.started,
experiment.stopped и experiment.promoted.
Участие: заголовок сессии
Запрос участвует, только если в нём есть X-NOVA-SESSION-ID. Используйте один
id на вкладку браузера; пакеты aacsearch-ui и виджет передают его сами. Без
заголовка запрос никогда не участвует и получает исходные параметры.
Назначение детерминировано. Id эксперимента и id сессии хешируются в точку: если
она ниже traffic, сессия участвует, и та же точка выбирает вариант с учётом
весов. Одна и та же сессия всегда видит один и тот же вариант — без поиска в базе
и без наших cookie.
Заголовок включает в эксперимент запросы searchCollection и multiSearch. Для
getRecommendations используется заголовок или поле session_id в теле.
Применённые варианты возвращаются в заголовке ответа:
X-Nova-Experiment: 8c1f…:popularЕго значение — <experiment_id>:<variant_id>; если на коллекции работает
несколько экспериментов, значения перечисляются через запятую.
Измерение
Отчёты связывают ваши события с назначениями по
сессии. В каждом событии передавайте в session_id то же значение, что и в
X-NOVA-SESSION-ID, и добавляйте query_id, чтобы клики и покупки
атрибутировались.
getExperimentReport считает по каждому варианту события в окне работы
эксперимента (от started_at до stopped_at):
| Поле | Row label / название строки |
|---|---|
sessions | Сессии, назначенные варианту |
searches, clicks, add_to_carts, purchases | Число событий |
revenue | Сумма value по событиям покупки |
ctr, conversion_rate | Клики и покупки, делённые на число поисков |
ctr_ci, conversion_rate_ci | 95% доверительные интервалы Уилсона (lower, upper) |
significant_vs_control | true, если интервал конверсии варианта целиком выше интервала контрольного |
significant_vs_control либо true, либо отсутствует. Поля нет, пока у любой
из сторон меньше 30 поисков или пока интервалы пересекаются. Варианты, убранные
продвижением, остаются в отчёте.
Определение победителя
Ночная задача (04:00 UTC) строит тот же отчёт для каждого работающего эксперимента, у которого ещё не записан победитель. Победитель записывается, только когда выполнены оба условия:
- У контрольного варианта и у кандидата не меньше 30 поисков каждый.
- Кандидат
significant_vs_control.
Если подходят несколько вариантов, побеждает вариант с большей конверсией, при
равенстве — с большим числом поисков. Затем задача отправляет вебхук
experiment.winner_detected:
{
"experiment_id": "8c1f…",
"collection": "products",
"winner_variant_id": "popular",
"conversion_rate": 0.042,
"reason": "Clears control's confidence interval (1840 vs 1795 searches)."
}Задача никогда не продвигает вариант сама: компромисс между выручкой и конверсией и сезонность по-прежнему оценивает человек. Подпишитесь на это событие, чтобы уведомлять ответственного, — настройка доставки, проверка подписи и обработка повторов описаны в разделе Вебхуки.
Продвижение и откат
await client.experiments.promoteExperiment({ experimentId, variant_id: "popular" });Продвижение оставляет в variants только выбранный вариант и ставит traffic
в 1. Эксперимент продолжает работать, так что каждая участвующая сессия
получает победителя. Прежняя конфигурация и отчёт на этот момент сохраняются
как ревизия. Неизвестный variant_id — 400.
rollbackExperimentPromotion восстанавливает варианты и трафик, сохранённые
последним продвижением, и не меняет статус. Если отменять нечего или
конфигурация с тех пор изменилась, ответ — 409.
Продвинутый эксперимент по-прежнему действует только на запросы с
X-NOVA-SESSION-ID. Чтобы победитель стал поведением по умолчанию для всех,
перенесите его параметры в конфигурацию коллекции (пресет или
поисковые правила) и остановите эксперимент.
Экран «Эксперименты» в консоли выполняет те же операции; см. Аналитика и качество.