Как мы создаем новый гипер-персонализированный опыт покупок

Этот блог является продолжением предыдущего блога о продукте Fynd App 2.0.



В Fynd мы постоянно создаем продукты, которые позволяют нашим клиентам легко открывать для себя выбор моды. Для этого недавно мы выпустили приложение Fynd App 2.0 с гипер-персонализацией.

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

Задача создания Fynd 2.0 была дана команде # Reco, которая проектировала на столпах масштаба, непрерывной интеграции, автоматизации, адаптации.

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

Проектирование системы и потока данных

Stream Mapper

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

Основными входными данными, необходимыми для алгоритма рекомендаций, являются пользовательские рейтинги продуктов, с которыми они взаимодействовали (просмотренные продукты, добавленные в список желаний, добавленные в корзину, просмотренные марки, просмотренные категории, просмотренные коллекции). Оценка каждого продукта - очень обременительный процесс. Даже этого рейтинга нам будет недостаточно, поэтому вместо того, чтобы портить пользовательский опыт, мы полагаемся на неявные рейтинги данных о потоках кликов. Используя интеграцию веб-перехватчика Segment, Stream Mapper фиксирует событие потока кликов и создает пользовательскую память для следующего пользовательского запроса.

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

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

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

Which has these variables,
del_behavior = change in user preference while 
y = matching flag, 1 if event attrb. matched with user memory else 0
del_t = time day since last visit
max_t = maximum time duration for score
w_i = weight of event i
score = previous calculated score for event property - brand, category or collection

Для оценки этих атрибутов свойств мы использовали алгоритм FyndRank, созданный командой # Reco-team (вдохновленный EdgeRank Facebook). Оценка гарантирует, что значение функций остается в пределах предварительно определенных диапазонов, в противном случае мы нормализуем оценку с помощью метода min-max.

Наряду с созданием пользовательской памяти Stream Mapper также вычисляет сходство между брендами и коллекциями, которые также могут быть рекомендованы пользователям. Чтобы вычислить оценки сходства между брендами, при сборе он извлекает метаинформацию из Reactive Grid и подготавливает вектор признаков для обработки.

Feature vectors for brand and collection
Brand = [category, price_range ,gender ,discounts,...]
Collection = [brand, category, price_range, gender ,discounts, ...]
Calculate similarity scores with cosine measure between [0,1]
sim(BH, DZ) = 0.9 (similar brands)
sim(BH, FS) = 0.1 (dis-similar brands)

Конвейер

ML Pipeline для создания пользовательских предпочтений на основе пользовательской памяти.

Конвейер полагается на совместную фильтрацию и фильтрацию содержимого для создания динамического содержимого канала, подобранного в соответствии с предпочтениями пользователя. С помощью оценки сходства, рассчитываемой в Stream Mapper, Pipeline прогнозирует влияние бренда, категории и коллекций для пользователей и ранжирует для создания динамического содержимого страницы.

Он заботится о том, чтобы пользователь увидел интересующие его модные товары в порядке убывания оценки релевантности.

С помощью алгоритма FyndRank мы динамически генерируем рекомендательный контент на основе пола для различных разделов приложения - для вас, бренда и коллекции. Раздел Для вас построен с различными типами товарных рекомендаций.

Для вас = Предпочитаемый + Рекомендация + Тенденции + Интересный

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

Определяя настроенные параметры, мы поддерживаем идеальный баланс разнообразия, новизны, глубины и охвата объектов инвентаря (например, брендов, категорий товаров) с прогнозируемой последовательностью новых карточек каналов на странице канала, страницы бренда и страницы коллекции. Конвейер включает несколько моделей машинного обучения с вариациями логики ранжирования. Из них будет выбрана модель обслуживания на основе текущего эксперимента в нашей экспериментальной панели.

Vortex: экспериментальный движок

После создания гиперперсонализированной платформы нам все еще нужно выяснить, какая модель работает, а какая нет с точки зрения просмотров и конверсий воронки. Поэтому мы создали Vortex - наш крупномасштабный экспериментальный движок для проведения A / B-тестов в определенных пользователем группах пользователей. Мы контролируем множество настроек приложения и обслуживаем их среди разных групп пользователей.

Настройка приложения = AI-модель + Порядок карты + Текст карты + Рекомендуемый контент

Модель AI - это гиперперсонализированная модель для оценки и цензуры бренда, коллекции и категории. Чем выше оценка, тем больше шансов увидеть контент в верхней части фида товаров. У него есть возможность настроить видимость определенного бренда, коллекции и категории на гендерном уровне.

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

