Comment nous avons utilisé la recherche sémantique pour rendre notre recherche 10 fois plus intelligente
Chez Tokopedia, nous comprenons que la valeur de notre corpus de produits ne se révèle que lorsque nos acheteurs peuvent trouver des produits qui leur sont pertinents ; nous nous efforçons donc d’améliorer la pertinence des résultats de recherche.
Pour poursuivre cet effort, nous introduisons la recherche par similarité sur Tokopedia. Si vous allez sur la page de résultats de recherche sur des appareils mobiles, vous trouverez un bouton « … » qui affiche un menu vous donnant la possibilité de rechercher des produits similaires au produit.
Recherche basée sur des mots-clés
Tokopedia Search utilise Elasticsearch pour la recherche et le classement des produits. Pour chaque requête de recherche, nous interrogeons d’abord Elasticsearch, qui classe les produits en fonction de la requête de recherche. ElasticSearch stocke chaque mot sous forme d’une séquence de nombres représentant les codes ASCII (ou UTF) de chaque lettre. Il construit un index inversé pour déterminer rapidement quels documents contiennent des mots issus de la requête de l’utilisateur, puis trouve la meilleure correspondance parmi eux à l’aide de divers algorithmes de scoring. Ces algorithmes de scoring accordent peu d’attention à ce que signifient les mots, mais plutôt à leur fréquence d’apparition dans le document, à leur proximité les uns par rapport aux autres, etc. La représentation ASCII contient évidemment suffisamment d’informations pour transmettre la sémantique (après tout, nous, les humains, pouvons la comprendre). Malheureusement, il n’existe pas de bon algorithme permettant à l’ordinateur de comparer des mots encodés en ASCII selon leur signification.
Représentation vectorielle
Une solution à cela serait de proposer une représentation alternative, qui nous renseigne non seulement sur les lettres contenues dans le mot, mais aussi sur quelque chose concernant sa signification. Par exemple, nous pourrions encoder avec quels autres mots notre mot est fréquemment utilisé (représenté par le contexte probable). Nous supposerions alors que des contextes similaires représentent des choses similaires, et tenterions de les comparer à l’aide de méthodes mathématiques. Nous pourrions même trouver un moyen d’encoder des phrases entières selon leur signification.
La représentation vectorielle révèle également la signification des mots par rapport à la représentation ASCII.
Sélectionner un moteur de recherche par similarité d’embeddings
Maintenant que nous avons des vecteurs de caractéristiques, le problème restant est de savoir comment récupérer, dans le grand volume de vecteurs, ceux qui sont similaires au vecteur cible. En ce qui concerne le moteur de recherche d’embeddings, nous avons essayé une POC sur plusieurs moteurs disponibles sur Github, dont FAISS, Vearch, Milvus.
Nous préférons Milvus aux autres moteurs sur la base des résultats des tests de charge. D’une part, nous avons déjà utilisé FAISS auparavant dans d’autres équipes et souhaitions donc essayer quelque chose de nouveau. Comparé à Milvus, FAISS est davantage une bibliothèque sous-jacente, et n’est donc pas très pratique à utiliser. À mesure que nous en apprenions davantage sur Milvus, nous avons finalement décidé d’adopter Milvus pour ses deux principales fonctionnalités :
Milvus est très facile à utiliser. Il vous suffit de récupérer son image Docker et de mettre à jour les paramètres en fonction de votre propre scénario.
Il prend en charge davantage d’index et dispose d’une documentation d’accompagnement détaillée.
En résumé, Milvus est très convivial pour les utilisateurs et la documentation est assez détaillée. Si vous rencontrez un problème, vous pouvez généralement trouver des solutions dans la documentation ; sinon, vous pouvez toujours obtenir de l’aide auprès de la communauté Milvus.
Service de cluster Milvus
Après avoir décidé d’utiliser Milvus comme moteur de recherche de vecteurs de caractéristiques, nous avons décidé d’utiliser Milvus pour l’un de nos cas d’utilisation du service Ads, où nous voulions faire correspondre des mots-clés à faible taux de remplissage avec des mots-clés à fort taux de remplissage. Nous avons configuré un nœud autonome dans un environnement de développement (DEV) et avons commencé à servir les requêtes ; il fonctionnait bien depuis quelques jours et nous donnait de meilleures métriques CTR/CVR. Si un nœud autonome tombait en panne en production, l’ensemble du service deviendrait indisponible. Nous devons donc déployer un service de recherche hautement disponible.
Milvus fournit à la fois Mishards, un middleware de partitionnement de cluster, et Milvus-Helm pour la configuration. Chez Tokopedia, nous utilisons des playbooks Ansible pour la mise en place de l’infrastructure, nous avons donc créé un playbook pour l’orchestration de l’infra. Le schéma ci-dessous, issu de la documentation de Milvus, montre comment Mishards fonctionne :
Fonctionnement de Mishards.
Mishards transmet en cascade une requête depuis l’amont vers ses sous-modules en divisant la requête amont, puis collecte et renvoie les résultats des sous-services vers l’amont. L’architecture globale de la solution de cluster basée sur Mishards est présentée ci-dessous :
Architecture globale de Mishards.
La documentation officielle fournit une introduction claire à Mishards. Vous pouvez consulter Mishards si cela vous intéresse.
Dans notre service keyword-to-keyword, nous avons déployé un nœud accessible en écriture, deux nœuds en lecture seule et une instance du middleware Mishards dans GCP, en utilisant Milvus ansible. Jusqu’à présent, il est stable. Un composant essentiel de ce qui permet d’interroger efficacement les jeux de données de millions, milliards, voire milliers de milliards de vecteurs sur lesquels reposent les moteurs de recherche par similarité est l’indexation, un processus d’organisation des données qui accélère considérablement la recherche dans le big data.
Comment l’indexation vectorielle accélère-t-elle la recherche par similarité ?
Les moteurs de recherche par similarité fonctionnent en comparant une entrée à une base de données afin de trouver les objets les plus similaires à cette entrée. L’indexation est le processus qui consiste à organiser efficacement les données, et elle joue un rôle majeur pour rendre la recherche par similarité utile en accélérant de manière spectaculaire les requêtes chronophages sur de grands jeux de données. Une fois qu’un jeu de données vectorielles massif est indexé, les requêtes peuvent être orientées vers des clusters, ou sous-ensembles de données, les plus susceptibles de contenir des vecteurs similaires à une requête d’entrée. En pratique, cela signifie qu’un certain degré de précision est sacrifié afin d’accélérer les requêtes sur de très grandes données vectorielles.
On peut faire une analogie avec un dictionnaire, où les mots sont triés alphabétiquement. Lorsqu’on recherche un mot, il est possible de naviguer rapidement vers une section qui ne contient que des mots ayant la même initiale — ce qui accélère considérablement la recherche de la définition du mot saisi.
Et ensuite, demandez-vous ?
Blog_How we used semantic search to make our search 10x smarter_5.jpeg
Comme indiqué ci-dessus, il n’existe pas de solution universelle ; nous voulons toujours améliorer les performances du modèle utilisé pour obtenir les embeddings.
De plus, d’un point de vue technique, nous voulons exécuter plusieurs modèles d’apprentissage en même temps et comparer les résultats des différentes expériences. Restez attentifs pour plus d’informations sur nos expériences, comme la recherche d’images et la recherche de vidéos.
Références :
- Docs Mishards: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
Cet article de blog est republié depuis : https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821
Lisez d’autres témoignages d’utilisateurs pour en savoir plus sur ce que l’on peut créer avec Milvus.
Continuer à lire

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.

Zilliz Cloud Audit Logs Goes GA: Security, Compliance, and Transparency at Scale
Zilliz Cloud Audit Logs are now GA, giving enterprises real-time visibility, compliance-ready trails, and stronger security across AWS, GCP, and Azure.

Democratizing AI: Making Vector Search Powerful and Affordable
Zilliz democratizes AI vector search with Milvus 2.6 and Zilliz Cloud for powerful, affordable scalability, cutting costs in infrastructure, operations, and development.



