Авторы: Эстер Васиете Теджасви Теннети

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

Автозаполнение (AC) — важная поверхность, обеспечивающая нашим пользователям восхитительный опыт покупок. Во-первых, это помогает им сэкономить время, позволяя им легко находить нужные продукты. Кроме того, это вдохновляет их изучить весь ассортимент нашего каталога и попробовать новые продукты. Такое исследование важно, поскольку оно помогает нашим клиентам получить больше пользы от Instacart и больше взаимодействовать с приложением, помимо обычного списка покупок. Наконец, он используется, чтобы направлять их в их путешествии, глубоко понимая их текущую покупательскую сессию и рекомендуя поисковые запросы, которые помогут нашим клиентам найти товары, которые они хотят.

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

Откуда берутся предложения

Мы полагаемся на предыдущие поисковые запросы клиентов в Instacart, чтобы определить полный набор предложений, которые можно использовать для прогнозирования поискового запроса клиента. Преимущество использования набора данных, основанного на наших журналах поиска, заключается в том, что он предоставляет подробные предложения на естественном языке, с которыми пользователи могут легко разобраться. Наш словарный запас состоит из 57 000 слов, извлеченных из 11 300 000 подходящих продуктов и брендов, что составляет около 785 000 различных автозаполненных терминов для всех розничных продавцов.

Поскольку пользовательские запросы не всегда должны быть правильно сформированы, мы применяем набор правил для фильтрации кандидатов, таких как:

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

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

Соответствие намерениям пользователя

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

Например, для префикса «ice c» мы извлекаем всех кандидатов, содержащих «ice c», с условием, что совпадение должно происходить в начале любого слова в наборе кандидатов, чтобы обеспечить больший и более разнообразный набор. В этом примере мы получим следующий список: «лед ссливкой», «сэндвич с с льдом», «лед с кофе», «ледяные батончики», «ванильный ледяной рожок», «кето ледяной крошка» и т. д.

Ниже мы описываем некоторые проблемы, которые нам пришлось преодолеть, чтобы получить качественные предложения.

Обработка орфографических ошибок

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

Простое удаление предложений с ошибками в этом случае может привести к снижению количества заказов авокадо клиентами, что плохо как для клиента, так и для Instacart.

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

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

Семантическая дедупликация

Термины поискового запроса, сгенерированные из пользовательских журналов, часто включают несколько терминов автозаполнения, которые семантически идентичны. Иногда встречается почти точное совпадение слов (например, «свежие бананы» и «бананы свежие», формы единственного и множественного числа, такие как «яблоко» и «яблоки», или составные существительные, такие как «яблочное пюре» и «яблочный соус»). Наличие семантически идентичных предложений обременяет пользователя большим количеством ненужных вариантов и снижает вероятность появления запроса о намерениях пользователя. Кроме того, удаление дубликатов приведет к более разнообразному набору результатов.

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

Давайте посмотрим на показатель семантического сходства между парой поисковых запросов:

  • Ломтики сыра → Ломтики сыра: 98%
  • Майонез → Майонез: 97%
  • Сыр макароны → Сыр макароны: 97%

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

Использование каталога Instacart для решения проблемы холодного запуска

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

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

Мы преодолели эту проблему, используя наш стандартизированный каталог Instacart, которым пользуются розничные продавцы. Общий каталог позволил нам расширить наше понимание поисковых терминов и продуктов, а также подготовить предложения по запросам для новых и небольших розничных продавцов с меньшим поисковым трафиком, использующих продукты, которые обычно используются всеми розничными продавцами. Этот подход улучшил скорость автозаполнения для новых пользователей на 0,8%, а также увеличил размер корзины на 0,7%.

Наш следующий шаг к решению проблемы холодного старта — углубиться в нейронную генеративную языковую модель для извлечения терминов-кандидатов запроса из каждого продукта, доступного в каталоге (doc2query).

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

Рейтинг: за пределами популярности

Наша первоначальная модель ранжирования с автозаполнением основывалась на популярности, которая работала достаточно хорошо. Однако по мере роста использования автозаполнения мы задавали себе много важных вопросов: «Может ли это повлиять на поведение пользователя при поиске», «Может ли это привести к еще большему увеличению размера корзины», «Может ли это вдохновить пользователей на поиск новых запросов». Это побудило нас изучить новые модели ранжирования, чтобы определить окончательный порядок предложений.