Рекомендованный контент помогает команде роста продвигать определенные бренды, коллекции и многое другое!

Основная философия Vortex заключается в том, чтобы обслуживать как можно больше разных моделей и карточек в разном порядке. для разных пользователей, сегментированных (на основе различных предварительных условий или процентных соотношений), учиться у них и затем масштабироваться для обслуживания всех пользователей.

Реактивная сетка

Реактивная сетка - это график содержимого инвентаря, хранящегося в Redis.

Содержимое инвентаря хранится в MongoDB. Что касается инфра-стороны, наша основная задача заключалась в том, чтобы обслуживать персонализированный контент каждого пользователя очень быстро (‹40 мс) при очень высоком трафике. В соответствии с предпочтениями пользователя (сгенерированными конвейером) все запросы к базе данных становятся более динамичными и сложными, на которые требуется гораздо больше времени для ответа. Для получения согласованного вывода при высокой нагрузке мы нашли Redis лучшим решением. Мы создали графическую схему идентификаторов инвентаря в Redis, которая обеспечивает гораздо более быстрое извлечение, чем MongoDB. Redis синхронизируется с инвентарем из MongoDB в режиме реального времени, отсюда и название Reactive Grid.

# Graph storage format inside Redis
Index map 
r:v1:rgp:AND:b#: ["r:v1:g#women:b#AND:c#143:p#low", …]
r:v1:rgp:143:c#: ["r:v1:g#women:b#AND:c#143:p#low", …]
r:v1:rgp:low:p#: ["r:v1:g#women:b#AND:c#143:p#low", …]
r:v1:rgp:women:g#: ["r:v1:g#women:b#AND:c#143:p#low", …]
Redis graph map
r:v1:g#women:b#AND:c#143:p#low: [123, 1243, 3214, 654 …] (item ids)
r:v1:g#women:b#AND:c#178:p#low: [989, 465, 216, 852 …]

В соответствии с предпочтениями пользователя мы сначала выбираем идентификаторы контента, которые обслуживаются из Reactive Grid, а затем получаем метаинформацию для выбранных идентификаторов из MongoDB. Изначально для выбора идентификаторов мы использовали вызов команды KEYS в шаблоне Redis. Поскольку Redis является однопоточным, а команда KEYS блокирует поток, последующие команды ставятся в очередь. Это значительно снижает производительность сервера. Чтобы решить эту проблему, мы создали сегменты индекса шаблона графа для каждого свойства в Redis. Используя эти индексы, мы пересекаем несколько сегментов свойств, чтобы узнать, какие ключи будут доступны из Reactive Grid.

Перед тем, как перейти к производству, мы провели несколько нагрузочных тестов на серверах и обнаружили, что время отклика API составляет около 100 мс, что является неожиданно высоким показателем по сравнению с нашим тестом в 40 мс. Профилирование кода показало узкое место в MongoDB из-за сложных поисковых запросов с несколькими коллекциями MongoDB. Мы решили создать слой кеширования для обслуживания контента непосредственно из Redis, а не из Mongodb. Мы также создали механизм для синхронизации кеша с каждым обновлением инвентаря в MongoDB. Благодаря этому уровню кэширования мы смогли обслужить API рекомендаций менее чем за 40 мс даже при пиковом трафике.

Ключевые моменты оптимизации от Reactive Grid -

  1. Используйте Redis транзакции, чтобы уменьшить количество создаваемых подключений, время отключения и массовую выборку данных из Redis.
  2. Не используйте команду KEYS в Redis, они блокируют. Используйте обходной путь, как в нашем случае, когда мы использовали индексирование с помощью SET внутри Redis.
  3. Вместо прямого запроса к базе данных мы используем график или карты для запроса идентификаторов из Redis. Синхронизируйте этот слой сетки с базой данных с некоторыми таймаутами кеширования.
  4. Используйте msgpack для операций декодирования / кодирования json, это быстрее, чем обычные библиотеки json.

Благодаря инженерным усилиям Джигар Дафда, пратик патент, Фахим Сакри и Амбодж Гоял, мы смогли добиться точного контроля над тем, что предлагается нашим пользователям в больших масштабах.

Первоначальные результаты экспериментов показывают, что мы увеличили среднее количество просмотров страниц продукта за сеанс более чем на 50%. Мы надеемся аналогичным образом увеличить другие показатели в воронке с помощью будущих экспериментов.

Мы будем рады услышать ваши отзывы и предложения - напишите нам в app [at] gofynd.com или оставьте комментарий ниже.

#HappyFynding #R Эко-команда