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

Retrieval

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

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

Мы объединяем всю эту информацию в виде запроса, который мы используем для отзыва. Наш базовый механизм поиска — Elasticsearch. Учитывая масштаб Nextdoor и количество данных, которые мы производим каждый день, нам необходимо убедиться, что создаваемая нами система соответствует требованиям к задержке. Для этого данные по нашим вертикалям разбиваются на несколько индексов и перераспределяются по кластерам Elasticsearch. Общий обзор наших поисковых индексов можно просмотреть на следующей диаграмме.

Все операции чтения и записи в Elasticsearch выполняются через собственную службу Nextdoor Elasticsearch Service (NESS). Наш движок использует расширенные метаданные из Query Understanding, упомянутого выше, и для каждой поддерживаемой нами вертикали мы создадим комплексные запросы Elasticsearch, которые будут отвечать за поиск. Соответствующие запросы распределяются по соответствующим кластерам, чтобы получить кандидатов, которых мы будем использовать для ранжирования. Чтобы масштабировать операции кластера Elasticsearch, на этом этапе мы работаем только с соответствующими идентификаторами объектов. Другими словами, поиск вернет только идентификаторы сущностей.

Рейтинг

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

Когда инженеры вводят этапы ранжирования ML в существующие системы, сложность системы возрастает. Недавно введенные этапы требуют, чтобы выборка функций и выводов была чрезвычайно производительной. Функции ранжирования для сущностей должны быть в нашем распоряжении с минимальным влиянием на производительность поиска. Для этого мы используем версию нашего Feature Store, работающую в режиме реального времени. Извлечение признаков происходит на этапе, предшествующем выполнению логического вывода. Мы вызываем Feature Store, чтобы получить соответствующие необработанные, статистические функции или представления о пользователях, капотах, документах и ​​​​взаимодействиях с документами пользователя.

Платформа Nextdoor была построена более 10 лет назад. С тех пор он собрал тонны данных, а это значит, что у поисковой команды есть много данных для обучения нашей модели. Что касается ранжирования, наша команда AB протестировала ранжирование ML, используя различные функции и алгоритмы ранжирования.

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

Для этого мы использовали Learning To Rank (LTR). LTR пытается изучить функцию оценки, которая сопоставляет примеры векторов признаков с действительными оценками из помеченных данных, документов D = {d1, d2, .., dn} и соответствующих входных функций Xi, где i находится между 1 и n.

Учитывая список, цель LTR состоит в том, чтобы найти оптимальную функцию оценки F, такую, что потери по целевой функции минимальны. Особенности документов одновременно традиционны и глубоки.

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

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

В Nextdoor мы используем реализацию LGBMRanker от LightGBM. Во время автономной и онлайн-оценки эта модель показала себя как отличный кандидат, учитывая компромисс между точностью и задержками.

Последние мысли

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

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

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