👋 Привет, Хабр!
Меня зовут Никита Горячев, я Research Engineer в WB, последние несколько лет работаю на стыке RecSys, LLM и мультимодальных моделей. Каждый день мы обрабатываем миллиарды событий, а модели, которые мы внедряем, напрямую влияют на CTR, удержание и конверсию, принося немало дополнительной выручки.
До этого я успел поработать в AI-стартапе в Palo Alto, где занимался голосовыми агентами (ASR/TTS), и в МТС, где мы строили AI-экосистему. Ранее в Сбере я занимался созданием единого RecSys SDK для всей экосистемы (от SberMegaMarket до Okko и Zvuk), а ещё раньше — развивал персонализацию и ML в ритейле.
Сегодня я хотел бы поговорить о том, как большие языковые модели могут починить контрастивное обучение в рекомендательных системах. Контрастивные методы давно стали стандартом в NLP и CV, но в последовательных рекомендациях они работают далеко не идеально: данные разрежены, а аугментации часто искажают смысл вместо того, чтобы его сохранять. Авторы свежей статьи с arXiv — “Semantic Retrieval Augmented Contrastive Learning for Sequential Recommendation (SRA-CL)” — предлагают элегантное решение: использовать LLM для генерации семантически осмысленных позитивных пар. Звучит просто, но даёт заметный прирост качества — давайте разберёмся, как именно это работает.
📉 Проблема стандартного contrastive learning в рекомендациях
1. Разреженность данных
Поведение пользователей представлено в виде последовательностей из нескольких взаимодействий (обычно 5–50 событий). При этом пространство объектов (товаров) огромное. Простая кластеризация или соседство по ID даёт шумные результаты: два пользователя могут оказаться в одном кластере только из-за пересечения по одному товару.
2. Неподходящие аугментации
В NLP/vision аугментации сохраняют семантику (masking, cropping, dropout). В RS — нет:
Удаление случайного товара может полностью изменить смысл.
Перестановка событий ломает естественный порядок последовательности.
3. Семантический разрыв
Две последовательности могут быть эквивалентны по смыслу, но не иметь пересечения по ID.
Пример: один пользователь покупает «iPhone → AirPods → MacBook», другой — «Samsung Galaxy → Galaxy Buds → Windows Laptop». На уровне ID это совершенно разные последовательности, но семантически — обе показывают «технологический энтузиаст, покупающий экосистему бренда».
👉 Итог: позитивные пары в contrastive loss не отражают настоящего сходства → модель учится на шумных сигналах.
💡 Идея SRA-CL
SRA-CL решает проблему за счёт семантического ретривала на основе LLM. Вместо случайных аугментаций и кластеризации ID, метод строит позитивные пары, опираясь на осмысленные семантические представления.
Метод включает два компонента:
1️⃣ Cross-sequence Semantic Contrast
Каждую последовательность пользователя преобразуют в текстовое резюме с помощью LLM (в статье: DeepSeek-V3, temp=0, top-p=0.001).
Тексты кодируются моделью SimCSE-RoBERTa, чтобы получить семантические эмбеддинги.
Для каждого пользователя ищутся k ближайших соседей по косинусному сходству (через FAISS или аналогичные индексы).
Из соседей строится взвешенный attention-агрегат, который служит позитивной парой для contrastive learning.
2️⃣ Intra-sequence Semantic Contrast
Для каждого товара в последовательности ищется семантически близкий товар (через эмбеддинги описаний/атрибутов).
Составляются новые последовательности, где часть элементов заменена аналогами (например, «Nike running shoes» → «Adidas sports shoes»).
Две версии последовательности теперь отражают одного и того же пользователя, но с вариацией в деталях.
3️⃣ Итоговый лосс
Финальная функция потерь включает три компонента:
— стандартный лосс для предсказания следующего элемента.
— контрастивная часть для межпользовательских позитивов.
— контрастивная часть для внутри-пользовательских позитивов.
Гиперпараметры \alpha, \beta контролируют вклад семантического CL.
📊 Эксперименты
Датасеты
Yelp
Sports (Amazon)
Beauty (Amazon)
Office (Amazon)
Бейзлайны (12 моделей)
GRU4Rec, BERT4Rec, SASRec, DuoRec и др.
Результаты
Максимальное улучшение: +11.82% относительно SOTA (p < 0.01).
При интеграции в SASRec:
HR@20: +8.3% → +27.3%
NDCG@20: +9.7% → +25.5%
Важно: инференс не усложняется — LLM используется только для предобработки на этапе обучения.
⚙️ Как реализовать SRA-CL
Установка
pip install faiss-cpu transformers sentence-transformers torch
1. Получение семантических эмбеддингов пользователей
from sentence_transformers import SentenceTransformer
import faiss
# Модель SimCSE
model = SentenceTransformer("princeton-nlp/sup-simcse-roberta-base")
user_summaries = [
"User buys Apple ecosystem products (iPhone, MacBook, AirPods)",
"User prefers Samsung Galaxy devices and accessories",
"User frequently purchases fitness and sports equipment"
]
embeddings = model.encode(user_summaries)
# FAISS индекс для поиска соседей
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings)
# Ищем top-k соседей
D, I = index.search(embeddings[:1], k=3)
print("Top semantic neighbors:", I[0])
2. Семантические замены внутри последовательности
item_texts = [
"iPhone 14 Pro smartphone",
"Samsung Galaxy S23 smartphone",
"Nike running shoes",
"Adidas sports shoes"
]
item_embeddings = model.encode(item_texts)
index_items = faiss.IndexFlatL2(item_embeddings.shape[1])
index_items.add(item_embeddings)
# Найдём аналоги для iPhone
D, I = index_items.search(item_embeddings[:1], k=2)
print("Semantically similar items:", [item_texts[j] for j in I[0]])
3. Контрастивный лосс
import torch
import torch.nn as nn
class NTXentLoss(nn.Module):
def __init__(self, temperature=0.1):
super().__init__()
self.temperature = temperature
def forward(self, z_i, z_j):
# z_i, z_j — эмбеддинги позитивных пар
sim_matrix = torch.mm(z_i, z_j.T) / self.temperature
labels = torch.arange(z_i.size(0)).long()
loss = nn.CrossEntropyLoss()(sim_matrix, labels)
return loss
# Пример
z_i = torch.randn(32, 128) # эмбеддинги оригинальных пользователей
z_j = torch.randn(32, 128) # эмбеддинги соседей
loss_fn = NTXentLoss()
print("Loss:", loss_fn(z_i, z_j).item())
📌 Практические выводы
SRA-CL улучшает contrastive learning в условиях разреженности и семантического разрыва.
Метод универсален: можно встроить в любую последовательную RS (GRU4Rec, SASRec, DuoRec).
Стоимость инференса не меняется: LLM и SimCSE нужны только для построения позитивов при обучении.
Прирост качества значим: до +11.82% HR@20/NDCG@20 на стандартных датасетах.
Рекомендация для практиков: если работаете с long-tail, cold-start или sparse данными — SRA-CL может дать существенный буст.
📖 Заключение
Работа над SRA-CL вписывается в более широкий тренд: использование LLM не на инференсе, а как «семантических учителей» при обучении моделей. Это позволяет объединить богатую семантику языковых моделей и эффективность классических рекомендательных архитектур.
Скорее всего, мы будем видеть всё больше подобных подходов, где LLM помогают «структурировать» данные на этапе обучения, а не выполняют дорогие онлайн-запросы.
📄 Оригинальная статья: Semantic Retrieval Augmented Contrastive Learning for Sequential Recommendation (SRA-CL)