Борьба с энтропией в e-com. Как поддерживать актуальными данные о товарах в вечно меняющемся мире

Всё течёт, всё изменяется. Особенно информация — она очень быстро устаревает. В e-com неактуальные данные о товарах могут сильно подпортить клиентский опыт. Если удовлетворенность пользователей — важный фокус вашей работы, мне есть чем поделиться :)

Всем привет! Я Григорий Фрольцов, Product Lead машинного обучения в команде контента в СберМаркете. В этой статье я расскажу, какие «сюрпризы» могут происходить с данными об ассортименте, а также о том, с помощью каких продуктовых решений мы эти сложности решаем. Цель моей работы — добиваться максимально актуальной информации на витринах сервиса: с помощью ML и не только. 

Расскажу про типовые и нетиповые проблемы. Опишу, какие инструменты используем, чтобы минимизировать рассинхрон в передаче знаний между оффлайн-точкой и онлайн-площадкой для торговли. Если вы аналитик или биздев в e-com, продакт-менеджер интернет-магазина или работаете над эффективностью операций, точно найдёте для себя интересный инсайты.

027e8f1f26dfd7cbb3212b57d807f135.jpg

Боль в актуальности ассортимента

У товаров и услуг есть свойство заканчиваться и становиться неактуальным. Заканчиваются билеты на концерт, мороженое, сумки из новой коллекции, шампуни по акции к 8 марта. Если ассортимент вашего сервиса — это миллионы позиций, то таких случаев может накопиться несколько тысяч в час. Клиент оплатил товар, но тот закончился на складе: дальше следуют отмены, задержки, возвраты — всё это негативно влияет на клиентский опыт.

СберМаркет — сервис доставки из магазинов и ресторанов, и, как вы можете догадаться, продукты на полках в торговых зала не исключение. Поэтому вопрос прогнозирования актуальности ассортимента для нас крайне важен. Чтобы комплексно рассмотреть его, попробуем учесть потребности всех наших типов клиентов: покупателей, ритейлеров, сборщиков, курьеров и производителей.

Обмен информацией между поставщиком и СберМаркетом: что может пойти не так

Доступность товаров на витрине зависит от информации от ритейлеров. Продавец передает информацию об ассортименте через API или другим способом, включая текущую цену, остаток товара, описание и характеристики в зависимости от категории. Частота обмена информацией сейчас занимает в среднем 15–60 минут.

Первый вопрос: как понять, какие товары можно показать пользователю на онлайн-витрине, а какие нельзя (по «документам» они есть, но это драматически расходится с реальностью)? Это зависит от внутренних систем учета розничных продавцов. 

Существует понятие «распределительного центра», промежуточной точки между производителем и товарной полкой в магазине, откуда товары доставляются в магазин. 

Некоторые ритейлеры считают в своих учетных системах, что товары переходят на баланс магазина в момент выезда из распределительного центра. Хотя эти товары должны пройти путь доставки, разгрузки, приемки по накладным и выкладки на полки. Именно здесь возможны варианты, когда ритейлер считает, что товар уже находится в магазине. Не очень много ритейлеров умеют учитывают товар в наличии, когда он действительно находится на полках магазина.

Поэтому информация о наличии товаров от розничных продавцов не всегда соответствует фактическому наличию товара на полке в торговом зале. Как тогда регулировать, какие товары показывать на онлайн-витрине, а какие нет?

Между «целостностью» и «доступностью»

Что произойдет, если мы будем показываем все товары, наличие которых заявляет нам ритейлер?  

Разберем кейс: готовка супа. Пользователь выбирает продукты для приготовления борща и оформляет заказ, ожидая доставку через определенное время. Однако часть товаров оказывается недоступной. В результате борщ может «остаться» без свеклы и лука, а пользователь будет недоволен.

Как быть в случае, когда часть товаров в корзине оказалась недоступной для сборки? В СберМаркете есть функционал, позволяющий сборщику связаться с клиентом и согласовать отмену или замену товара. Так же клиент может выбрать опцию, при которой его не будут тревожить звонками и привезут только то, что было в наличии — на недоступные товары будет автоматически оформлен возврат. 

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

Представим обратную ситуацию: мы отображаем в приложении только те товары, в наличии которых уверены на 200%. Тогда возникает другая проблема — доступность. Есть вероятность, что мы заблокируем слишком много товаров и покупатель, пришедший за ингредиентами для борща, не найдёт ни свеклу, ни лук и не оформит заказ, хотя в магазине на полке они лежали. 

