Настройка ML-рекомендаций товаров на 1С-Битрикс
ML-рекомендации — это не «похожие товары из той же категории». Это модель, которая на основе паттернов поведения тысяч пользователей предсказывает, какой товар конкретный пользователь с наибольшей вероятностью добавит в корзину. Разница в конверсии между «похожими по категории» и реальными ML-рекомендациями может быть в 2–4 раза. В Битриксе нет встроенного ML-движка, поэтому система строится из нескольких слоёв.
Архитектура: Битрикс + внешний ML-сервис
ML-модель не должна жить в PHP-коде Битрикса — обучение и инференс требуют ресурсов, несовместимых с веб-запросом. Правильная архитектура:
- Битрикс — собирает события поведения (просмотры, покупки, клики) и пишет их в очередь или базу данных
- ML-сервис (Python/FastAPI или готовое решение) — обучает модель на накопленных данных, отдаёт рекомендации по HTTP API
- Битрикс — запрашивает рекомендации у ML-сервиса и отображает в шаблоне
Готовые ML-сервисы, интегрируемые с Битриксом
Яндекс.Персонализация — входит в экосистему Яндекса, требует передачи событий в Метрику и Яндекс.Рекламу. Сложно настроить без партнёрского доступа.
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-рекомендациями и популярными — по количеству событий в профиле пользователя.