Модель взаимодействия с автозаполнением

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

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

Наиболее актуальными функциями являются:

  • ac_conversion_rate измеряет скорость, с которой предлагаемые термины соблюдаются и нажимаются с учетом префикса.
  • ac_skip_rate призван контролировать смещение позиции путем моделирования скорости, с которой пользователь просматривает наиболее популярные термины, но не интересуется ими.
  • is_start_match, логическая функция, указывающая, совпадает ли префикс с начала предлагаемого термина (например, «paper towels» соответствует префиксу «p ” с самого начала, а “туалет paper” – нет).
  • is_fuzzy_match, логическая функция, указывающая, является ли совпадение нечетким.
  • has_thumbnail, логическая функция, указывающая, содержит ли предложение миниатюру.
  • normalized_popularity — нормализованная функция популярности запросов (в процентах от общего числа поисковых запросов) на уровне розничного продавца.

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

Эффективность этого улучшенного покупательского опыта отразилась на основных показателях нисходящего потока: +2% к товарам, добавленным в корзину за поиск, и +1,6% к доходу от рекламы.

Многоцелевой рейтинг

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

Цель поиска — выполнить намерение, которое пользователь выражает с помощью поискового запроса. Мы понимаем, что намерение было выполнено, когда в корзину, связанную с этим поисковым запросом, был добавлен один (или несколько) товаров. Если упростить процесс поиска, между выражением намерения и добавлением в корзину есть три шага. На первом этапе пользователь вводит свое намерение в строку поиска (префикс) и динамически видит ранжированный список предложений. Если пользователь выбирает одно из предложений (шаг 2), мы получаем конверсию автозаполнения. На шаге 3 пользователь попадает на страницу результатов поиска, на которой показаны предлагаемые элементы для выбранного термина, и теперь у него есть возможность добавить элемент в корзину — мы называем это событие поисковой конверсией или добавить в корзину.

В модели взаимодействия с автозаполнением мы рассматриваем только шаги 1 и 2 и обучаем модель ранжирования, оптимизирующую конверсии автозаполнения. Конечная цель Instacart в поиске — помочь покупателю создать корзину. По этой причине мы создали новый обучающий набор данных, который фокусируется на всех трех шагах, и построили многоцелевую модель с конечной целью увеличения добавления в корзину.

Мы попробовали несколько многоцелевых подходов, например метод объединения ярлыков, при котором проблема сводится к одной цели путем объединения нескольких целей в одну. В нашем сценарии автозаполнения добавление в корзину может произойти только в том случае, если показ автозаполнения преобразуется, и поэтому мы можем просто поменять цель AC на цель «Добавить в корзину». Однако мы столкнулись с проблемами нехватки данных и выбрали подход объединения моделей — объединение моделей, настроенных независимо для каждой цели.

Предполагая, что шаги 2 и 3 независимы, мы можем оценить вероятность добавления в корзину с учетом префикса как вложенного продукта модели вовлечения AC (описанной в предыдущем разделе) и модели добавления в корзину, записанной как:

В приведенном выше уравнении мы фактически делаем предположение, что модель добавления в корзину не зависит от префикса (условная независимость), и поэтому оцениваем модель добавления в корзину как p(atc=1 | term), условную вероятность добавления в корзину с учетом срока. У этого есть дополнительное преимущество, заключающееся в возможности использовать все наши журналы поиска для извлечения функций, а не только те поиски, которые были запущены с помощью автозаполнения.

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

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

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

Модель была запущена после того, как наблюдалось увеличение на 2,7 %коэффициента взаимодействия с автозаполнением, +0,3 % коэффициента конверсии поиска и увеличение GTV (валовой стоимости транзакции) на пользователя в результате увеличения поискового трафика на качественный поиск.

Прощальные мысли

Автозаполнение — это больше, чем инструмент навигации, который предугадывает намерения пользователя во время ввода. Это также мощный способ направить поисковый трафик на осмысленные запросы и повысить доступность предложений продуктов Instacart.

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

Внимание!

Нитин Пасари, Джесси Шевин, Сайлас Бертон.