Идея: разделить запрос и каталог

Суть two-tower model — сделать так, чтобы поиск похожих товаров для пользователя был быстрым при любом размере каталога. Для этого пользователь и товар кодируются раздельно в один и тот же векторный space. Релевантность измеряется через скалярное произведение (или косинусное сходство) векторов.

Ключевое свойство: товарные векторы вычисляются один раз и хранятся в векторной базе данных. Для онлайн-запроса нужно только вычислить вектор пользователя и выполнить ANN-поиск — это занимает миллисекунды независимо от размера каталога.

query_vec = user_tower(user_features)
candidate_vecs = item_tower(item_features)  ← предвычислено
scores = dot_product(query_vec, candidate_vecs)
top_k = ANN_search(query_vec, index)

Архитектура и обучение

Каждая башня — нейронная сеть произвольной архитектуры. Стандартный вариант: несколько полносвязных слоёв (MLP) поверх входных признаков. Для истории взаимодействий пользователя используют mean pooling эмбеддингов или трансформер.

Модель обучается на парах взаимодействий. Наиболее распространённый подход — in-batch negatives: для каждого позитивного примера (пользователь, купленный товар) в качестве негативов берут все остальные товары в батче. Это дёшево и достаточно эффективно при большом размере батча.

Компонент Пример для e-commerce
User tower вход История последних N товаров, категории интереса, RFM-признаки
Item tower вход ID товара, категория, текстовый эмбеддинг названия, цена, бренд
Loss function In-batch softmax, BPR (Bayesian Personalized Ranking)
Метрика качества Recall@K, NDCG@K

Двухэтапная архитектура: retrieval + ranking

Two-tower model обычно работает на первом этапе — candidate retrieval: отобрать тысячи кандидатов из миллионного каталога за миллисекунды. На втором этапе более сложная модель (gradient boosting или reranking-сеть) ранжирует кандидатов с учётом дополнительных признаков.

Такое разделение позволяет применять тяжёлые модели к малому числу кандидатов и избегать пересчёта всего каталога на каждый запрос.

Совет: при холодном старте для нового товара (item cold start) two-tower выигрывает у матричной факторизации — товарная башня использует текстовые атрибуты, не требующие истории взаимодействий. Для нового пользователя — аналогично через контекстные признаки.