Спроектируйте алгоритм ранжирования документов для поисковой системы, который учитывает релевантность, свежесть и персонализацию; какие метрики качества (precision@k, NDCG и т.д.) использовать для оценки и какие эвристики или ML‑модели применить для комбинирования сигналов
1) Сигналы (фичи)
- Релевантность: классические скореры (BM25, TF‑IDF) и нейронные ранжеры (cross‑encoder BERT) дают RRR.
- Свежесть: разница времени публикации Δt=now−publish_time\Delta t = \text{now} - \text{publish\_time}Δt=now−publish_time. пример: экспоненциальное затухание F=e−λΔtF = e^{-\lambda \Delta t}F=e−λΔt или полураспад F=2−Δt/T1/2F = 2^{-\Delta t / T_{1/2}}F=2−Δt/T1/2 .
- Персонализация: пользователь‑документная схожесть (коллаб.фильтрация / эмбединги): P=u⋅vP = u \cdot vP=u⋅v или вероятность клика от персональной модели.
- Контекст: устройство, гео, сессия, тип запроса (temporal vs evergreen).
2) Базовый скор и нормализация
- Нормализовать компоненты (z‑score или min‑max) по выборке.
- Простая композиция: взвешенная сумма
S(d,u,q)=αR+βF+γP S(d,u,q) = \alpha R + \beta F + \gamma P
S(d,u,q)=αR+βF+γP где α,β,γ\alpha,\beta,\gammaα,β,γ — гиперпараметры/обучаемые веса.
- Альтернативы: умножительный буст для свежести при temporal‑запросах:
S=R⋅(1+βF) S = R \cdot (1 + \beta F)
S=R⋅(1+βF) или пороговая логика: применять персонализацию только при достаточной доверительности (confidence).
3) Архитектура ранжирования (распространённая схема)
- Кандидатная выдача (recall): BM25 / ANN по эмбедингам — быстро получить топ N.
- Переранжирование (re‑rank): GBDT (LightGBM/RankLib LambdaMART) или нейронный listwise рэнкер (BERT‑cross encoder для top‑50).
- Онлайновый слой персонализации: небольшая модель на сессиях/CTR для final score / re‑ordering.
- Каскадность снижает латентность и даёт гибкость.
4) Модели и алгоритмы комбинирования
- Градиентный бустинг с loss, оптимизирующим ранжирование: LambdaMART (оптимизация NDCG).
- Нейронные listwise модели (ListNet, ListMLE) и BERT‑cross encoder для re‑rank.
- Для кликов/CTR: бинарная логистическая регрессия / DNN, calibrated probabilities.
- Для онлайна: contextual bandits / Thompson sampling для exploration/exploitation.
- Для долгосрочной персонализации: matrix factorization, ALS, neural collaborative filtering, user/document embeddings (Siamese / DSSM).
5) Тренировка и коррекция смещений
- Разметка: ручные релевантности + implicit feedback (clicks, dwell time). Для кликов применять IPS или click models (DBN, UBM) для коррекции позиционного искажения.
- Валидация по временному сплиту (train до T, test после T) чтобы учесть свежесть.
6) Метрики качества
Offline:
- Precision@k, Recall@k.
- MRR: MRR=1∣Q∣∑q1rankq\mathrm{MRR} = \frac{1}{|Q|}\sum_{q}\frac{1}{\mathrm{rank}_q}MRR=∣Q∣1 ∑q rankq 1 .
- DCG/NDCG@k:
DCGp=∑i=1p2reli−1log2(i+1),NDCGp=DCGpIDCGp DCG_p=\sum_{i=1}^p\frac{2^{rel_i}-1}{\log_2(i+1)},\qquad NDCG_p=\frac{DCG_p}{IDCG_p}
DCGp =i=1∑p log2 (i+1)2reli −1 ,NDCGp =IDCGp DCGp - MAP (mean average precision) для бинарных релевантностей.
- Time‑aware NDCG / freshness‑weighted NDCG: весить релевантность через функцию свежести.
Online (A/B):
- CTR@k, CTR по позициям, mean dwell time, engagement (session length), long‑term retention.
- Business KPI: conversions, subscriptions.
- Статтесты: bucket A/B, bootstrap/период теста > достаточная мощность.
7) Эвристики и практические правила
- Классифицировать запрос: если temporal => повышать β\betaβ для свежести; иначе уменьшать.
- Персонализацию применять с порогом уверенности (если пользователь cold‑start — ставить γ=0\gamma=0γ=0).
- Мониторить разнообразие и соответствие (diversity reranking, MMR) чтобы избежать однотипных результатов.
- Мониторить позиционный и сезонный дрейф, ретренировать модели регулярно.
- Накладывать бизнес‑constraints (например, минимальная свежесть для новостей).
8) Рекомендации по внедрению
- Начать с простого: BM25 + линейная смесь S=αR+βF+γPS=\alpha R+\beta F+\gamma PS=αR+βF+γP, подобрать веса на валидации и A/B.
- Перейти к LambdaMART с фичами R,F,P и optimize NDCG@k.
- Для top‑relevant используйте BERT re‑ranker; для онлайна — contextual bandit для персонализации.
9) Итоговая формула (пример)
S(d,u,q)=scale(Ranker(d,q))⋅(1+β⋅e−λΔt)+γ⋅(u⋅vd) S(d,u,q)=\text{scale}\Big(\text{Ranker}(d,q)\Big)\cdot\big(1+\beta\cdot e^{-\lambda\Delta t}\big)+\gamma\cdot (u\cdot v_d)
S(d,u,q)=scale(Ranker(d,q))⋅(1+β⋅e−λΔt)+γ⋅(u⋅vd ) где scale — нормализация ranker‑скара, Δt\Delta tΔt — возраст документа, u⋅vdu\cdot v_du⋅vd — персон.скора.
Это компактный план: фичи → нормализация → каскадная архитектура → обучение (LambdaMART / нейро) → offline/online метрики → A/B и bandit‑exploration.