Bases de données vectorielles : guide technique d’introduction [PDF]
(tge-data-web.nyc3.digitaloceanspaces.com)- Alors que les applications d’IA traitent des données non structurées et de grande dimension, les bases de données vectorielles gagnent en importance en tant que systèmes spécialisés pour stocker et rechercher des données sous forme de tableaux de nombres
- Le principe central consiste à relier les enregistrements selon la similarité entre les attributs des données, plutôt que selon des lignes, des colonnes ou des relations explicites, afin d’exploiter le sens implicite
- En encodant les relations sémantiques sous forme de vecteurs multidimensionnels, il devient possible d’exécuter plus rapidement des tâches d’analyse comme la recherche par similarité, le clustering et la classification
- Dans l’IA générative, elles servent à gérer de grands volumes de données de grande dimension et à améliorer la vitesse de l’apprentissage et de l’inférence, ainsi que la personnalisation des résultats, grâce à la recherche de vecteurs similaires
- L’indexation avancée réduit l’espace de recherche à des sous-ensembles très pertinents, diminue le temps de recherche et permet des requêtes complexes combinant similarité et autres conditions
Types de données traités par les bases de données vectorielles
- Une base de données vectorielle est une base de données spécialisée conçue pour stocker, gérer et traiter des vecteurs, qui sont des représentations de données de grande dimension
- Contrairement aux bases de données traditionnelles, qui stockent les données dans des lignes et des colonnes, les bases de données vectorielles stockent les données sous forme de vecteurs dans un espace multidimensionnel
- Chaque vecteur est un tableau de nombres représentant les caractéristiques ou attributs d’un point de données
Connexions fondées sur le sens et la similarité
- Les bases de données traditionnelles établissent les relations entre éléments à partir de liens explicites ou de hiérarchies
- Les bases de données vectorielles relient algorithmiquement les enregistrements selon la similarité des attributs des données
- Cette approche permet de créer des connexions plus intuitives, fondées sur le sens implicite contenu dans les éléments de la base de données
Une structure adaptée aux requêtes analytiques
- Lorsque les données sont encodées sous forme de vecteurs multidimensionnels — autrement dit de tableaux de nombres — reflétant les relations sémantiques, des tâches d’analyse avancées peuvent être exécutées rapidement
- Les opérations prises en charge incluent la recherche par similarité, le clustering et la classification
- Le modèle de calcul convient à la détection de motifs, à l’analyse prédictive et aux applications ayant de fortes exigences analytiques
Usages dans l’IA et l’IA générative
- L’essor de l’IA et du machine learning est l’un des principaux facteurs de la demande croissante en bases de données vectorielles
- Dans le domaine de l’IA générative, les bases de données vectorielles sont conçues pour stocker et gérer efficacement de grands volumes de données de grande dimension
- Elles permettent de rechercher et de récupérer rapidement des vecteurs similaires, ce qui peut accélérer considérablement les processus d’apprentissage et d’inférence des modèles d’IA générative
- Elles sont aussi utilisées pour aider les systèmes d’IA générative à fournir aux utilisateurs des contenus plus personnalisés et plus pertinents
Indexation et critères de recherche complexes
- Les bases de données vectorielles utilisent des techniques d’indexation avancées pour consulter et rechercher rapidement des vecteurs similaires
- Les index réduisent fortement le temps de recherche en limitant l’espace de recherche à des sous-ensembles de vecteurs plus petits et plus pertinents
- Elles peuvent également traiter des requêtes complexes combinant des conditions de similarité avec d’autres critères de recherche
- Cette flexibilité est importante pour les applications d’IA avancées qui nécessitent des fonctions de recherche sophistiquées
1 commentaires
Avis sur Hacker News
A Comprehensive Survey on Vector Database: Storage and Retrieval Technique, Challenge : https://arxiv.org/abs/2310.11703
Survey of Vector Database Management Systems : https://arxiv.org/abs/2310.14021
What are Embeddings : https://raw.githubusercontent.com/veekaybee/what_are_embeddi...
Attribution : https://twitter.com/eatonphil/status/1745524630624862314 et https://twitter.com/ChristophMolnar/status/17457316026829826...
Il existe aussi sous forme de présentation annotée et de vidéo de 38 minutes optionnelle
Article Wikipedia : https://en.wikipedia.org/wiki/Vector_database
Vector Database 101 : https://zilliz.com/learn/introduction-to-unstructured-data
Plus proches voisins approximatifs et recherche de similarité : https://vinija.ai/concepts/ann-similarity-search/
Bases de données distribuées : https://15445.courses.cs.cmu.edu/fall2021/notes/21-distribut...
C’est aussi un point qui m’intéressait, donc j’aimerais bien avoir des critères ou des règles empiriques
J’ai récemment manipulé des embeddings avec l’excellent outil
llmde Simon Willison, et son approche est la plus simple qui soit : stocker les embeddings dans SQLite, avec quelques UDF pour calculer les distancesCette simplicité est séduisante, mais au-delà d’un certain niveau de trafic et de volume de données, il faudra sans doute une base de données plus spécialisée ; j’aimerais savoir à peu près où se situe cette limite
Pour la recherche, je faisais le plus simple possible : tout parcourir et comparer avec la distance de Hamming (
xoretpopcount) ; sur un seul cœur d’un MBP de 2011, je pouvais scanner 200 000 hachages en moins de 10 ms pour trouver l’élément le plus procheIl faisait environ 1 000 lignes de code, donc au final nous n’avions pas besoin d’une base de données vectorielle externe
Mais au-delà, les options utilisables comme Pinecone deviennent complexes, lentes et absurdement chères
À ma connaissance, le meilleur choix est turbopuffer.com : environ 100 fois moins cher que Pinecone, et il semble réellement passer à l’échelle
Comme il ne figure pas dans la liste des bases vectorielles recommandées dans les slides, je le mentionne comme une bonne recommandation
https://news.ycombinator.com/item?id=38703943
Ce cours mélange théorie et démos autour des concepts de base des vecteurs, des bases de données vectorielles, des index et de la recherche de similarité, et se termine par des démonstrations des bases Pinecone et Weaviate
À cette étape, le jugement humain intervient de façon très subtile, parfois presque imperceptible, alors que l’ensemble donne en surface l’impression d’un système très automatisé, « juste des maths »
Prenons l’audio : quelles caractéristiques extraire pour construire un vecteur à N dimensions ? La réponse facile pourrait être « autant que possible »
Mais d’abord, même des caractéristiques faciles à nommer peuvent ne pas être accessibles dans les données de caractérisation
Ensuite, sans une connaissance approfondie du domaine, on peut même ignorer l’existence de caractéristiques latentes qu’il faudrait utiliser
Enfin, même avec une connaissance approfondie du domaine, on peut encore ignorer quelles caractéristiques latentes il faudrait exploiter
Supposons par exemple que l’on soit fan de musique minimaliste à déphasage à la Reich. On interroge indirectement une base de données vectorielle pour trouver de la musique similaire à une œuvre emblématique du genre, par exemple Piano Phase
La base utilise diverses caractéristiques audio et musicales : fréquences dominantes, intervalles entre attaques de notes, volume, caractéristiques de timbre fondées sur la distribution des fréquences, fondamentale apparente et gamme, etc.
Mais si l’ensemble de caractéristiques de la base de données ne contient pas « l’intervalle entre les notes reste constant dans le temps », la requête pourra trouver des choses similaires en timbre, harmonie, mélodie ou rythme, mais trouver des morceaux qui partagent la caractéristique essentielle — le fait que la phase relative des deux lignes mélodiques change de manière régulière — relèvera entièrement de la chance
Il n’est pas difficile de construire des exemples similaires avec n’importe quel type de données : visuelles, textuelles, numériques, etc.
Bien sûr, cela ne veut pas dire que les bases de données vectorielles et la classification de caractéristiques sont inutiles
Quand on trouve, ou ne trouve pas, un motif correspondant dans un jeu de données donné, l’une des premières questions à se poser est de savoir si l’exhaustivité de l’ensemble de caractéristiques est fortement garantie, et sinon, comment l’étendre
Les bases de données vectorielles sont orientées recherche et récupération des résultats
En général, la façon de produire les vecteurs consiste à affiner un grand modèle préentraîné et à en extraire les représentations internes
Comme le jeu de données contient des requêtes réussies et les résultats récupérés, il suffit d’utiliser les entrées brutes pour optimiser une fonction de perte en fonction de l’objectif de similarité pris en charge par la base vectorielle
Pour les modalités courantes comme les tableaux, le texte, les images ou l’audio, le choix des caractéristiques fait très peu intervenir le jugement humain : il suffit d’appliquer de l’attention
À noter que les modèles texte-vers-vecteur récents comme E5-Mistral ne nécessitent même pas de curation humaine du jeu de données
C’est un bon point sur le fait qu’on « ne sait pas ce qu’on ne sait pas »
Content de croiser un autre amateur de Steve Reich, et je serais curieux d’avoir des recommandations de morceaux proches de mon Music for 18 Musicians préféré
C’est un excellent aperçu, mais la dernière section n’aborde pas la question évidente du choix entre un stockage vectoriel comme Postgres+pgvector et une base de données vectorielle comme Pinecone
J’aimerais voir davantage de présentations discutant des différents compromis — vitesse des requêtes, vitesse d’insertion et de construction des index, facilité d’utilisation, etc. — pour aider à choisir selon chaque application
Les PR sont toujours les bienvenues
Une base de données, c’est un stockage auquel on a ajouté toutes sortes de fonctionnalités
digitaloceanspaces.com étant un fournisseur d’hébergement de style S3, ce serait bien que Hacker News le traite spécialement et affiche quelque chose comme tge-data-web.nyc3.digitaloceanspaces.com au lieu de simplifier le domaine en digitaloceanspaces.com
Cela dit, S3 semble avoir le même problème : https://news.ycombinator.com/item?id=38876761
Il existe des précédents ailleurs. Les sites en sous-domaine x.github.io sont traités spécialement ici : https://news.ycombinator.com/from?site=lfranke.github.io
Ce document me paraît assez dangereux comme point de départ pour un ingénieur
Les formulations selon lesquelles les données seraient regroupées par sémantique, ou optimisées pour l’analytique, me semblent discutables
Le clustering dépend des embeddings que l’on a calculés. Si l’on croit que les embeddings approchent bien le sens des données, on peut éventuellement raisonner ainsi
Mais il est facile d’imaginer des embeddings qui cassent cette idée. Par exemple, si l’on fait passer un fichier audio et un fichier texte ayant le même sens dans le même processus d’embedding, s’il n’est pas multimodal, ils risquent fort d’être éloignés dans l’espace des vecteurs d’embedding
À l’avenir, je pense qu’on verra certainement apparaître des embeddings qui placent les éléments proches dans l’espace vectoriel non pas selon leur similarité sémantique, mais selon leur mode d’utilisation
Si vous construisez un système de recommandation, vous ne voulez pas forcément regrouper de près plusieurs variantes d’un achat ponctuel
Par exemple, les vols les plus proches sémantiquement seraient d’autres vols vers la même destination à des horaires différents, ou vers des aéroports proches, mais en pratique vous pourriez vouloir les regrouper avec les hôtels que les personnes ayant acheté ces vols achètent souvent aussi
Une base de données vectorielle peut aussi intégrer dans les données des dimensions supplémentaires, comme la prise en compte du temps. Rien n’oblige à utiliser des vecteurs qui encodent le sens
Les bases de données vectorielles sont donc optimisées pour la consultation ou la recherche à partir de vecteurs d’entrée, et ne ressemblent pas aux requêtes OLAP
Elles sont plus proches d’Elasticsearch que de Snowflake. Si vous utilisez une base de données vectorielle en espérant faire du reporting ou de l’analyse à grande échelle sur l’espace vectoriel, à ma connaissance il n’existe pas aujourd’hui de produit vraiment utilisable pour cela
Je comprends qu’on passe d’une photo de pomme à un vecteur représentant son « caractère de pomme », puis qu’on compare ce vecteur à d’autres avec des mathématiques classiques
Ce que je ne comprends pas, c’est qui ou quoi prend l’image en entrée et produit le vecteur en sortie
Même chose pour les documents. Si je veux ajouter une dimension en ajoutant simplement un nombre de plus au tableau, quelle partie de la base de données vectorielle dois-je modifier pour que cette dimension soit incluse dans le calcul vectoriel ?
Ou bien le processus qui transforme documents, images ou autre en représentation vectorielle se fait-il d’une autre manière, en dehors de la base de données ?
Modification : le calcul des embeddings ressemble à une tâche pour un algorithme de machine learning, mais alors cet algorithme doit lui aussi être entraîné au préalable. On finit donc par une chaîne d’entraînement sans fin
Je ne comprends pas pourquoi PQ est listé comme « stratégie d’indexation »
PQ est une technique de compression et de quantification des vecteurs, pas un moyen de partitionner l’espace de recherche
On peut encoder les vecteurs avec PQ dans une recherche exhaustive / un index plat, un index IVF ou HNSW, et Faiss les fournit respectivement sous les noms IndexPQ, IndexIVFPQ et IndexHNSWPQ
Si on le souhaite, on peut aussi l’utiliser avec un arbre k-D ou ANNOY
L’affirmation selon laquelle « quand la vitesse des requêtes est plus importante que la précision, utilisez HNSW ou Annoy pour les très grands jeux de données » pose également problème
Les méthodes fondées sur des graphes ont un surcoût mémoire et un coût de construction élevés, et ne sont pas pratiques pour des jeux de données à l’échelle du milliard
Elles sont généralement plus précises et plus rapides que les méthodes IVF, mais c’est parce qu’IVF doit visiter de nombreuses cellules pour obtenir une précision comparable
En revanche, contrairement à d’autres techniques, IVF peut monter jusqu’à des bases de données à l’échelle du billion sans gros surcoût, tout en offrant un compromis raisonnable entre vitesse et précision
Je dirais plutôt : « à utiliser pour des jeux de données de taille intermédiaire où la vitesse des requêtes est importante, où l’on veut aussi une grande précision, et où un index plat/exhaustif est irréaliste »
On applique d’abord PQ, puis on effectue KNN sur les nouveaux vecteurs discrets
Cela permet de compresser l’espace de vocabulaire à une taille fixe
Dans le tableau de la diapositive 15, les cases Indexing & Search Efficiency de Traditional Databases et Vector Databases semblent avoir été interverties
Existe-t-il des recommandations pour une base de données d’embeddings embarquée, comme SQLite ?
Ce serait pour de petits problèmes, mais ce serait bien que ce soit plus pratique que LMDB + FAISS
Il peut s’exécuter dans un processus Python, stocke le contenu dans SQLite et prend en charge le stockage des vecteurs d’embedding dans des formats d’index vectoriel locaux (Faiss, HNSW, Annoy)
Pour info, je suis l’auteur principal de txtai
https://github.com/patricktrainer/hackernews-comment-search
llmde Simon Willison n’utilise que SQLite et quelques UDFCette simplicité est séduisante, mais je ne vois pas bien quand ni pourquoi cela cesse d’être suffisant
Pour Go, j’ai récemment commencé à créer chromem-go, inspiré de l’interface de Chroma : https://github.com/philippgille/chromem-go
Il n’a pas encore de fonctionnalités avancées et n’est pas destiné aux usages à grande échelle, mais les démos RAG fonctionnent
[1] https://github.com/chroma-core/chroma