Annoy vs Voyager : choisir le bon outil de recherche vectorielle pour la GenAI
À mesure que les applications pilotées par l’IA continuent de se développer, le besoin d’outils de recherche vectorielle rapides et évolutifs est devenu essentiel. La recherche vectorielle est un élément clé des systèmes de recommandation, de la recherche d’images, du traitement du langage naturel (NLP) et d’autres domaines où il est crucial de trouver des similarités entre des données de grande dimension. Parmi les nombreux outils disponibles pour la recherche vectorielle, Annoy et Voyager sont deux options largement utilisées, chacune offrant des avantages distincts.
Dans cet article, nous comparerons Annoy et Voyager, en nous concentrant sur leurs fonctionnalités, leurs méthodologies de recherche, leur évolutivité et leurs cas d’utilisation afin de vous aider à décider lequel est le mieux adapté à vos besoins.
Qu’est-ce que la recherche vectorielle ?
Avant d’entrer dans les spécificités d’Annoy et de Voyager, il est essentiel de comprendre la recherche vectorielle. En termes simples, la recherche vectorielle, ou recherche de similarité vectorielle, trouve les vecteurs (points de données) les plus proches d’un vecteur de requête donné dans un espace de grande dimension. Ces vecteurs sont souvent générés par des modèles d’apprentissage automatique afin de capturer l’essence des données non structurées (par exemple, le sens d’une phrase ou les caractéristiques d’une image).
Contrairement aux bases de données traditionnelles, où les recherches reposent sur des correspondances exactes ou du filtrage, la recherche vectorielle se concentre sur la similarité. L’objectif est de trouver des vecteurs qui sont « proches » les uns des autres selon une métrique de distance (comme la distance euclidienne ou la similarité cosinus). Par exemple, les vecteurs peuvent représenter des mots ou des phrases dans le traitement du langage naturel (NLP), et la recherche vectorielle aide à trouver les mots ou textes les plus similaires sur le plan sémantique. Dans les systèmes de recommandation, la recherche vectorielle identifie les éléments les plus proches des préférences d’un utilisateur. Les recherches vectorielles jouent également un rôle crucial dans la génération augmentée par récupération (RAG), une technique qui augmente la sortie des grands modèles de langage (LLMs) en leur fournissant des informations contextuelles supplémentaires.
Il existe de nombreuses solutions disponibles sur le marché pour effectuer des recherches vectorielles, notamment :
- Bibliothèques de recherche vectorielle telles qu’Annoy et Voyager.
- Bases de données vectorielles spécialement conçues telles que Milvus, Zilliz Cloud (Milvus entièrement géré)
- Bases de données vectorielles légères telles que Chroma et Milvus Lite.
- Bases de données traditionnelles avec des extensions de recherche vectorielle
Qu’est-ce qu’Annoy ? Un aperçu
Annoy (Approximate Nearest Neighbors Oh Yeah) est une bibliothèque open source développée par Spotify, conçue pour une recherche efficace approximative des plus proches voisins (ANN) dans des espaces de grande dimension. Sa fonction principale est de trouver rapidement des éléments similaires à un élément de requête donné, sur la base d’embeddings vectoriels. Annoy est particulièrement utile lorsqu’on travaille avec de grands ensembles de données où les correspondances exactes sont moins importantes que la capacité à trouver rapidement des résultats « assez proches ». En fonction des préférences des utilisateurs, il est souvent utilisé pour créer des moteurs de recommandation qui suggèrent des éléments similaires (comme des chansons, des produits ou des vidéos).
Fonctionnalités et points forts principaux d’Annoy
- Recherche approximative du plus proche voisin : Annoy est connu pour sa rapidité dans l’exécution de recherches approximatives du plus proche voisin (ANN), qui fournissent des résultats « suffisamment proches » sans exiger de correspondances exactes. Cela est particulièrement utile pour les applications traitant des jeux de données massifs où une recherche exacte pourrait être trop lente ou trop gourmande en ressources.
- Indexation basée sur des arbres : Annoy utilise des arbres de projection aléatoire pour indexer les données, ce qui accélère les requêtes de recherche en organisant les données en sous-ensembles plus faciles à gérer.
- Stockage sur disque : L’une des fonctionnalités les plus précieuses d’Annoy est qu’il stocke ses index sur disque. Cela signifie que de grands jeux de données qui ne tiennent pas en mémoire peuvent tout de même être indexés et recherchés efficacement. Le stockage sur disque d’Annoy permet également de partager les index entre différents processus, ce qui contribue à réduire l’utilisation de la mémoire.
- Efficacité mémoire : Annoy est optimisé pour fonctionner efficacement avec la mémoire. Il vous permet de construire l’index en mémoire et de le stocker sur disque, rendant possible la gestion de grands jeux de données même si vous n’avez pas assez de RAM. Cette fonctionnalité est particulièrement utile si la mémoire de votre système constitue une contrainte.
- Index immuables : Une fois qu’un index est construit dans Annoy, il ne peut pas être modifié. Si le jeu de données change, vous devrez reconstruire l’intégralité de l’index. Cela en fait un bon choix pour les jeux de données statiques, où les données ne changent pas fréquemment.
- Requêtes par lots : Vous pouvez exécuter plusieurs requêtes en parallèle, ce qui aide à optimiser davantage le processus de recherche, en particulier pour les applications à haut débit.
- Prise en charge des langages : Annoy est principalement utilisé en Python, mais il est écrit en C++ pour des raisons de performance.
La force d’Annoy réside dans sa simplicité et sa capacité à gérer les recherches de vecteurs en haute dimension avec rapidité et efficacité. Cependant, il sacrifie un certain niveau de précision pour atteindre ces gains de performance.
Qu’est-ce que Voyager ? Un aperçu
Voyager est la plus récente bibliothèque de recherche vectorielle de Spotify, conçue pour remplacer Annoy. Construite au-dessus de hnswlib, Voyager est optimisée pour les cas d’utilisation modernes de recherche du plus proche voisin qui exigent une vitesse et une précision plus élevées, une meilleure efficacité mémoire et une plus grande flexibilité. Elle offre également de solides fonctionnalités prêtes pour la production qui la rendent plus adaptée aux déploiements de niveau entreprise.
Fonctionnalités principales et points forts de Voyager
- Vitesse et précision : Voyager offre plus de 10 fois la vitesse d’Annoy tout en maintenant le même taux de rappel. Il fournit également jusqu’à 50 % de précision en plus pour le même niveau de vitesse, offrant des résultats plus précis sans compromettre les performances.
- Efficacité mémoire : Voyager est très économe en mémoire, utilisant jusqu’à 4 fois moins de mémoire qu’Annoy, grâce à son utilisation de la représentation en virgule flottante 8 bits E4M3. Cela le rend idéal pour les environnements à mémoire limitée.
- Multithreading et évolutivité : Voyager prend en charge la création d’index et les requêtes multithreadées, ce qui le rend hautement évolutif. Que vous construisiez une petite application ou une grande solution d’entreprise, Voyager peut gérer la charge de travail efficacement.
- Prise en charge des langages : Contrairement à de nombreux outils de recherche du plus proche voisin qui ne prennent en charge que Python, Voyager fournit des interfaces identiques pour Python et Java, ce qui le rend plus polyvalent pour différents environnements de développement.
- Tolérant aux pannes et prêt pour la production : Voyager inclut des fichiers d’index tolérants aux pannes avec détection de corruption, garantissant que le système peut gérer des déploiements à grande échelle sans risque de corruption des données.
- Intégration Google Cloud : Voyager offre une prise en charge intégrée des E/S basées sur les flux depuis Google Cloud Services, vous permettant de diffuser des index directement depuis le cloud, ce qui peut simplifier la gestion de grands jeux de données.
Voyager est conçu en pensant à l’utilisation en production, offrant vitesse, précision et efficacité mémoire tout en fournissant une solide prise en charge des langages et une compatibilité avec les infrastructures basées sur le cloud.
Principales différences entre Annoy et Voyager
Méthodologie de recherche
Annoy utilise des arbres de projection aléatoire pour sa recherche approximative des plus proches voisins, privilégiant la vitesse au détriment d’une certaine précision. Cette méthode fonctionne bien lorsque le jeu de données de recherche est volumineux et que vous n’avez pas besoin de résultats parfaits. En revanche, Voyager est basé sur hnswlib, qui emploie l’algorithme Hierarchical Navigable Small World (HNSW). Cette méthode offre une meilleure précision et une meilleure vitesse, surpassant Annoy dans la plupart des cas d’utilisation, en particulier lorsque la précision est importante.
Gestion des données
Annoy est optimisé pour les données non structurées et les recherches de vecteurs en haute dimension. Son approche basée sur des arbres gère efficacement de grands volumes de données, mais elle n’est pas très flexible lorsqu’il s’agit de données structurées ou semi-structurées. Voyager, en revanche, est plus flexible. Bien que les deux gèrent les données vectorielles, la conception de Voyager, en particulier son multithreading et son intégration à Google Cloud, le rend mieux adapté aux environnements de données plus complexes et à grande échelle où plusieurs types de données sont impliqués.
Évolutivité et performances
Les deux outils évoluent bien, mais Voyager offre davantage d’options d’évolutivité grâce à sa prise en charge de la création et de l’interrogation d’index multithreadées. Les fichiers d’index tolérants aux pannes de Voyager et sa compatibilité avec le cloud facilitent également la mise à l’échelle sur des systèmes distribués ou des environnements cloud. Annoy est plus simple à déployer et peut gérer efficacement de grands jeux de données, mais il n’est pas aussi robuste en matière d’évolutivité de niveau entreprise ou d’architectures cloud natives.
Flexibilité et personnalisation
Annoy offre une personnalisation de base, mais son objectif principal est la recherche approximative des plus proches voisins, ce qui limite sa flexibilité pour s’adapter à différents types de données ou méthodologies de recherche. Voyager, à l’inverse, est conçu avec la personnalisation à l’esprit. Les utilisateurs peuvent ajuster finement les performances en fonction de leurs besoins spécifiques, en équilibrant vitesse, précision, latence et coût. Cela fait de Voyager une meilleure option pour les applications qui nécessitent des solutions plus adaptées.
Intégration et écosystème
Annoy est une bibliothèque autonome, avec une prise en charge limitée pour l’intégration dans des écosystèmes plus vastes. Elle fonctionne bien avec les projets basés sur Python, mais ne dispose pas des capacités d’intégration plus larges nécessaires aux environnements d’entreprise. Voyager se distingue ici, en offrant une intégration transparente avec des services basés sur le cloud comme Google Cloud et une prise en charge complète de Java et Python. Cela facilite l’intégration de Voyager dans des pipelines de données plus vastes, des workflows de machine learning et des systèmes d’entreprise.
Facilité d’utilisation
La simplicité d’Annoy est l’une de ses plus grandes forces. Il est facile à configurer et à utiliser, surtout si vous travaillez dans un environnement Python. Cependant, sa portée est relativement limitée. Voyager, en revanche, offre davantage de fonctionnalités et de flexibilité, mais s’accompagne d’une courbe d’apprentissage légèrement plus élevée en raison de ses capacités supplémentaires et de ses options de personnalisation. Le fait que Voyager soit prêt pour la production et inclue une documentation complète pour Python et Java contribue toutefois à faciliter son intégration dans des systèmes plus complexes.
Considérations de coût
Annoy est entièrement open-source et n’entraîne aucun coût de licence. Cependant, les utilisateurs doivent tout de même prendre en compte les coûts d’infrastructure et de mise à l’échelle lorsqu’ils le déploient dans des environnements à grande échelle. Voyager, étant plus récent et plus avancé, peut entraîner des coûts supplémentaires, en particulier si vous utilisez des services gérés comme Google Cloud pour héberger ses index. Cela dit, l’efficacité mémoire de Voyager et sa capacité à gérer de grands jeux de données à grande échelle peuvent se traduire par des économies au fil du temps, surtout pour les applications de niveau entreprise.
Fonctionnalités de sécurité
Annoy n’est pas fourni avec des fonctionnalités de sécurité intégrées. Les utilisateurs devraient implémenter séparément le chiffrement, l’authentification et le contrôle d’accès si nécessaire. Voyager, étant conçu pour les environnements de production, offre une meilleure prise en charge des fichiers d’index tolérants aux pannes et de la détection de corruption, mais les fonctionnalités de sécurité comme le chiffrement et le contrôle d’accès devraient tout de même être implémentées en dehors de l’outil lui-même.
Quand choisir Annoy
Annoy est un excellent choix si :
- Vous travaillez sur un projet à plus petite échelle où la recherche approximative des plus proches voisins est suffisante.
- Votre application n’a pas besoin de gérer des données structurées ou semi-structurées.
- Vous privilégiez la vitesse plutôt que la précision, et la précision des résultats de recherche est moins critique.
- Vous êtes limité par les ressources mémoire mais devez gérer efficacement de grands ensembles de données.
- Votre équipe préfère un outil léger et facile à utiliser avec une configuration minimale.
Quand choisir Voyager
Voyager est le meilleur choix si :
- Vous exigez un haut niveau de précision et avez besoin de résultats précis pour vos recherches des plus proches voisins.
- Votre application gère des données structurées, semi-structurées et non structurées, et vous avez besoin de plus de flexibilité.
- Vous travaillez dans un environnement cloud à grande échelle et avez besoin d’une intégration avec des services cloud comme Google Cloud.
- Votre projet doit équilibrer vitesse, précision et coût, avec la possibilité de personnaliser les algorithmes de recherche et la gestion des données.
- Vous avez besoin d’une solution prête pour la production avec une prise en charge solide de Python et Java ainsi que des fonctionnalités robustes de tolérance aux pannes.
Comparaison des bibliothèques de recherche vectorielle et des bases de données vectorielles spécialisées
Les bibliothèques de recherche vectorielle comme Annoy et Voyager et les bases de données vectorielles spécialisées comme Milvus visent toutes deux à résoudre le problème de la recherche de similarité pour des données vectorielles de grande dimension, mais elles remplissent des rôles différents.
Les bibliothèques de recherche vectorielle se concentrent uniquement sur la tâche de recherche efficace des plus proches voisins. Elles offrent des solutions légères et rapides pour trouver des vecteurs similaires à un vecteur de requête. Elles sont souvent utilisées dans des environnements plus petits, à nœud unique, ou pour des applications avec des ensembles de données statiques ou de taille modérée. Cependant, elles manquent généralement de fonctionnalités pour gérer des données dynamiques, assurer la persistance ou évoluer sur des systèmes distribués. Les développeurs utilisant ces bibliothèques doivent généralement gérer manuellement la gestion des données, les mises à jour et la mise à l’échelle.
En revanche, les bases de données vectorielles spécialisées comme Milvus et Zilliz Cloud (le Milvus managé) sont des systèmes complets conçus pour la gestion de données vectorielles à grande échelle. Ces bases de données vont au-delà de la simple recherche vectorielle, en offrant des fonctionnalités telles que le stockage persistant, les mises à jour en temps réel, une architecture distribuée et des capacités de requête avancées. Elles prennent en charge des ensembles de données dynamiques et peuvent facilement gérer des applications en temps réel où les données sont fréquemment mises à jour. De plus, les bases de données vectorielles incluent souvent une prise en charge intégrée pour combiner les recherches vectorielles avec le filtrage traditionnel et les requêtes de métadonnées, ce qui les rend idéales pour les environnements de production nécessitant évolutivité, haute disponibilité et fonctionnalités de recherche plus complexes.
- Découvrez les dernières nouvelles fonctionnalités et améliorations de Zilliz Cloud : Mise à jour de Zilliz Cloud : services de migration, connecteurs Fivetran, multi-réplicas, et plus encore
Quand choisir chaque solution de recherche vectorielle
Choisissez les bibliothèques de recherche vectorielle si :
- Vous disposez d’un ensemble de données petit à moyen, relativement statique.
- Vous préférez un contrôle total sur les algorithmes d’indexation et de recherche.
- Vous intégrez la recherche dans un système existant et pouvez gérer l’infrastructure.
Choisissez les bases de données vectorielles spécialisées si :
- Vous devez passer à l’échelle de milliards de vecteurs sur des systèmes distribués.
- Votre jeu de données change fréquemment, nécessitant des mises à jour en temps réel.
- Vous préférez des solutions managées qui gèrent pour vous le stockage, la mise à l’échelle et les optimisations de requêtes.
En résumé, les bibliothèques de recherche vectorielle conviennent mieux aux cas d’utilisation plus simples et à plus petite échelle, où la vitesse et l’efficacité mémoire sont prioritaires, mais où la complexité opérationnelle est minimale. Les bases de données vectorielles spécialement conçues, en revanche, sont conçues pour des systèmes à grande échelle et de niveau production qui exigent une gestion dynamique des données, une scalabilité et une facilité d’utilisation, offrant souvent des avantages opérationnels significatifs aux développeurs qui gèrent des applications complexes.
Évaluer et comparer toutes les solutions de recherche vectorielle
OK, maintenant nous avons appris la différence entre les différentes solutions de recherche vectorielle. Les questions suivantes sont : comment vous assurer que votre algorithme de recherche renvoie des résultats précis et le fait à une vitesse fulgurante ? Comment évaluer l’efficacité de différents algorithmes ANN, en particulier à grande échelle ?
Pour répondre à ces questions, nous avons besoin d’un outil de benchmarking. De nombreux outils de ce type sont disponibles, et deux se distinguent comme les plus efficaces : ANN benchmarks et VectorDBBench.
ANN benchmarks
ANN Benchmarks (Approximate Nearest Neighbor Benchmarks) est un projet open source conçu pour évaluer et comparer les performances de divers algorithmes de plus proches voisins approximatifs (ANN). Il fournit un cadre standardisé pour benchmarker différents algorithmes sur des tâches telles que la recherche vectorielle en haute dimension, permettant aux développeurs et aux chercheurs de mesurer des métriques comme la vitesse de recherche, la précision et l’utilisation de la mémoire sur divers jeux de données. En utilisant ANN-Benchmarks, vous pouvez évaluer les compromis entre vitesse et précision pour des algorithmes comme ceux que l’on trouve dans des bibliothèques telles que Faiss, Annoy, HNSWlib et d’autres, ce qui en fait un outil précieux pour comprendre quels algorithmes fonctionnent le mieux pour des applications spécifiques.
Dépôt GitHub ANN Benchmarks : https://github.com/erikbern/ann-benchmarks
Site Web ANN Benchmarks : https://ann-benchmarks.com/
VectorDBBench : un outil de benchmarking open source
VectorDBBench est un outil de benchmarking open source conçu pour les utilisateurs qui ont besoin de systèmes de stockage et de récupération de données haute performance, en particulier de bases de données vectorielles. Cet outil permet aux utilisateurs de tester et de comparer les performances de différents systèmes de bases de données vectorielles tels que Milvus et Zilliz Cloud (le Milvus managé) à l’aide de leurs propres jeux de données, et de déterminer celui qui convient le mieux à leurs cas d’utilisation. VectorDBBench est écrit en Python et sous licence open source MIT, ce qui signifie que chacun peut librement l’utiliser, le modifier et le distribuer.
Dépôt GitHub VectorDBBench : https://github.com/zilliztech/VectorDBBench
Jetez un coup d’œil rapide aux performances des bases de données vectorielles grand public sur le classement VectorDBBench.
Techniques et perspectives sur l’évaluation de VectorDB :
Ressources supplémentaires sur VectorDB, GenAI et ML
Continuer à lire

Top 10 Context Engineering Techniques You Should Know for Production RAG
A practical guide to context engineering for production LLM systems, covering RAG, context processing, memory, agents, and multimodal context.

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

Zilliz Cloud Update: Tiered Storage, Business Critical Plan, Cross-Region Backup, and Pricing Changes
This release offers a rebuilt tiered storage with lower costs, a new Business Critical plan for enhanced security, and pricing updates, among other features.
The Definitive Guide to Choosing a Vector Database
Overwhelmed by all the options? Learn key features to look for & how to evaluate with your own data. Choose with confidence.


