Хорошая рекомендация иногда помогает вернуться к тому, что человек уже выбрал. Для интернет-магазина это отдельная задача: напомнить о знакомом товаре и избавить покупателя от повторного поиска. В Sales Ninja для неё есть товарные рекомендации с возвратом к просмотренному, а ML-ранжирование по API позволяет менять порядок товаров в переданном списке.
Источник и авторство. Оригинальная публикация — Reach for the Top: How Spotify Built Shortcuts in Just Six Months, Spotify Engineering, 15 апреля 2020 года. Историю проекта рассказывает Damien Tardieu, Engineering Manager. Ниже — краткий русский пересказ и самостоятельный разбор редакции Sales Ninja; это не полный перевод. Объяснения, условные расчёты и выводы для электронной торговли добавлены редакцией.
#Как Spotify пришла к шести карточкам
Spotify выяснила, что заметная часть недельных прослушиваний приходится на небольшой набор любимых плейлистов, альбомов и подкастов. На главной появился Shortcuts: шесть карточек для быстрого возвращения к знакомому контенту.
Сначала команда проверила саму идею: в A/B-тесте подняла выше разделы с часто и недавно прослушанным. Затем совершенствовала простые правила отбора, учитывая частоту, длительность и давность прослушиваний. Кандидатами служил контент из истории за последние 90 дней.
У правил была практическая роль: дать рабочую версию и ориентир для оценки более сложной модели. Когда эвристики усложнились, команда перешла к машинному обучению. Модель ранжировала только уже знакомый пользователю контент; качество проверяли по NDCG и другим офлайн-метрикам, затем — в A/B-тестах.
По сообщению Spotify, выбранная архитектура улучшила офлайн-оценку на 26,7% относительно эвристики. Это относительное улучшение качества модели, а не рост прослушиваний на 26,7%. Разработка Shortcuts заняла шесть месяцев. Главный вывод автора: понимание пользовательской задачи и проверка гипотез определяют пользу технологии.
Читать оригинальную историю на Spotify Engineering →
#Что делает возвращение полноценной рекомендацией
Дальше — наш разбор этой идеи и её применения в электронной торговле.
Когда человек открывает каталог, у него могут быть две разные задачи. Иногда он хочет разобраться в ассортименте: сравнить варианты, увидеть новинку, найти замену. Иногда выбор уже почти сделан: он возвращается за конкретной моделью, которую рассматривал вчера. Во втором случае ещё одна подборка новинок добавляет работу. Нужно снова вспомнить название, открыть категорию, настроить фильтры и найти нужную карточку.
Блок знакомых товаров полезен тем, что сохраняет результат предыдущего поиска. Покупатель уже потратил время на сравнение, а сайт помогает продолжить с того места, где он остановился. Это особенно удобно, если решение занимает несколько визитов: человек уточняет размеры, согласовывает закупку или ждёт подходящего момента для заказа.
Но история просмотров сама по себе ещё не готовая рекомендация. В ней перемешаны осмысленный интерес, случайные переходы и уже завершённые задачи. Поставить наверх последнее открытое — понятное правило, однако последнее действие может быть менее существенным, чем несколько возвращений к другой позиции.
Здесь и появляется задача ранжирования: из знакомых товаров выбрать те, к которым сейчас полезнее вернуться.
#Почему сортировки по дате бывает мало
Разберём условный пример. Один товар человек открывал трижды: вчера, три и пять дней назад. Второй посмотрел один раз сегодня. К третьему возвращался четыре раза, но все эти просмотры были месяц назад или раньше.
Сортировка по давности поставит первым второй товар. Сортировка по общему числу просмотров — третий. Оба правила учитывают настоящие сигналы, но каждое теряет часть картины: первое игнорирует устойчивость интереса, второе — его возраст.
Простой способ соединить эти сведения — дать каждому просмотру вес, который уменьшается со временем. Например:
Вес просмотра = 2⁻⁽ᵈ⁄⁷⁾, где d — число дней после просмотра.
У свежего просмотра вес равен единице. Через неделю — половине, через две — четверти. Для каждого товара сложим веса его просмотров. Это учебное правило, а не формула алгоритмов Spotify или Sales Ninja.
| Товар | Когда его смотрели, дней назад | Сумма весов |
|---|---|---|
| А: устойчивый недавний интерес | 1, 3, 5 | 2,26 |
| Б: один свежий просмотр | 0 | 1,00 |
| В: прежний интерес | 30, 40, 50, 60 | 0,08 |
Такой расчёт выводит вперёд первый товар. Несколько недавних возвращений перевешивают один свежий переход, а старые просмотры постепенно перестают определять выдачу.

