Зауважимо: коли чиста колаборативна фільтрація ламається на холодному старті — нові користувачі без історії не отримують релевантних рекомендацій, а розріджена матриця взаємодій дає шумні передбачення. Content-Based, навпаки, заганяє користувача в бульбашку: він бачить лише те, що вже дивився, і не відкриває нові категорії. Гібридний підхід об'єднує сильні сторони обох методів. Ми впровадили такі системи для понад 15 проектів в e-commerce та медіа; наш досвід — 5+ років у машинному навчанні на мобільних платформах. Нижче — перевірені стратегії та код для iOS та Android.
Як комбінувати алгоритми в гібридній системі?
Weighted Hybrid — зважена сума скорів
Найпростіший варіант: фінальний скор = α × CF_score + (1−α) × CB_score. Параметр α можна робити динамічним — для нового користувача α = 0.2 (CF слабкий, довіряємо CB), для досвідченого α = 0.7.
class WeightedHybridRecommender: def __init__(self, cf: CFRecommender, cb: CBRecommender): self.cf = cf self.cb = cb def recommend(self, user: User, candidates: list[str], n: int = 20) -> list[str]: alpha = self._compute_alpha(user.interaction_count) cf_scores = self.cf.score(user.id, candidates) # dict[item_id -> float] cb_scores = self.cb.score(user.profile, candidates) hybrid_scores = { item_id: alpha * cf_scores.get(item_id, 0) + (1 - alpha) * cb_scores.get(item_id, 0) for item_id in candidates } return sorted(hybrid_scores, key=hybrid_scores.get, reverse=True)[:n] def _compute_alpha(self, interaction_count: int) -> float: return min(0.2 + (interaction_count / 100) * 0.6, 0.8) Switching Hybrid — вибір стратегії за контекстом
Замість змішування скорів — перемикання між рекомендерами повністю. Логіка перемикання може бути складною: CF для залогінених користувачів з історією, CB для гостей, popularity-based для нових користувачів без onboarding.
// Android: стратегія за контекстом користувача sealed class RecommendationContext { object Guest : RecommendationContext() data class NewUser(val preferences: List<String>) : RecommendationContext() data class ActiveUser(val userId: String, val interactionCount: Int) : RecommendationContext() } class HybridRecommenderRepository( private val cfApi: CFRecommendationApi, private val cbApi: CBRecommendationApi, private val popularApi: PopularityApi ) { suspend fun getRecommendations(context: RecommendationContext): List<Product> { return when (context) { is RecommendationContext.Guest -> popularApi.getTopProducts(count = 20) is RecommendationContext.NewUser -> cbApi.getByPreferences(context.preferences, count = 20) is RecommendationContext.ActiveUser -> { if (context.interactionCount < 15) { mergeRecommendations( cfApi.getPersonalized(context.userId, count = 6), cbApi.getSimilarToHistory(context.userId, count = 14) ) } else { cfApi.getPersonalized(context.userId, count = 20) } } } } } Feature-level Hybrid через нейромережу (Two-Tower)
Просунутий варіант: CF-ембедінги користувача та товару конкатенуються з CB-ознаками і подаються в shallow нейромережу (2–3 dense шари). Модель навчається end-to-end передбачати ймовірність кліку. Цю архітектуру використовують великі платформи.
# Two-Tower модель (спрощено) class TwoTowerModel(nn.Module): def __init__(self, user_emb_dim=64, item_emb_dim=64, cb_features_dim=50): super().__init__() self.user_tower = nn.Sequential( nn.Linear(user_emb_dim, 128), nn.ReLU(), nn.Linear(128, 64) ) self.item_tower = nn.Sequential( nn.Linear(item_emb_dim + cb_features_dim, 128), nn.ReLU(), nn.Linear(128, 64) ) def forward(self, user_emb, item_emb, cb_features): user_out = self.user_tower(user_emb) item_input = torch.cat([item_emb, cb_features], dim=-1) item_out = self.item_tower(item_input) return torch.sigmoid((user_out * item_out).sum(dim=-1)) На мобільному клієнті Two-Tower serving працює через передобчислення item-ембедінгів + FAISS ANN.
Чому гібрид кращий за чистий CF або CB?
Чистий CF втрачає якість при розрідженості даних — нові користувачі та товари не отримують адекватних рекомендацій. Чистий CB зациклюється на минулих вподобаннях, не бачить несподіваних перетинів. Гібрид об'єднує сильні сторони: соціальні сигнали (CF) та семантичну близькість (CB). У нашому A/B тесті гібридна система показала CTR на 30% вищий, ніж найкращий одиночний метод на вибірці з 10 000 користувачів. Зниження відтоку користувачів — до 15%.
| Стратегія | Коли використовувати | Переваги | Недоліки |
|---|---|---|---|
| Weighted Hybrid | Є готові CF та CB, дані збалансовані | Простота, легкість налаштування | Чутливість до ваги α |
| Switching Hybrid | Різні типи користувачів (гості, новачки, активні) | Гнучкість, швидка адаптація | Складність логіки перемикання |
| Feature-level Hybrid | Великий обсяг даних, висока точність | Найкраща якість, end-to-end навчання | Потребує даних, ресурсів, часу |
Як обрати стратегію гібрида для вашого застосунку?
Вибір залежить від обсягу даних, кількості користувачів та бізнес-вимог. Для стартапів з базою до 10 000 користувачів підходить Weighted Hybrid — його легко прототипувати. Для застосунків з різними сегментами (гості, новачки, активні) краще Switching Hybrid. Якщо у вас сотні тисяч користувачів та мільйони взаємодій, Two-Tower модель окупить витрати на розробку за рахунок зростання конверсії.
Як кешування впливає на продуктивність рекомендацій?
Кешування на клієнті критично важливе: воно знижує навантаження на сервер і прискорює відображення рекомендацій. Ми використовуємо TTL 5 хвилин з фоновим оновленням через BGAppRefreshTask (iOS) та WorkManager (Android). Це гарантує, що користувач бачить свіжі рекомендації при відкритті застосунку без затримки.
// iOS: кеш рекомендацій з TTL та фоновим оновленням class RecommendationCache { private let cache = NSCache<NSString, CachedRecommendations>() private let ttl: TimeInterval = 300 // 5 хвилин func get(userId: String) -> [Product]? { guard let cached = cache.object(forKey: userId as NSString), Date().timeIntervalSince(cached.timestamp) < ttl else { return nil } return cached.products } func set(userId: String, products: [Product]) { cache.setObject( CachedRecommendations(products: products, timestamp: Date()), forKey: userId as NSString ) } } | Метрика | Покращення при гібриді |
|---|---|
| CTR | +20–40% |
| Час у застосунку | +15–25% |
| Конверсія | +10–20% |
| Відтік користувачів | -10–15% |
Що входить в роботу
- Аудит даних: доступність CF-сигналів, якість CB-метаданих, обсяг користувацької бази.
- Вибір стратегії комбінування виходячи зі складності задачі та ресурсів.
- Розробка serving-шару з кешуванням на клієнті (iOS/Android).
- A/B тест: гібрид vs найкращий одиночний рекомендер → CTR, час у застосунку, конверсія.
- Документація з інтеграції та підтримка після впровадження.
- Навчання команди роботі з системою.
Орієнтири за термінами
| Стратегія | Терміни |
|---|---|
| Weighted Hybrid (готові компоненти) | 1–2 тижні |
| Switching Hybrid | 2–3 тижні |
| Two-Tower модель з нуля | 4–6 тижнів |
Вартість розраховується індивідуально. Ми гарантуємо супровід після впровадження та прозору звітність на кожному етапі. Отримайте консультацію — ми проаналізуємо ваші дані та запропонуємо оптимальне рішення за 2–3 робочі дні. Зв'яжіться з нами для оцінки вашого проекту.







