Ранжирование ленты новостей -- определение задачи¶
~5 минут чтения
Предварительно: Подготовка к интервью по системному дизайну
Каждый день Facebook ранжирует порядка 500 миллионов постов для 2 миллиардов пользователей, выбирая ~50 из 10 000+ кандидатов за менее чем 200 мс. Алгоритм ленты напрямую влияет на время сессии (в среднем 33 минуты в день) и рекламную выручку ($130+ млрд/год у Meta). Некорректное ранжирование приводит к потере DAU на 1--3% за неделю, что на масштабе Facebook означает 20--60 миллионов пользователей. Это одна из самых высоконагруженных ML-систем в индустрии -- 500K QPS с жёстким p99 < 100 мс.
Бизнес-контекст¶
News Feed Ranking -- ML-система для персонализированного ранжирования контента в ленте социальных сетей. Определяет, какие посты показать пользователю и в каком порядке.
Примеры применения¶
| Компания | Тип контента | DAU | Posts/day |
|---|---|---|---|
| Posts, photos, videos | 2B | 500M+ | |
| Photos, Reels, Stories | 1.5B | 200M+ | |
| Twitter/X | Tweets, threads | 250M | 500M+ |
| Posts, articles, jobs | 300M | 50M+ | |
| TikTok | Short videos | 1B | 100M+ |
Цели системы¶
Engagement Optimization¶
Maximize: Σ P(engage) × Value(engage)
где engage = {like, comment, share, save, watch_time}
Multi-objective:
- Short-term: Clicks, likes
- Long-term: Return visits, session time
- Quality: Reduce misinformation, clickbait
Balancing Stakeholders¶
| Stakeholder | Wants | Metric |
|---|---|---|
| Users | Relevant content | Engagement, satisfaction |
| Creators | Reach, engagement | Impressions, followers |
| Advertisers | ROI on ads | CTR, conversion |
| Platform | Growth, revenue | DAU, time spent, ad revenue |
Постановка задачи¶
Функциональные требования¶
- Personalization: Лента уникальна для каждого user
- Real-time Updates: Новый контент появляется быстро
- Multi-format: Posts, photos, videos, stories, ads
- Diversity: Не показывать только один тип контента
- Recency: Баланс свежести и релевантности
Нефункциональные требования¶
| Метрика | Требование | Обоснование |
|---|---|---|
| Latency (p99) | < 100ms | Быстрая загрузка ленты |
| Throughput | 500K QPS | 2B users × refresh |
| Freshness | < 1 min | Новый контент быстро |
| Availability | 99.99% | Core experience |
Ranking Signals¶
Engagement Signals¶
- Like probability
- Comment probability
- Share probability
- Save probability
- Watch time (video)
- Click-through rate
Quality Signals¶
- Content quality score
- Creator reputation
- Originality
- Misinformation score (negative)
- Clickbait score (negative)
Relevance Signals¶
- Topic match to user interests
- Social connection strength
- Content freshness
- User-content history
Diversity Signals¶
- Content type variety
- Creator diversity
- Topic diversity
- Time diversity
Challenges¶
1. Massive Candidate Pool¶
graph LR
A["500+ друзей"] --> E["10K+ кандидатов"]
B["100+ страниц"] --> E
C["1000+ групп"] --> E
D["Рекомендации"] --> E
E --> F["~50 постов<br/>в ленте"]
style E fill:#fff3e0,stroke:#ef6c00
style F fill:#e8f5e9,stroke:#4caf50
2. Multi-Objective Optimization¶
Оптимизация нескольких целей одновременно: engagement (клики, лайки), quality (борьба с дезинформацией), diversity (разнообразие контента), freshness (свежесть), creator fairness. Эти цели часто конфликтуют.
3. Position Bias¶
Пользователи скроллят сверху: позиция 1 получает ~50% engagement rate, позиция 10 -- всего ~5%. Тренировочные данные смещены в сторону верхних позиций.
4. Filter Bubbles¶
Показываем то, что user лайкал раньше -- пользователь видит только похожий контент -- эхо-камеры, поляризация. Нужны exploration и diversity.
5. Viral Content / Trends¶
Контент может стать вирусным за минуты. Модель должна адаптироваться быстро -- обновление сигналов в реальном времени.
Метрики успеха¶
Engagement Metrics¶
| Метрика | Описание |
|---|---|
| Daily Active Users | Users who engage daily |
| Time Spent | Minutes per session |
| Sessions per Day | Return visits |
| Engagement Rate | Actions per impression |
Quality Metrics¶
| Метрика | Описание |
|---|---|
| Content Satisfaction | Survey-based |
| Hide Rate | Users hiding content |
| Report Rate | Content reports |
| Misinformation Rate | Flagged content |
Creator Metrics¶
| Метрика | Описание |
|---|---|
| Reach Distribution | Fairness of reach |
| New Creator Success | Growth of new creators |
| Creator Retention | Creators staying active |
Trade-offs¶
| Аспект | Вариант A | Вариант B |
|---|---|---|
| Engagement vs Quality | Clickbait gets clicks | Quality content |
| Recency vs Relevance | Fresh but random | Old but relevant |
| Personalization vs Diversity | More of the same | New topics |
| Creator vs User | Show all creator content | Show best only |
| Global vs Local trends | Same for all | Personalized trends |
Ключевые вопросы для интервью¶
- Какой тип платформы? (social, news, professional)
- Какой контент? (text, photos, videos)
- Масштаб? (users, posts per day)
- Latency requirements?
- Multi-objective? (engagement + quality)
- Ads integration?
- Creator fairness requirements?
- Content policy enforcement?
Типичные заблуждения¶
Заблуждение: главная метрика -- engagement rate
Оптимизация только engagement без quality constraints привела к тому, что Facebook в 2018 году обнаружил: контент с дезинформацией получал на 70% больше взаимодействий. Необходим multi-objective подход: engagement + quality + safety. На практике hide/report сигналы получают веса -50x и -100x относительно лайка.
Заблуждение: свежий контент всегда лучше
Чисто хронологическая лента (reverse-chronological) снижает engagement на 20--40% по сравнению с ранжированной. Однако в 2022 Instagram показал, что пользователи хотят опцию хронологической ленты -- баланс recency и relevance зависит от платформы. Правильный подход: freshness как один из сигналов с настраиваемым весом, не как жёсткий фильтр.
Заблуждение: достаточно одного score для ранжирования
Один скалярный score теряет информацию о природе engagement. Пост с P(like)=0.8 и P(hide)=0.3 не то же самое, что пост с P(like)=0.5 и P(hide)=0.01. Multi-task модели с раздельными tower-ами дают на 5--15% лучший engagement quality, чем single-objective подход.
Интервью¶
Как бы вы определили основную метрику успеха для ленты новостей?
"Максимизируем CTR -- клики на посты"
"Нужна композитная метрика. Краткосрочно: weighted sum из P(like), P(comment), P(share) с разными весами (share ценнее лайка в 10x). Долгосрочно: return visits и session time за неделю. Плюс hard constraints на quality -- hide rate < 5%, report rate < 0.1%. В A/B тестах смотрим на все метрики одновременно, потому что рост CTR за счёт clickbait убивает долгосрочный retention."
Как вы решите проблему cold start для нового пользователя?
"Покажем самый популярный контент"
"5-уровневый подход: (1) демографические признаки для initial ranking, (2) популярный контент в регионе, (3) onboarding -- выбор интересов при регистрации, (4) rapid learning из первых 10--20 взаимодействий с exploration budget 20--30% ленты, (5) импорт социального графа из контактов. Переход от cold-start к персонализированной модели за 2--3 сессии."
Какие trade-offs между engagement и diversity?
"Показываем только то, что пользователь любит -- это максимизирует engagement"
"Чистый engagement-only ранжирование создаёт filter bubbles и снижает discovery. На практике используется MMR re-ranking с penalty за similarity к уже показанному контенту, slot-based diversity (каждый 4-5 пост -- из нового topic/creator), и exploration budget 5% ленты для новых авторов. Краткосрочно diversity снижает CTR на 2--3%, но увеличивает недельный retention на 5--8%."