Срок в семь дней выбран для примера. Для расходных материалов, сезонной одежды и оборудования понадобятся разные настройки. Более того, время после покупки может работать иначе, чем время после просмотра: к недавно купленной кофемашине едва ли нужно возвращать человека за второй такой же, а к расходникам для неё — вполне возможно.
Когда правила начинают учитывать покупку, тип товара, повторные визиты и контекст страницы, вручную согласовать их становится сложнее. ML-модель может научиться соединять эти признаки по данным. Её практическое преимущество нужно проверять относительно хорошего простого правила: насколько лучше она помогает покупателю и окупает ли усложнение системы.
#Вернуться к товару и купить повторно — разные задачи
Между музыкой и товарами есть существенное различие: прослушивание обычно не завершает интерес к записи, а покупка может закрыть потребность в конкретной вещи надолго.
Поэтому в торговле полезно различать как минимум три ситуации.
Незавершённый выбор. Человек изучал товар, но ещё не купил. Возвращение к карточке помогает продолжить сравнение или оформить заказ. Важно проверить актуальную цену, наличие и нужный вариант товара.
Повторная потребность. Товар покупают регулярно: корм, кофе, расходные материалы. Здесь интереснее история заказов и время после последней покупки. Дата последнего просмотра может ничего не говорить о том, закончилась ли прежняя упаковка.
Завершённая покупка. Человек уже получил товар длительного использования. Следующая полезная рекомендация может быть дополнением или совместимым расходником. Постоянное возвращение к той же позиции будет занимать место без пользы.
Эти различия меняют состав кандидатов ещё до ранжирования. Если список состоит только из просмотренных товаров, модель выбирает внутри него. Чтобы предложить подходящий аксессуар, нужен другой сценарий подбора. Если товара больше нет в продаже, даже высокая оценка интереса не делает его хорошим кандидатом.
Именно поэтому блоку стоит давать понятное название. «Вы смотрели» обещает восстановить историю выбора. «Повторить заказ» обещает помочь с уже сделанной покупкой. Пользователь должен понимать, на каком основании сайт предлагает ему знакомые позиции.
#Как проверить, что путь стал короче
Легко принять высокий CTR блока за доказательство пользы. У знакомого товара действительно могут чаще открывать карточку: его уже узнают. Но покупатель мог и без блока найти эту позицию через поиск или историю заказов.
Представим, что после запуска выросло число заказов, записанных на рекомендации. Одновременно сократилось число заказов через поиск. Это может означать, что людям стало удобнее, однако само по себе ещё не показывает прирост продаж. Часть покупок просто прошла другим маршрутом.
Чтобы проверить решение, можно случайно распределить возвращающихся посетителей по трём группам. Первая видит прежнюю страницу. Вторая — блок знакомых товаров с простым правилом сортировки. Третья — тот же блок с ML-ранжированием. Так сравнение второй группы с первой оценивает весь новый сценарий, а третьей со второй — пользу модели при одинаковом интерфейсе.

Для задачи сокращения пути имеет смысл смотреть время и число действий до нужной карточки или оформления. Для задачи роста бизнеса — долю посетителей с оплаченным заказом, выручку или прибыль на посетителя. Эти показатели отвечают на разные вопросы: удобство может вырасти, даже если человек купил бы тот же товар в любом случае.
Клики по блоку пригодятся как вспомогательный показатель. Они помогают понять, заметили ли предложение и пользуются ли им. Основной результат следует считать по всем участникам группы, включая тех, кто не кликнул на рекомендации. Иначе из оценки исчезнут люди, которым новый блок помешал или оказался не нужен.
Если речь именно о повторной покупке, горизонт проверки должен соответствовать циклу потребления. За несколько дней трудно оценить функцию, которая возвращает человека за товаром раз в месяц. При этом группировку лучше сохранять за пользователем между визитами, чтобы он последовательно видел одну версию.
#Как это связано с Sales Ninja
В товарных рекомендациях Sales Ninja сценарий «Возврат к просмотренному» показывает товары, которые человек уже открывал в текущем или прошлых визитах. Их порядок учитывает личную релевантность и популярность в категории. Если истории просмотров нет, блок не появляется. Это помогает реализовать отдельный сценарий продолжения выбора.
Для существующего списка товаров есть ML-ранжирование по API: сайт передаёт товары и применяет рассчитанный моделью порядок. Рекомендации отвечают за подбор товаров для блока, ранжирование — за последовательность переданного ассортимента.
Возвращение к просмотренному может приблизить покупателя к заказу, но для полноценного сценария повторной покупки нужно отдельно определить, какие позиции действительно покупают снова и когда возникает потребность. Удобный магазин помнит прежний выбор человека и помогает продолжить его без лишнего поиска. Иногда именно это и есть самое полезное предложение на первом экране.
Источники
- Spotify Engineering — оригинальная статья о разработке Shortcuts, 15 апреля 2020 года.
- Sales Ninja — товарные рекомендации и сценарий «Возврат к просмотренному».
- Sales Ninja — ML-ранжирование товаров по API.
История проекта относится к публикации Spotify 2020 года. Редакционный разбор и иллюстрации подготовлены Sales Ninja; числовой пример условный.
Оригинал статьи опубликован на engineering.atspotify.com