Налаштування ML-рекомендацій товарів на 1С-Бітрікс
ML-рекомендації — це не "подібні товари з тієї ж категорії". Це модель, яка на основі паттернів поведінки тисяч користувачів передбачає, який товар конкретний користувач найбільш ймовірно додасть в кошик. Різниця в конверсії між "подібними по категорії" й реальними ML-рекомендаціями може бути в 2–4 рази. В Бітриксі немає вбудованого ML-двигуна, тому система будується з кількох шарів.
Архітектура: Бітрікс + зовнішній ML-сервіс
ML-модель не повинна жити в PHP-коді Бітрикса — навчання й інференс потребують ресурсів, несумісних з веб-запитом. Правильна архітектура:
- Бітрікс — збирає события поведінки (перегляди, покупки, клацання) й пише їх в чергу або базу даних
- ML-сервіс (Python/FastAPI або готове рішення) — навчає модель на накопичених даних, видає рекомендації по HTTP API
- Бітрікс — запитує рекомендації в ML-сервісу й відображає в шаблоні
Готові ML-сервіси, інтегровані з Бітриксом
Yandex.Персоналізація — входить в екосистему Yandex, потребує передачі подій в Метрику й Yandex.Рекламу. Складно налаштовувати без партнерського доступу.
Retail Rocket — спеціалізується на e-commerce рекомендаціях, є готовий віджет для Бітрикса. Передача подій через JavaScript-трекер.
Власний сервіс на Python — повний контроль, ніяких залежностей від сторонніх платформ. Алгоритм: матричная факторизація (ALS через бібліотеку implicit) або нейронні мережі (NCF). Дані з b_user_behavior експортуються в CSV, модель навчається офлайн раз на добу, результати записуються в Redis.
Передача подій в ML-сервіс
При кожному перегляді товара або покупці Бітрікс відправляє событие в чергу (Redis Pub/Sub, RabbitMQ або просто HTTP-запит до ML-сервісу):
// У шаблоні catalog.element
$mlEvent = [
'event' => 'view',
'user_id' => $GLOBALS['USER']->GetID() ?: ('anon_' . session_id()),
'item_id' => $arResult['ID'],
'timestamp' => time(),
'session_id' => session_id(),
];
// Асинхронна передача без очікування на відповідь
$ch = curl_init('http://ml-service:8000/event');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($mlEvent),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => 200, // Максимум 200ms — не блокуємо рендеринг
CURLOPT_NOSIGNAL => 1,
]);
curl_exec($ch);
curl_close($ch);
Отримання рекомендацій: кеш на Redis
ML-сервіс повертає список ID рекомендованих товарів для користувача. Прямий запит до ML-сервісу при кожній загрузці сторінки — неприйнятно. Кешувати на Redis з TTL 15 хвилин:
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'ml_recs_' . ($userId ?: 'anon_' . session_id());
$recommendedIds = $redis->get($cacheKey);
if ($recommendedIds === false) {
$response = file_get_contents(
'http://ml-service:8000/recommend?user_id=' . urlencode($userId) . '&limit=8'
);
$recommendedIds = json_decode($response, true)['items'] ?? [];
$redis->setex($cacheKey, 900, json_encode($recommendedIds));
} else {
$recommendedIds = json_decode($recommendedIds, true);
}
Холодний старт: що показувати новим користувачам
Для користувачів без історії (нові відвідувачі, перші 5 переглядів) ML-модель не працює. Fallback-стратегія: показувати "популярні товари" — список формується зі статистики замовлень за останні 30 днів, кешується на годину. Переключення між ML-рекомендаціями й популярними — за кількістю подій в профілі користувача.







