Поиск по ключевым словам
В Tokopedia мы понимаем, что ценность нашего корпуса товаров раскрывается только тогда, когда наши покупатели могут найти товары, которые им подходят, поэтому мы стремимся улучшить релевантность результатов поиска.
Для этого мы вводим в Tokopedia поиск по сходству. Если вы перейдете на страницу результатов поиска на мобильных устройствах, вы найдете кнопку "...", которая открывает меню, позволяющее искать товары, похожие на данный продукт.
Поиск по ключевым словам
Tokopedia Search использует Elasticsearch для поиска и ранжирования товаров. Для каждого поискового запроса мы сначала запрашиваем Elasticsearch, который ранжирует продукты в соответствии с поисковым запросом. ElasticSearch хранит каждое слово как последовательность чисел, представляющих собой ASCII (или UTF) коды для каждой буквы. Он строит инвертированный индекс, чтобы быстро определить, какие документы содержат слова из запроса пользователя, а затем находит среди них наилучшее соответствие, используя различные алгоритмы подсчета баллов. Эти алгоритмы уделяют мало внимания тому, что означают слова, а скорее тому, как часто они встречаются в документе, насколько близко они расположены друг к другу и т. д. ASCII-представление, очевидно, содержит достаточно информации, чтобы передать семантику (в конце концов, мы, люди, можем ее понять). К сожалению, для компьютера не существует хорошего алгоритма сравнения слов, закодированных в ASCII, по их значению.
Векторное представление
Одним из решений этой проблемы может стать альтернативное представление, которое говорит нам не только о буквах, содержащихся в слове, но и о его значении. Например, мы могли бы закодировать , с какими другими словами наше слово часто используется вместе (представляя их вероятным контекстом). Затем мы предположим, что похожие контексты обозначают похожие вещи, и попытаемся сравнить их с помощью математических методов. Мы даже можем найти способ кодировать целые предложения по их смыслу.
Blog_How we used semantic search to make our search 10x smarter_2.png
Выбор поисковой системы для поиска сходства вкраплений
Теперь, когда у нас есть векторы признаков, остается вопрос, как извлечь из большого объема векторов те, которые похожи на целевой вектор. Когда речь зашла о поисковой системе для вкраплений, мы попробовали POC на нескольких движках, доступных на Github, некоторые из них - FAISS, Vearch, Milvus.
По результатам нагрузочных тестов мы предпочли Milvus другим движкам. С одной стороны, мы уже использовали FAISS в других командах и поэтому хотели бы попробовать что-то новое. По сравнению с Milvus, FAISS больше похож на базовую библиотеку, поэтому не совсем удобен в использовании. Узнав больше о Milvus, мы в итоге решили взять Milvus из-за двух его основных особенностей:
Milvus очень прост в использовании. Все, что вам нужно сделать, - это извлечь его Docker-образ и обновить параметры в соответствии с вашим собственным сценарием.
Он поддерживает больше индексов и имеет подробную вспомогательную документацию.
Одним словом, Milvus очень дружелюбен к пользователям, а документация довольно подробная. Если вы столкнетесь с какой-либо проблемой, вы обычно сможете найти решение в документации; в противном случае вы всегда можете получить поддержку от сообщества Milvus.
Кластерная служба Milvus
После того как мы решили использовать Milvus в качестве векторной поисковой системы, мы решили использовать Milvus для одного из наших случаев использования сервиса Ads, когда мы хотели сопоставить ключевые слова с низким коэффициентом заполнения с ключевыми словами с высоким коэффициентом заполнения. Мы настроили отдельный узел в среде разработки (DEV) и запустили обслуживание, оно хорошо работало в течение нескольких дней и давало нам улучшенные показатели CTR/CVR. Если бы автономный узел сломался в производственной среде, весь сервис стал бы недоступен. Таким образом, нам необходимо развернуть высокодоступный поисковый сервис.
Milvus предоставляет Mishards, промежуточное ПО для шардинга кластеров, и Milvus-Helm для настройки. В Tokopedia мы используем плейбуки Ansible для настройки инфраструктуры, поэтому мы создали плейбук для оркестровки инфраструктуры. Приведенная ниже диаграмма из документации Milvus показывает, как работает Mishards:
Blog_How we used semantic search to make our search 10x smarter_3.png
Mishards каскадирует запрос от восходящего потока к своим подмодулям, разделяющим запрос восходящего потока, а затем собирает и возвращает результаты работы подсервисов восходящему потоку. Общая архитектура кластерного решения на базе Mishards показана ниже: Blog_How we used semantic search to make our search 10x smarter_4.jpeg
В официальной документации дается четкое представление о Mishards. Вы можете обратиться к Mishards, если вам это интересно.
В нашем сервисе поиска по ключевым словам мы развернули один узел с возможностью записи, два узла только для чтения и один экземпляр промежуточного ПО Mishards в GCP, используя ансибл Milvus. До сих пор все работало стабильно. Огромным компонентом того, что позволяет эффективно запрашивать миллионные, миллиардные и даже триллионные векторные наборы данных, на которые опираются поисковые системы сходства, является индексирование- процесс организации данных, который значительно ускоряет поиск в больших данных.
Как векторное индексирование ускоряет поиск по сходству?
Системы поиска по сходству работают, сравнивая входные данные с базой данных, чтобы найти объекты, наиболее похожие на входные данные. Индексирование - это процесс эффективной организации данных, и оно играет важную роль в том, чтобы сделать поиск по сходству полезным, значительно ускоряя трудоемкие запросы к большим массивам данных. После индексации огромного набора векторных данных запросы могут быть направлены в кластеры или подмножества данных, которые с наибольшей вероятностью содержат векторы, похожие на входной запрос. На практике это означает, что для ускорения запросов к действительно большим векторным данным приходится жертвовать определенной степенью точности.
Можно провести аналогию со словарем, в котором слова отсортированы по алфавиту. При поиске слова можно быстро перейти к разделу, содержащему только слова с одинаковым начальным значением, что значительно ускоряет поиск определения введенного слова.
Что дальше, спросите вы?
Blog_How we used semantic search to make our search 10x smarter_5.jpeg
Как показано выше, не существует решения, которое бы подходило всем, мы всегда хотим улучшить производительность модели, используемой для получения вкраплений.
Кроме того, с технической точки зрения мы хотим запускать несколько моделей обучения одновременно и сравнивать результаты различных экспериментов. Следите за этим пространством, чтобы узнать больше о наших экспериментах, таких как поиск изображений и поиск видео.
Ссылки:
- Mishards Docs:https://milvus.io/docs/v0.10.2/mishards.md
- Mishards: https://github.com/milvus-io/milvus/tree/master/shards
- Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
Эта статья перепечатана из блога: https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821.
Читайте другие истории пользователей, чтобы узнать больше о создании вещей с помощью Milvus.
- Векторное представление
- Выбор поисковой системы для поиска сходства вкраплений
- Кластерная служба Milvus
- Как векторное индексирование ускоряет поиск по сходству?
- Что дальше, спросите вы?
- Ссылки:
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word