Two-Tower і FAISS: AI-рекомендаційна система для персоналізації

Каталог із тисячами позицій втрачає продажі, коли кожен покупець бачить одну й ту саму видачу. Ми проєктуємо та впроваджуємо рекомендаційні системи під ключ: розбираємося у ваших даних, навчаємо модель і передаємо її вашій команді з регламентами перенавчання. Персоналізація допомагає зростити частку повторних покупок і середній чек без розширення асортименту.
Часті запитання

Чому каталог не продає: розробка рекомендаційної системи

Каталог на сотні тисяч позицій програє не асортименту, а видачі. Новий гість і постійний клієнт бачать однаковий перший екран: ті самі категорії, ті самі добірки, той самий порядок карток. Конверсія карток падає не через товар, а через те, що його показано не тому, хто готовий купити.

Поки персоналізація каталогу тримається на ручних правилах, її стеля задана їх кількістю. Правила нашаровуються, конфліктують між собою, і кожна зміна вимагає релізу.

Після пів сотні умов уже ніхто не скаже, чому конкретна картка опинилася першою, а перевірка нової гіпотези розтягується на тижні.

Паралельно в системі лежать невикористані дані про поведінку: перегляди, пошукові запити, додавання в обране, час на картці, відмови після переходу. Це готовий сигнал про намір, але на видачу він не впливає — максимум іде у звіт. Замкнене коло: слабка видача дає мало кліків, а на слабких даних модель не вчиться.

Робоча схема — двохбаштова модель (Two-Tower): одна частина рахує вектор клієнта за його історією, друга — вектор товару за атрибутами та текстом. Обидва вектори лежать в одному просторі, тому видача збирається не перебором каталогу, а пошуком найближчих позицій через FAISS.

Такий підбір вкладається в бюджет відповіді сторінки і перераховується на свіжих подіях, а не раз на добу. Ручні правила при цьому залишаються верхнім шаром: промо, стоп-листи та залишки обмежують видачу моделі, а не замінюють її.

Нижче розбираємо, як це закривається: від збору сигналу та валідації моделі до контролю якості й відкату на попередню версію.

Що змінюється після впровадження: ефект у вимірюваних метриках

Персоналізація зсуває метрики не за рахунок косметики в інтерфейсі, а за рахунок зміни логіки ранжування. Раніше порядок видачі будувався за популярністю та свіжістю — його отримували всі однаковий.

Після впровадження кожен користувач бачить послідовність, пораховану під його історію, тому частка цільових дій зростає без зростання трафіку.

Технічно працюють дві башти: одна рахує представлення користувача, друга — представлення об'єкта.

Близькість шукається векторним пошуком за індексом FAISS, звідти береться короткий список кандидатів, який потім переранжовується з урахуванням наявності, доставки та обмежень каталогу.

Час відповіді видачі тримається за рахунок попереднього розрахунку: представлення оновлюються за подіями, а не в момент запиту. Вітрина віддає готові блоки з кешу, тому навантаження на неї падає — замість важких вибірок на кожен показ працюють короткі читання за ключем.

Окремо знімається клас відмов, який раніше ламав видачу: холодний старт нового користувача, сплеск на розпродажі, товар без історії. На такі випадки є фолбек — популярне в сегменті, обмеження пулу кандидатів, поступове донавчання.

Ефект персоналізації стає передбачуваним: частка цільових дій і глибина перегляду зростають, час відповіді видачі залишається рівним під навантаженням, а вітрина перестає бути вузьким місцем.

Порівняння підходів до рекомендацій: правила, моделі, гібрид

Кожна схема видачі виграє на своєму профілі даних і ламається на чужому.

Ручні правила та блок популярного дають передбачуваний запуск, але не враховують інтерес конкретного користувача; колаборативна фільтрація спирається на поведінку схожих користувачів і вимагає щільного потоку подій; контентні ознаки працюють за описом самого об'єкта і не залежать від історії.

На практиці вибір визначають три речі: скільки взаємодій накопичено, як швидко оновлюється каталог і наскільки критичний холодний старт.

Підхід Коли підходить Обмеження
Правила та блок популярного Запуск з нуля, рідкісні події, потрібна пояснювана видача Не персоналізує, швидко впирається в стелю залученості
Колаборативна фільтрація Є історія взаємодій і стабільний потік подій Нові користувачі та нові об'єкти не отримують видачі, доки не накопичать дані
Контентні ознаки Багатий опис каталогу, часті зміни асортименту Показує схоже на вже переглянуте, не виводить за межі сформованого смаку
Гібридна схема Бойовий контур з різнорідним трафіком і вимогою до стійкості Дорожча в підтримці: перерахунок ознак, розмітка, контроль якості видачі

Гібрид зазвичай збирають не «на все одразу», а пошарово: колаборативний сигнал відповідає за основну видачу, контентний підстраховує нові об'єкти, правила обмежують небажані поєднання.