Поэтому сталкиваемся с бизнес-задачей: максимизация прибыли и лояльности клиентов, при этом сохранение баланса между наличием товаров на витрине и долей отмен/замен в заказах.

Как в СберМаркете работает актуализация

Первый этап — отсеиваем товары с неактуальными ценами

Для начала важно понять, насколько полная информация у нас есть о товаре: это карточка товара с фотографией, описанием и характеристиками. Также у нас есть актуальные данные о наличии товара (стоке) и цене, полученные в последнем обмене информацией с ритейлером. 

Если сток не меняется и цена не обновляется, то можем ли мы показывать этот товар? Если цена не была получена в последнем обмене, мы считаем ее равной нулю. Так проходит первый этап проверки, который занимает несколько секунд.

Второй этап — формируем оффер

Делаем «проливку» информации по мастер-системам СберМаркета. Каждый товар проходит стандартизацию для окончательного отображения на витрине в виде оффера. Оффер — это товарное предложение, у которого заполнена карточка товара, имеется актуальная цена и актуальный сток.

Пример оффера:

Сок «Добрый»
Вид: яблочный
Объем: 2 литра
Местоположение: м. Маяковская
Цена: 120 рублей
Остаток: 10 штук

Таким образом, на втором этапе мы обрабатываем информацию о товаре, приводим ее к стандартному виду и создаем офферы, которые будут отображаться на витрине для пользователей.

Третий этап — прогоняем через ML-модель

Чтобы определить, какие товары показывать пользователям, мы используем модель машинного обучения out-of-stock. Наша задача — прогнозировать наличие товара на полке в момент его сборки. Если товар будет заказан через 2–4 часа, мы постараемся предоставить актуальную информацию о наличии.

Мы получаем эту информацию на основе исторических данных об отменах и заменах товаров, а также их периодичности у каждого ритейлера. Можем проводить анализ в различных разрезах: по категориям, магазинам и времени суток. Учитываем сезонность заказов в течение года (например, больше заказов мороженого летом), внутри месяца (больше заказов в выходные дни, что может привести к тому, что товары быстрее закончатся) и внутри дня (пик покупок после 17:00). Если товар был перемещен на акционный стеллаж, он заканчивается еще быстрее. Проблема здесь заключается в том, что товар перемещен на новое место. Мы стараемся заранее узнавать о таких акциях в диалоге с ритейлерами, особенно перед праздниками.

Мы научились предсказывать ассортимент на основе разницы в наличии товаров в данных, предоставленных ритейлерами в разное время.

Задача модели машинного обучения — показывать в приложении только те товары, которые точно будут собраны. Модель запускается каждый час. В настоящее время мы обрабатываем около 300 миллионов SKU, каждый час анализируется примерно 75 миллионов SKU.

Четвертый этап — транслируем данные на витрину

Этот этап включает в себя следующие шаги:

  • Актуализация витрины. Витрина нашего приложения обновляется, и все пользователи видят актуальную информацию о доступных товарах.

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

  • Ожидание доставки. После оформления заказа пользователь считает, что остается только ждать его доставки.

  • Процесс сборки заказа. Заказ назначается сборщику, который ходит по магазину и собирает все товары, указанные в корзине. Он также взвешивает весовые товары, например, яблоки по 250 рублей за килограмм. При этом точный вес может немного отличаться. Для пользователя процесс выглядит следующим образом: сумма денег холдируется на карте, затем блокировка снимается и списывается реальная сумма за товары.

Когда товары отсутствуют, у нас есть несколько опций:

  • Позвонить и задать вопросы. В этом случае есть несколько возможных сценариев. Например, пользователь может добавить мясо в заказ, но его нет в наличии, и пользователь может попросить сборщика добавить вместо него таблетки для посудомойки. Мы не обучаем модель машинного обучения на таких случаях и исключаем их из рассмотрения.

  • Не звонить и подобрать замену. Мы не звоним пользователю, а выбираем альтернативный товар, который похож на то, что он хотел купить.

  • Не звонить и удалить из заказа. Не звоним пользователю и просто удаляем отсутствующий товар из его заказа.

Когда сборка заказа завершена, наша задача прогнозирования наличия товаров также завершается.

Нестандартные ситуации

