Как мы создаем новый гипер-персонализированный опыт покупок
Этот блог является продолжением предыдущего блога о продукте 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 -
- Используйте Redis транзакции, чтобы уменьшить количество создаваемых подключений, время отключения и массовую выборку данных из Redis.
- Не используйте команду KEYS в Redis, они блокируют. Используйте обходной путь, как в нашем случае, когда мы использовали индексирование с помощью SET внутри Redis.
- Вместо прямого запроса к базе данных мы используем график или карты для запроса идентификаторов из Redis. Синхронизируйте этот слой сетки с базой данных с некоторыми таймаутами кеширования.
- Используйте msgpack для операций декодирования / кодирования json, это быстрее, чем обычные библиотеки json.
Благодаря инженерным усилиям Джигар Дафда, пратик патент, Фахим Сакри и Амбодж Гоял, мы смогли добиться точного контроля над тем, что предлагается нашим пользователям в больших масштабах.
Первоначальные результаты экспериментов показывают, что мы увеличили среднее количество просмотров страниц продукта за сеанс более чем на 50%. Мы надеемся аналогичным образом увеличить другие показатели в воронке с помощью будущих экспериментов.
Мы будем рады услышать ваши отзывы и предложения - напишите нам в app [at] gofynd.com или оставьте комментарий ниже.
#HappyFynding #R Эко-команда