Диагностика Mock-интервью
Главная · Продакшн и качество

Рекомендательные системы

Как из миллионов кандидатов выбрать десять для конкретного пользователя: коллаборативная фильтрация и матричное разложение, two-tower и ANN, холодный старт, метрики и петли обратной связи.

Интуиция

Задача рекомендательной системы (recommender system) — предсказать, что понравится пользователю, и сделать это среди каталога в миллионы объектов за десятки миллисекунд. Классических источника сигнала два. Коллаборативная фильтрация (collaborative filtering) опирается на поведение: люди с похожими вкусами любят похожее. User-based вариант ищет похожих пользователей и берёт их любимое, item-based — похожие объекты («те, кто смотрел X, смотрели и Y»). Признаки контента ей не нужны вовсе — только история взаимодействий. Контентный подход (content-based) — наоборот: рекомендует по признакам самого объекта (жанр, текст описания, эмбеддинг обложки), поэтому работает даже для объектов, которые ещё никто не видел.

Матричное разложение

Представь таблицу «пользователи × фильмы» с оценками — заполненную на пару процентов. Матричное разложение (matrix factorization) приближает её произведением двух узких матриц:

R ≈ U · VT,   rij ≈ ui · vj

У каждого пользователя и каждого фильма появляется латентный вектор из k чисел, а предсказание — их скалярное произведение. Оси этого пространства никто не размечал: обучение (SGD по известным клеткам или ALS — попеременный пересчёт U и V) само находит скрытые «жанры», вдоль которых вкусы различаются. Подход прославился на конкурсе Netflix Prize и по сути даёт эмбеддинги пользователей и объектов в общем пространстве — ту же геометрию смысла, что и в семантическом поиске.

В проде явных оценок почти не бывает — есть неявный фидбек (implicit feedback): клики, просмотры, дочитывания, покупки. Важная тонкость: отсутствие клика не значит «не нравится» — пользователь мог просто не увидеть объект, поэтому пропуски трактуют осторожно, со взвешиванием уверенности.

💡 Ключевая мысль Рекомендации — это поиск ближайших соседей в выученном пространстве: пользователь играет роль «запроса», объекты — «документов». Поэтому инфраструктура RAG — эмбеддинги и ANN-индексы — работает и здесь.

Известные оценки обведены рамкой, предсказания — бледные. Смотри, как RMSE на скрытом holdout падает, хотя модель этих клеток не видела: латентная структура «двух жанров» восстанавливается из 40% наблюдений. Включи «+ новый (cold start)» — у новичка нет ни одной оценки, его вектор так и стоит у нуля, и все предсказания около среднего.

Прод-пайплайн: retrieval → ranking

Прогнать тяжёлую модель по миллионам кандидатов на каждый запрос невозможно, поэтому современный пайплайн двухэтапный — как в поиске. Retrieval: two-tower модель — «башня» пользователя и «башня» объекта кодируют каждого в эмбеддинг; векторы объектов не зависят от пользователя, поэтому их предвычисляют и складывают в ANN-индекс. На запрос считается только вектор пользователя, и ANN за миллисекунды отбирает сотни кандидатов. Обучение башен — контрастивное, по сути то же, что у эмбеддинг-моделей. Ranking: тяжёлая модель (бустинг или нейросеть) с сотнями признаков — контекст, время суток, свежесть, история — точно упорядочивает эти сотни. Поверх — переранжирование бизнес-правилами: разнообразие (привет MMR), свежесть, «не показывать уже купленное».

Холодный старт, метрики и ловушки

Холодный старт (cold start): у нового объекта нет взаимодействий — спасают контентные признаки (жанр, описание, эмбеддинг текста) и разведочные показы; у нового пользователя нет истории — показывают популярное, спрашивают интересы при онбординге, быстро дообучаются на первых кликах. Разведку формализуют многорукие бандиты (multi-armed bandits): часть трафика тратится на исследование, а не эксплуатацию.

Метрики двухслойные: оффлайн — recall@k и nDCG на отложенных по времени взаимодействиях (nDCG учитывает не только попадание, но и позицию: полезное наверху ценнее), онлайн — CTR, время в продукте, удержание. Они регулярно расходятся: логи собраны старой системой, клики смещены к верхним позициям, поэтому оффлайн-выигрыш не гарантирует онлайн-эффекта, и финальный судья — A/B-тест. Ловушки: popularity bias (популярное побеждает всегда и везде), фильтр-пузырь (пользователь замыкается в узком круге тем) и петля обратной связи.

⚠️ Подводный камень Feedback loop: модель учится на кликах по собственным рекомендациям. Что порекомендовали — то и кликают, оно становится «ещё популярнее», и лог всё меньше отражает истинные вкусы. Без явной разведки (exploration) и поправок на позицию/популярность система застревает в самоподтверждении.
🎤 На собеседовании
  • «Спроектируй ленту рекомендаций» — классика ML system design: двухэтапка retrieval → ranking, оффлайн/онлайн-метрики, план на холодный старт и фолбэк на популярное при отказе модели.
  • «Что такое two-tower и причём тут ANN?» — раздельные энкодеры пользователя и объекта; векторы объектов предвычислены и лежат в ANN-индексе — retrieval за миллисекунды.
  • «Как бороться с холодным стартом?» — контентные признаки для новых объектов, популярное и онбординг для новых пользователей, бандиты для разведки.
  • «Оффлайн nDCG вырос — раскатываем?» — нет: оффлайн-метрика лишь гипотеза, решение принимает A/B-тест на онлайн-метриках.