Важно отметить, что мы не можем контролировать уровень запасов и цены у ритейлера. Наша задача заключается в использовании инструментов для минимизации негативного влияния на пользовательский опыт.

Ниже набор кейсов, что может пойти не так, от сборки до доставки и как мы адаптируем работу модели, делая выводы из таких ситуаций.

Принудительный сток

У нас есть понятие «принудительного стока», к которому относятся товары собственного производства, например, выпечка, кулинария и готовая еда — все, что готовится прямо в магазине. 

Проблема: Идеально было бы передавать информацию по мере готовности этих товаров. Однако у ритейлеров нет точного графика производства, есть только план ассортимента, часто без указания количества.

Решение: Мы учимся предсказывать такой ассортимент на основе успешных сборок. В настоящее время модель находится в стадии тестирования, и в скором времени мы сможем делать и такие прогнозы.

Локоть выкладки

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

Проблема: Иногда сток может быть передан как положительный: например, слойка показывается как доступная к заказу в 9 утра. Однако на самом деле она еще горячая и только ожидает выкладки на прилавок. 

Поэтому в приложении она доступна для заказа, но сборщик её не увидит и случится отмена. В результате мы блокируем товар, предполагая, что из-за отмены товара в действительности на полке нет. 

Решение: Наша модель не реагирует на одно событие об отмене, так как мы допускаем возможность ошибки из-за человеческого фактора во время сборки/доставки. Сейчас мы учитываем, что есть группы товаров, для которых необходимо установить паузу с момента приготовления до момента фактической доступности.

Устаревание фото

Проблема: Внешний вид товара — это переменная, которая тоже иногда меняется. Был недавно кейс, когда пакетированные соки поменяли цвета своих упаковок из-за недостатка краски. 

Когда пользователь добавил яркую упаковку сока в корзину, сборщик увидел в заказе 1 литр красного томатного сока и его фотографию в каталоге СберМаркета. Однако, когда сборщик не нашел такую упаковку, он пометил его как недоступный в приложении. Таким образом, мы понимаем, что фактически товара нет на полке в магазине, и блокируем его. Затем ритейлер связывается с нами и сообщает о наличии товара, но сборщики не подтверждают это.

Решение: Чтобы справиться с этой проблемой, мы периодически (несколько раз в неделю или по требованию), проверяем актуальность каталогов. Собираем данные обо всех случаях отмены и замены товаров, которые превышают типичные показатели. Затем мы находим отдельные случаи, которые составляют всего 0.001% от общего числа товаров в каталоге. Это обычно несколько сотен SKU. Для них запрашиваем новое фото товара и обновляем информацию на витрине в течение нескольких секунд.

Выявление несоответствий на этапе доставки

О некоторых типах недостоверности информации о товаре удаётся выяснить лишь на этапе доставки. Вот несколько примеров:

  1. Несоответствие характеристик товара. Товар не соответствует ожиданиям пользователя по определенным характеристикам, потому что производитель что-то поменял.

  2. Шринкфляция продукта. Объем или размер товара уменьшается, несмотря на то, что цена остается прежней. Например, бутылка молока может уменьшиться с 1 литра до 900 мл. Чаще всего клиент узнаёт об этом именно на этапе доставки, так как при заказе мог не обратить на это должного внимания.

Решение: Иногда мы узнаём о таких кейсах благодаря прямому фидбэку от клиентов. Но регулярные аудиты информации о каждом товаре позволяют минимизировать такие случаи. А ещё мы мониторим топ отмененных товаров и проводим расследование, не связано ли это с ошибками в описании.

Выводы

Машинная модель out-of-stock (OOS) — не волшебная таблетка. OOS не лечит причины, а минимизирует последствия и негативный клиентский опыт. Мы используем модели прогнозирования, потому что понимаем, насколько сложна задача управления ассортиментной матрицей и товарными остатками у ритейлеров.

Наша цель — обеспечить более позитивный опыт покупателей, минимизируя проблемы, связанные с качеством товаров и актуальностью информации о доступности. Надеюсь, описанные здесь подходы и инструменты помогут вам в этом непростом деле.

Product&data команда СберМаркета ведет соцсети с новостями и анонсами. Если хочешь узнать, что под капотом высоконагруженного e-commerce, следи за нами в Telegram и на YouTube. А также слушай подкаст «Для tech и этих» от наших it-менеджеров.

© Habrahabr.ru