Условие
В поисковую выдачу билетов Aviasales разработана и внедрена скоринговая модель, ранжирующая билеты. Цель — помочь пользователю выбрать лучший авиабилет самым быстрым способом, подняв его в топ выдачи.
Изучите поисковую выдачу сайта и предложите:
- Какие метрики использовали бы, чтобы отслеживать качество работы модели?
- Какие визуализации помогли бы быстро подсветить проблему и разобраться менеджерам, что пошло не так?
- Что важно учесть и какие срезы стоит смотреть отдельно?
- Какие данные нужны?
Решение
Подход
Качество ranking-модели бывает двух видов:
- ML-метрики (offline): NDCG, MAP, MRR, hit-rate@K — насколько порядок модели близок к «идеальному».
- Продуктовые метрики (online): что реально улучшилось в воронке.
Для бизнеса важнее второе, но первое нужно для debug и мониторинга на свежих данных без ожидания целевой метрики.
Метрики
Уровень модели:
| Метрика | Что показывает |
|---|---|
| MRR (Mean Reciprocal Rank) | средний обратный ранг билета, который купили: 1/rank. Если купили первый — 1.0, второй — 0.5. Чем выше — тем модель лучше предсказывает «лучший» |
| Click-through @ K | вероятность клика хотя бы по одному билету в топ-K. Подсветит, не «сломали» ли модель целиком |
| Position of click | средняя позиция кликнутого билета. Должна падать при улучшении ранжирования |
| NDCG @ 10 | если есть «уровневые» лейблы (купил > кликнул > просмотрел), классическая ранжирующая метрика |
| % пустых выдач | sanity-check |
Уровень продукта (бизнес-цель «найти лучший билет быстро»):
| Метрика | Что показывает |
|---|---|
| Time to click | сколько секунд от загрузки до клика. Должно падать |
| Scroll depth | сколько пользователь проскроллил выдачу до клика. Должно падать |
| Search-to-purchase | конверсия поиска в покупку. Главная decision-метрика |
| Refund rate | модель может «толкать» в топ некачественные опции — растут возвраты |
| Repeat-search rate | юзер не нашёл нужное и повторил поиск с другими параметрами |
Гарды:
- Latency / time-to-render выдачи (модель не должна тормозить выдачу).
- Diversity (топ-3 не должен стать монокультурой одного партнёра).
- Coverage (для новых направлений / партнёров модель не должна выдавать пустоту).
Визуализации
Дашборд с 4 секциями:
-
Time-series основных метрик (DAU, MRR, position-of-click, search-to-purchase). Линии за 30 / 60 / 90 дней с маркером последнего значения и сравнением «сегодня vs прошлая неделя».
-
Декомпозиция по сегментам (на тепловой карте):
- платформа (web / iOS / Android) × метрика;
- гео (страна вылета);
- тип маршрута (внутренний / международный, с пересадкой / без);
- ценовой сегмент.
-
Распределение позиции клика и позиции покупки: гистограммы. Если у клика мода на позиции 1, а у покупки — на позиции 5, модель кликабельна, но покупательно неточна.
-
«Глубина просмотра» воронкой: % сессий, у которых был клик в позиции 1; ≤ 3; ≤ 10; > 10. Должна расти доля «коротких» воронок при улучшении модели.
Срезы, которые важны
- Тип запроса: точная дата vs гибкие даты, одно направление vs round-trip. Модель может быть лучше для одного типа.
- Платформа (мобильная и десктопная выдача — разные скроллы и разное число видимых билетов).
- Гео пользователя: модель могла обучаться на одном гео и плохо работать на другом.
- Сегменты партнёров: новый партнёр — холодный старт.
- Цена билета: модель может работать хорошо в эконом-сегменте и плохо в бизнес.
Какие данные нужны
| Источник | Таблица |
|---|---|
| Поисковые сессии | searches(search_id, user_id, query_params, ts, response_latency_ms) |
| Выдача | search_results(search_id, ticket_id, position, score, partner_id, price) |
| Клики | clicks(search_id, ticket_id, ts, position) |
| Конверсии | bookings(search_id, ticket_id, ts, price, refunded) |
| Партнёры | partners(partner_id, commission, quality_rating) |
С этими таблицами считается всё перечисленное выше: позиция клика, MRR, NDCG, конверсия в покупку с привязкой к выдаче.
Подводные камни
- CTR-метрики на ranking — обманчивы. Можно поднять CTR, поставив «жёлтые» билеты в топ — но это не улучшит покупку. Поэтому CTR — вторичная метрика, decision — search-to-purchase.
- Position bias. В верхних позициях клики просто потому, что они в топе. Без debias-метрик (например, IPS) MRR может переоценивать модель.
- Cold-start для новых направлений / партнёров. Если модель не обучена на маршруте — она ставит их низко и они никогда не накопят сигнала.
- Сравнение с базовой сортировкой. Без A/B нельзя надёжно сказать «улучшилась модель» — данные могли поменяться (сезон, цены).
- Self-fulfilling prophecy. Модель учится на своих же кликах. Если выкатить плохую модель и накопить кривой сигнал — следующая обучится на нём.
- Refund — медленная метрика. Возврат может прийти через месяц. Используйте «ранние прокси»: complaints, повторный поиск.
Альтернативы
- Counterfactual evaluation через IPS-веса (debias position bias).
- Periodic offline replay на исторических данных, если выкатка дорогая.
Эталонный ответ
Метрики: ML-уровня (MRR, NDCG, position-of-click) и продуктовые (search-to-purchase, time-to-click, scroll depth, refund). Главная decision-метрика — конверсия search → purchase, ML-метрики используем как раннюю детекцию проблем. Дашборд — time-series + декомпозиция по сегментам (платформа, гео, тип маршрута) + распределение позиций. Самое важное в ответе — отделить «модель кликается» от «модель помогает покупать» и не ловиться на CTR-only.