Ми починаємо з аудиту даних і метрики якості — лише після цього фіксуємо схему, інакше порівняння підходів залишається теоретичним.

Етапи впровадження: від аудиту даних до передачі моделі

Розробка рекомендаційної системи починається не з моделі, а з даних: кожен наступний крок спирається на перевірений попередній. Спочатку рахуємо, яких сигналів бракує для персоналізації, і лише потім фіксуємо схему. Такий порядок економить тижні на переробках.

Маршрут впровадження

  1. Аудит даних. Дивимося склад подій, глибину історії, частку анонімних сесій і розрідженість взаємодій за каталогом. Фіксуємо, яких сигналів бракує і що потрібно добудувати у зборі логів.
  2. Схема рішення. Розділяємо систему на два контури: швидкий відбір кандидатів з усього каталогу та точне ранжування відібраного за ознаками користувача і товару. Тут же визначаємо перелік ознак і частоту їх оновлення.
  3. Налаштування видачі. Збираємо навчальні пари з історії, балансуємо популярне та нове, додаємо правила-виключення: вже куплене, обмеження за наявністю, виключення за брендом.
  4. Перевірка якості. Оцінюємо на відкладеному за часом відрізку, а не на випадковій вибірці, — інакше метрики завищені. Потім виводимо частину трафіку на нову видачу і порівнюємо з контрольною групою.
  5. Передача рішення. Віддаємо конфігурації контурів, схему ознак, регламент перенавчання та порядок відкату на попередню версію видачі. Проводимо навчання команди і залишаємося на зв'язку на період самостійної експлуатації.

Артефакти передачі: схеми, конфігурації, регламенти перенавчання

Передаємо не «працюючий сервіс під ключ», а комплект, за яким ваша команда зможе супроводжувати систему без нас: запустити, перенавчити, відкотити, розширити ознаки. Нижче — що фізично залишається в репозиторії та в базі знань після здачі.

  • Схеми інтеграції — куди рекомендаційний сервіс підключається: отримання каталогу та профілю користувача, видача списку на фронтенд і в розсилки, таймаути та поведінка за недоступності джерела даних.

  • Конфігурації навчання та видачі — параметри моделі, розмірності представлень, правила відбору кандидатів і переранжування. Усе у файлах конфігурації, а не в коді: зміна налаштувань не вимагає релізу.

  • Регламент перенавчання — тригери (за розкладом, за притоком нових позицій, за падінням метрик), порядок прогонки, критерії приймання нової версії та процедура повернення до попередньої.

  • Розмежування доступу — ролі на навчальні дані, на сервіс видачі та на запуск перенавчання, хто має право викотити модель, журналювання дій.

  • Документація рішення — архітектура, словник ознак, призначення компонентів, відомі обмеження та обхідні шляхи для кожного.

  • Набір перевірок — офлайн-метрики якості, контрольні вибірки, тести на холодний старт і на просідання інтересу до позиції.

  • Контроль у роботі — які показники знімаються постійно, пороги спрацювання, точки, де дивитися причину розходження між навчанням і видачею.

  • Інструкції з експлуатації — підйом з нуля, перезбирання векторного індексу, відновлення після збою, типові звернення та відповіді на них.

Кожен пункт звіряємо на прийманні: ваші інженери проходять по ньому руками і підтверджують, що схема читається, конфігурація запускається, регламент зрозумілий без дзвінка нам.

Кейс: персоналізація видачі в каталозі маркетплейсу

Каталог — сотні тисяч позицій, а видача трималася на правилах: популярність, свіжість, наявність. Покупець отримував той самий порядок незалежно від того, що дивився і купував раніше, тому перші екрани займали товари повз його інтерес.

Переходи в цільову дію майже не зростали разом із трафіком — вузьке місце було не в асортименті, а в тому, як його подають.

Зібрали двохбаштову модель: одна частина кодує користувача за історією переглядів і замовлень, друга — товар за атрибутами та текстами. Близькість рахується за векторним індексом FAISS, тому персональний порядок будується на льоту, а не нічним перерахунком.

Поверх скорингу залишили переранжування: наявність, умови доставки та маржа, як і раніше, вирішують, що потрапить у топ.

Що показали заміри

Метрика До Після
Порядок видачі єдиний, за правилами персональний для авторизованих
Переходи в цільову дію зі стрічки базова лінія +27% на зіставному трафіку
Глибина сесії 4 картки 6,4 картки
Відгук видачі в години пік просідання рівний, учетверо швидший
Новий товар у стрічці лише за загальними правилами включається за хвилини

Окремо перевірили стійкість: за недоступності моделі видача відкочується на попередні правила, і каталог не залишається порожнім. Повторні заміри через місяць трималися на тому самому рівні — зростання дала персоналізація, а не сезонна хвиля.

