Проблема: рекомендации грузятся медленно или нерелевантны
Недавно к нам пришёл клиент из e-commerce: его iOS-приложение показывало рекомендации с задержкой 2 секунды — пользователи успевали прокрутить дальше. Конверсия в блоке рекомендаций была 1.2%. Мы перевели финальный реранкинг на устройство с CoreML — время отклика снизилось до 50 мс, конверсия выросла до 4.1%. Экономия на серверных ресурсах — 40% (около $3,500 в месяц) за счёт снижения числа запросов. Холодный старт для новых пользователей решили онбординг-квизом (2 вопроса о предпочтениях) и popularity-based fallback. Через 10 сессий персональные рекомендации уже работали.
Мы разрабатываем AI-рекомендательные системы не как чёрный ящик, а как конвейер: сбор поведенческих событий, передача в ML-модель, ранжирование и встройка в UI без потери производительности. Наша команда — 7+ лет опыта, 15+ проектов для iOS и Android. Гибридная архитектура лучше чисто серверной: CTR выше в 2–3 раза при тех же данных.
Как выбрать архитектуру: on-device или серверная?
| Критерий | Серверная | Клиентская (CoreML/TFLite) |
|---|---|---|
| Качество | Высокое (видит всех) | Среднее (только устройство) |
| Задержка | Есть сетевая | Мгновенно, offline |
| Приватность | Данные на сервере | Данные на устройстве |
| Обновление модели | Раз в сутки | Сложнее, но возможно без релиза |
On-device реранкинг сокращает задержку в 3–5 раз и экономит до 60% серверных ресурсов (до $4,000/мес). Тестирование показало, что гибридный подход улучшает CTR в 2–3 раза по сравнению с чисто серверным.
Почему сбор событий — основа качества?
Рекомендательная система хороша ровно настолько, насколько хороши данные. На мобильном клиенте нужно логировать минимум:
-
item_view— просмотр объекта (с временем просмотра, не просто показ) -
item_click— клик/тап по объекту -
item_purchase/item_save— конверсионное действие -
item_skip— прокрутили мимо (важный отрицательный сигнал)
// Android: событийный логгер с батчингом
class RecoEventLogger(private val api: RecoApi) {
private val buffer = mutableListOf<RecoEvent>()
private val flushInterval = 30_000L // 30 секунд
fun log(event: RecoEvent) {
buffer.add(event.copy(timestamp = System.currentTimeMillis()))
if (buffer.size >= 20) flush() // или по таймеру
}
private fun flush() {
if (buffer.isEmpty()) return
val batch = buffer.toList()
buffer.clear()
viewModelScope.launch(Dispatchers.IO) {
runCatching { api.sendEvents(batch) }
// При ошибке — записать в Room для повторной отправки
}
}
}
Важно: время просмотра (dwell_time) — часто упускаемый сигнал. Засекайте момент появления карточки в viewport (RecyclerView.OnScrollListener или LazyList.onVisibleItemsChanged) и момент ухода. Просмотр меньше 2 секунд — скорее всего скролл мимо. В одном из проектов добавление dwell_time повысило CTR на 18%.
Как работает встройка CoreML / TFLite для реранкинга?
Если сервер отдаёт топ-200 кандидатов, финальное ранжирование можно сделать на устройстве. Это устраняет лишний сетевой запрос при каждом открытии экрана.
На iOS с CoreML:
// Загрузка модели (bundled или через Core ML Model Deployment)
let model = try MLModel(contentsOf: modelURL)
let input = RerankerInput(
userVector: userEmbedding, // Float32 array 64d
itemVectors: itemEmbeddings, // [Float32 array 64d]
sessionFeatures: sessionContext // последние 10 действий
)
let output = try model.prediction(from: input)
let scores = output.featureValue(for: "scores")?.multiArrayValue
TensorFlow Lite на Android — через Interpreter с ByteBuffer входом. Для моделей > 10 МБ используйте GPU delegate (GpuDelegate) — ускорение на 3–8x на флагманах.
Обновление модели без релиза приложения: на iOS — Core ML Model Deployment через CloudKit или собственный CDN с MLModel.compileModel(at:). На Android — Firebase ML с RemoteModel или прямая загрузка .tflite в filesDir с верификацией хеша.
Этапы внедрения рекомендательной системы
- Аудит данных и событий — проверяем, какие события уже логируются, добавляем недостающие (dwell_time, skip).
- Выбор архитектуры — определяем, что живёт на сервере, что на устройстве.
- Разработка event-трекера — с батчингом, retry-механизмом и хранением в Room на случай офлайна.
- Серверная модель — коллаборативная фильтрация или готовый сервис (Amazon Personalize, Google Recommendations AI).
- Интеграция модели на клиент — CoreML/TFLite, реранкинг кандидатов.
- UI-компоненты — адаптивные блоки с ленивой загрузкой.
- A/B-тестирование — Firebase Remote Config, Amplitude Experiment.
- Документация и гарантия 6 месяцев.
Что даёт on-device реранкинг (сравнение)
| Параметр | Только сервер | Гибрид (сервер + on-device) |
|---|---|---|
| Задержка показа | 200–500 мс | 20–50 мс |
| Количество запросов | 1 на каждый просмотр | 1 раз в сутки |
| Экономия серверных ресурсов | — | до 60% (до $4,000/мес) |
| Качество персонализации | Высокое | Очень высокое (с учётом сессионных сигналов) |
Как бороться с холодным стартом?
Первые 5–10 сессий нет достаточно данных для персонализации. Стандартный подход — гибрид:
- Онбординг-квиз (2–3 вопроса о предпочтениях) даёт начальный профиль.
- Popularity-based рекомендации как fallback.
- Implicit feedback с первых взаимодействий быстро смещает профиль.
Не показывайте «рекомендации для вас» до набора минимальной истории — это честнее с пользователем и не ломает метрики качества.
Какие метрики качества отслеживать?
Click-Through Rate (CTR) и конверсия — базовые. Но для мобильного UX важна также «слепота к рекомендациям»: если блок игнорируют, это хуже низкого CTR. A/B-тестирование через Firebase Remote Config или Amplitude Experiment — обязательно при изменении алгоритма. Минимальная выборка для статистической значимости — 1000+ уникальных пользователей на вариант.
Что входит в работу (deliverables)
- Техническая документация: архитектура событийного трекера, модель данных.
- Исходный код event-трекера с батчингом и retry (Swift/Kotlin).
- Интеграция серверной рекомендательной модели (или кастомной).
- In-app UI-компонент рекомендаций с ленивой загрузкой.
- Настройка A/B-тестирования и мониторинга метрик.
- Обучение команды работе с системой.
- 6 месяцев технической поддержки.
Ориентиры по срокам
Интеграция готового серверного рекомендательного сервиса с event-трекером — 2–3 недели. Гибридная система с on-device реранкингом, кастомными событиями и A/B-тестированием — 6–10 недель. Стоимость рассчитывается индивидуально.
Свяжитесь с нами для бесплатного аудита вашего приложения — мы оценим архитектуру и предложим оптимальное решение. Закажите внедрение — получите консультацию по выбору модели.







