← Назад к вопросам

Как выбрать объявление из пула продвигаемых постов?

1.6 Junior🔥 201 комментариев
#A/B тестирование#Soft skills и коммуникация#Исследования пользователей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Алгоритм выбора объявления из пула продвигаемых постов

Это вопрос про рекомендательные системы и оптимизацию. Здесь важна балансировка между revenue, user experience и данными.

Контекст (уточню у интервьюера)

Предположу, что это социальная платформа (TikTok, Instagram, YouTube) с рекламой в feed'е.

Вопросы для уточнения:

  • Есть ли уже пулы объявлений? (контекстные, ретаргетинг, новые?)
  • Как рассчитывается стоимость постов? (CPC, CPM, CPA?)
  • Какой основной KPI? (CTR, revenue, user retention?)
  • Какова tolerate роль ad fraud'а на платформе?

Буду считать: платформа вроде TikTok/Instagram с миксом органических и спонсорских постов. Нужно балансировать между доходом и UX.

Подход 1: Multi-Armed Bandit (Exploration vs Exploitation)

Это классический подход для выбора из пула вариантов:

Thompson Sampling

1. Для каждого объявления: вероятность что оно "лучшее" (на основе CTR)
2. Случайная выборка из распределения
3. Показать выбранное объявление
4. Обновить posterior вероятность
5. Повторить

Плюсы:

  • Автоматически исследует новые объявления
  • Быстро сходится к оптимальным
  • Минимизирует сожаление (regret)

Минусы:

  • Может показать плохие объявления в начале
  • Не учитывает контекст пользователя

Подход 2: Contextual Bandits (С учётом контекста)

Лучший вариант для социальных платформ:

Фичи контекста:

  • Демография пользователя (возраст, регион, интересы)
  • История взаимодействия (какие посты лайкал, игнорировал)
  • Время дня, тип девайса, язык
  • Семантика объявления (категория, ключевые слова)

Алгоритм выбора:

1. Отфильтровать пул объявлений:
   - Только релевантные для пользователя
   - Исключить показанные недавно (частота cap)
   - Исключить заблокированные категории

2. Оценить score каждого объявления:
   score = α × CTR + β × (bid × conversion_rate) + γ × freshness
   
   где:
   - CTR (click-through rate): историческая вероятность клика
   - bid × conversion: потенциальный revenue
   - freshness: как давно показывали (новые выше)

3. Добавить exploration:
   - 80% показывать top объявления (exploitation)
   - 20% случайное из top-10 (exploration)

4. А/Б тестирование новых креативов:
   - 5% трафика на тестирование
   - Если CTR > baseline + 10% → в основной пул

Подход 3: Learning-to-Rank (LTR)

Для больших пулов объявлений (100+ позиций):

Метод:

  1. Ранжировать объявления ML моделью
  2. Модель обучена на исторических данных
  3. Features: пользователь + объявление + контекст
  4. Target: CTR, конверсия, revenue

Модель (XGBoost, LightGBM):

Features:
- user_interests_similarity (косинус между векторами)
- ad_bid, ad_budget_remaining
- user_segment, seasonality
- ad_creative_freshness
- previous_interactions

Target: click_probability или revenue_expected

Вывод:

  • Ранжировать top-3 объявлений
  • Выбрать первое (или Random в top-3 для exploration)

Подход 4: Quality Score & Balance

Google Ads классика, применимо везде:

Quality Score = (Historical CTR + Landing Page Quality + Ad Relevance) / 3

Final Score = Quality Score × Bid

Применить:

  1. Исключить объявления с Quality Score < 3/10
  2. Приоритизировать высокое качество + хороший bid
  3. Штрафовать за часто пропускаемые (если много skip → lower score)

Подход 5: Real-time Optimization

Для максимизации revenue:

Expected Revenue Per Impression = P(click) × Value Per Click

Value Per Click = 
  - CPC (cost per click) - для pay-per-click
  - CPM / 1000 × CTR - для pay-per-impression
  - P(convert) × value_per_conversion - для CPA

Выбрать объявление с max Expected Revenue (с exploration):

scores = []
for ad in available_ads:
    expected_revenue = predict_ctr(user, ad) × ad.value
    exploration_bonus = random() < 0.1 ? 1.5 : 1.0
    scores.append(expected_revenue × exploration_bonus)

selected_ad = ads[argmax(scores)]

Подход 6: Diversity & Fatigue

Предотвращение spam'а и усталости:

Frequency Cap:
- Max 3 объявления одной компании в день
- Max 5 объявлений одной категории в неделю

Diversity Score:
- Повышать score объявлений из новых категорий
- Понижать score похожих креативов

Wear-Out Tracking:
- Если пользователь часто skip объявление → lower score
- Если CTR падает со временем (объявление устарело) → ротировать

Рекомендуемый гибридный подход

Комбинирую лучшее:

1. Фильтрация:
   - Релевантность по интересам пользователя
   - Frequency cap (не показывали 2+ часа)
   - Quality score >= 5

2. Ранжирование:
   score = 0.5 × P(click) + 0.3 × Expected Revenue + 0.2 × Freshness

3. Выбор:
   - Top 1 с вероятностью 0.8
   - Random из top-3 с вероятностью 0.2 (exploration)
   - Добавить noise (±10%) для естественности

4. Мониторинг:
   - CTR, CVR, revenue по объявлениям
   - User fatigue (skip rate)
   - A/B test новых объявлений в 5% трафика

Метрики для оптимизации

  • Click-Through Rate (CTR): базовая метрика качества
  • Expected Value per Impression: revenue максимизация
  • Ad Relevance Score: пользовательский опыт
  • Fatigue Index: количество skip'ов (меньше лучше)
  • Revenue per User: финансовый результат
  • Conversion Rate: на действие (покупку, install)

Потенциальные проблемы

  1. Bias в обучении: исторические данные могут быть skewed

    • Решение: offline evaluation (counterfactual)
  2. Fraud: click fraud от ботов

    • Решение: click verification, device fingerprinting
  3. Feedback loop: плохие объявления не показываются → нет данных для улучшения

    • Решение: exploration budget (20% на новые объявления)

Заключение

Лучший практический подход: Contextual Bandits + LTR модель

  • Балансирует user experience и revenue
  • Адаптируется к новым объявлениям (exploration)
  • Масштабируется на миллионы пользователей
  • Использует контекст для улучшения релевантности