Як бути, якщо даних для навчання майже немає: холодний старт

Коли даних мало, холодний старт — це не відсутність логів взагалі, а брак історії за конкретним користувачем або об'єктом. Новий відвідувач приходить без профілю, новий товар — без показів, молодий проєкт — без накопичених взаємодій.

Матриця формально є, але розріджена: майже всі пари «користувач–об'єкт» порожні, і модель вивчає середнє за каталогом.

Перший контур будуємо не на поведінці, а на вмісті: об'єкти та користувачі описуються ознаками — категорія, бренд, атрибути, текст опису, склад поточної сесії.

З них збираються вектори, на яких навчається двохбаштова модель: одна башта кодує користувача, друга — об'єкт, близькість шукається векторним пошуком. Такий контур сходиться вже на десятках тисяч подій.

Далі — розігрів видачі: не чекаємо повної історії, а поступово підмішуємо поведінку до контенту. Вага поведінкової частини зростає разом із кількістю взаємодій користувача й об'єкта, тому свіжий профіль не переважує статистику за схожими.

Частину показів віддаємо під дослідження — навмисно різноманітну видачу для збору зворотного зв'язку за невивченими позиціями.

Слабкі сигнали розводимо за рівнями впевненості: показ, клік, доперегляд, додавання в список. Звалювати їх в один лічильник не можна — випадковий показ почне вважатися інтересом, тому кожному рівню задається вага.

Холодний старт закрито не тоді, коли модель навчилася, а коли частка персональних слотів у видачі зростає, покриття каталогу розширюється, а новий користувач отримує релевантний показ за меншу кількість кроків. Тому контентний контур ми залишаємо постійним шаром, а не заглушкою до накопичення логів.

Розбір сумнівів: якість даних, навантаження, підтримка

Якість даних ми перевіряємо до навчання, а не після. Подієвий лог фільтруємо від дублів, ботів та аномальних сплесків, биті записи не видаляємо, а позначаємо: за ними видно, де втрачається передача подій з фронту.

На виході — відтворюваний набір, на якому метрики зіставні між запусками і не «пливуть» від прогону до прогону.

Навантаження рахуємо заздалегідь: підбір рекомендацій віддає окремий сервіс, а перерахунок профілів і векторний пошук не конкурують із основною базою за ресурси.

Пошук найближчих представлень на FAISS іде в пам'яті, тому видача вкладається в загальний бюджет відповіді сторінки, а за зростання каталогу масштабується додаванням вузлів без переписування логіки.

Що робити, якщо даних на старті мало?

Перші тижні система працює на ознаках контенту та правилах схожості — вони дають осмислену видачу без історії користувача. Далі вага поступово зміщується на поведінкові сигнали в міру накопичення подій, і холодний старт перестає бути вузьким місцем.

Як ви помічаєте деградацію якості?

На контрольному зрізі рахуємо частку успішних взаємодій та охоплення каталогу; падіння за поріг піднімає оповіщення. Модель при цьому не «їде» непомітно: попередній знімок зберігається, і відкат на нього займає хвилини, а не окремий цикл навчання.

Чи зможемо донавчати модель самі?

Ми передаємо регламент перенавчання, скрипти підготовки даних і перевірку на тіньовому потоці перед викаткою — донавчання стає штатною процедурою, а не разовою акцією. Супровід моделі описуємо в документації, щоб цим займався ваш інженер.

Обговоримо задачу: які дані та доступи потрібні для оцінки

Щоб повернутися з оцінкою, а не з уточнювальними питаннями, нам потрібен доступ до фактичних даних: за ними видно, чи вистачить історії для навчання моделі або її спершу доведеться накопичувати. Нижче мінімальний набір, який закриває цей етап.

  • Вивантаження подій за 3–6 місяців: перегляди, пошукові запити, додавання в кошик, покупки — з ідентифікатором користувача, ідентифікатором товару та міткою часу.
  • Схему каталогу: атрибути, категорії, залишки, доступність, зв'язки між товарами.
  • Тестовий доступ до API каталогу та замовлень у режимі читання — перевіримо повноту історії та частоту подій.
  • Опис інфраструктури: де плануєте рахувати рекомендації — у своєму контурі чи в хмарі, які мережеві доступи для цього потрібні.
  • Матрицю ролей: хто з боку бізнесу погоджує склад даних і хто відповідає за викатку на боці ваших систем.
  • Поточні метрики: конверсія в покупку, частка повторних замовлень, глибина перегляду — точка відліку, з якою будемо порівнювати результат.
  • Обмеження: що заборонено використовувати (персональні дані, платіжна інформація), вимоги до строків зберігання.

Далі ми рахуємо обсяг вибірки, перевіряємо дані на розрідженість і розриви, після чого надсилаємо план впровадження: етапи, точки контролю та те, який ефект ви побачите на кожному з них.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142