Есть товар: item_id = 515
И мы хотим найти другие товары, похожие на него.
Для этого обычно используют:
- со-клики / со-покупки,
- ближайшие соседи (ANN и т.п.),
- колобаративные эмбеддинги,
- последовательные эмбеддинги вроде BERT4Rec,
- ANN-поиск по эмбеддингам,
- или всё сразу.
То есть товар превращается в вектор:
item_id → embedding
А дальше мы ищем ближайшие эмбеддинги.
Но есть одна интересная вещь. item_id сам по себе ничего не значит:
Товар 515 и товар 516 могут быть совершенно разными.
А товар 515 и товар 928374 почти одинаковыми.
Обычный item_id уникален, но он не информативный.
И тут появляется очень красивая идея: дать товарам не просто ID, а семантический ID (Semantic ID).
То есть вместо:
item_id = 515
получить что-то вроде:
item → [12, 87, 5, 41]
Это всё ещё числа.
Но теперь они уже не случайные.
Это дискретный смысл в котором заложена информация о товаре.
Например:
item A → [12, 87, 5, 41]
item B → [12, 87, 6, 39]
Такие товары будут близки не потому, что у них похожие item_id, а потому что за этими чиселками стоят похожие свойства и поведение товаров.
С книгами это особенно легко представить.
Допустим:
"Гарри Поттер" → [12, 87, 5, 41]
"Перси Джексон" → [12, 87, 6, 39]
"Учебник по матану" → [201, 14, 77, 3]
Первые две книги могут получать похожие токены, потому что:
- их читают похожие пользователи,
- у них похожий жанр,
- похожая аудитория,
- похожие паттерны потребления.
А учебник по матану окажется уже совсем в другой области векторного пространства.
Но возникает вопрос: как вообще превратить обычный эмбеддинг в такую последовательность смысловых токенов?
И тут появляется RQ-VAE модель, которая умеет превращать обычные эмбеддинги в короткие наборы дискретных токенов.
Если совсем грубо, RQ-VAE работает как умный компрессор для векторного пространства.
У нас есть длинный плотный эмбеддинг товара, например, коллаборативный, текстовый или из модели последовательных действий. В нём зашита информация о поведении пользователей, тексте, категории, картинке и других свойствах объекта.
RQ-VAE пытается представить такой эмбеддинг не как длинный набор float-чисел, а как короткую последовательность дискретных токенов.
Зачем это нужно?
Во-первых, такие представления гораздо удобнее для поиска похожих товаров: вместо поиска только ближайших соседей можно искать товары с похожими токенами или общими префиксами смысловых идентификаторов.
Во-вторых, это делает каталог более структурированным: похожие товары начинают получать похожие последовательности кодов.
В-третьих, это сближает рексистемы с идеями из NLP и LLM, где текст тоже сначала превращается в последовательность токенов.
По сути RQ-VAE это способ дать объектам не случайные ID, а компактные машинные "смысловые адреса".
И это интересно не только концептуально, но и очень практично для продовых рексистем.
Потому что retrieval по semantic ID часто оказывается сильно дешевле и быстрее, чем поиск ближайших соседей по плотным эмбедингам.
В классическом ANN-поиске нам обычно нужны:
- большие векторные индексы,
- HNSW/FAISS/ScaNN,
- хранение float-векторов,
- поиск похожих.
А здесь объект уже представлен короткой последовательностью дискретных токенов:
item → [12, 87, 5, 41]
И retrieval можно делать почти как поиск по инвертированному индексу:
• совпал полный semantic ID,
• совпал префикс,
• совпали первые 2 токена,
• или просто есть пересечение по бакетам.
Вместо дорогого поиска по непрерывному пространству мы переходим к очень дешёвым операциям над токенами.
Особенно это интересно для:
• огромных каталогов,
• рекомендаций в nearline или риалтайме,
• инференсе на носимых устройствах,
• многоэтапных рекомендательных систем,
• и архитектур, где сначала ищут кандидатов, а потом ранжируют их.
По сути semantic ID превращает retrieval из "поиска ближайшего вектора" в "поиск по смысловым адресам".