Вопрос проверяет, умеете ли вы мыслить как инженер рекомендаций: собрать данные о поведении, построить пайплайн кандидатов и ранжирования, обеспечить быстрый online-ответ и управлять качеством.
Обычно система рекомендаций делится на этапы: сбор событий, построение профиля пользователя, генерация кандидатов и ранжирование. Тяжёлая аналитика и обучение/подбор параметров выполняются оффлайн, а в онлайне сервис быстро берёт готовых кандидатов и сортирует их по простым признакам. Важно продумать хранение событий и агрегаций (часто аналитическое хранилище), а также кеш и предрасчёт, чтобы уложиться в latency. Ещё нужны правила “холодного старта”, фильтры (блок-листы, категории) и измерение качества через A/B тесты.
Система рекомендаций — это не один алгоритм, а конвейер, где большая часть работы делается заранее.
Сначала определяем, какие события собираем:
просмотр, клик, лайк, покупка, добавление в избранное
время просмотра/досмотра, скролл, скрытие контента
контекст: устройство, регион, время, источник
Практика:
события пишутся асинхронно (не тормозим пользовательский запрос)
события должны иметь стабильную схему и версию
Определение: Feature (признак) — числовое/категориальное представление поведения или свойств пользователя/контента, которое помогает ранжировать.
Примеры признаков:
топ категорий пользователя за 7/30 дней
свежесть интереса (что было недавно)
негативные сигналы (скрытия/дизлайки)
популярность контента в регионе
Цель — быстро собрать “небольшой список” того, что потенциально можно показать.
Типовые источники кандидатов:
популярное (global/regional)
похожее на просмотренное (item-to-item)
по подпискам/соц-графу (если есть)
тематические подборки/редакционные правила
Кандидаты часто предрасчитываются и хранятся как списки id.
Дальше кандидаты сортируются:
простая формула/модель (на старте)
позже — ML-модель (если есть ресурсы и данные)
Поверх ранжирования почти всегда накладываются правила:
разнообразие (diversity), чтобы не показывать одно и то же
фильтры: блок-листы, возрастные ограничения, категории
ограничения повторов (frequency capping)
Чтобы отвечать быстро:
хранить готовые списки кандидатов (например, по сегментам/пользователям)
хранить профиль пользователя в быстром доступе (кеш/быстрое KV)
обновлять агрегации асинхронно
ClickHouse обычно используется для:
хранения событий и быстрых агрегаций по большим объёмам
построения витрин/срезов для предрасчёта кандидатов и признаков
Если о пользователе мало данных:
популярное в регионе
подборки по контексту (время суток, устройство)
лёгкая онбординг-анкета (категории интересов)
Если часть системы недоступна:
fallback на популярное/редакционное
stale-данные (последний успешный список)
Без метрик рекомендации “на глаз” не строят.
онлайн метрики: CTR, конверсия, время просмотра
guardrail метрики: жалобы, скрытия, отписки
A/B тесты для сравнения стратегий
Рекомендации проектируются как пайплайн: события → профиль/признаки → кандидаты → ранжирование + правила, где тяжёлое считается оффлайн, а онлайн быстро собирает ответ из предрасчитанных данных. Так проще уложиться в latency и управлять качеством через метрики и эксперименты.