Réponse courte
Une base de données vectorielle stocke des plongements (*embeddings*), ces listes de nombres qui représentent le sens d’un texte ou d’une image, et trouve rapidement les éléments stockés dont les nombres sont les plus proches d’une requête. Vous en avez besoin quand vous avez une collection grande ou croissante à fouiller par le sens; pour quelques centaines de documents, un simple fichier et une courte boucle suffisent souvent.
Question de suivi En quoi Pinecone, Chroma et pgvector diffèrent-ils?
Si vous avez essayé ce printemps de construire une application pour « clavarder avec vos documents », vous êtes tombé en quelques minutes sur l’expression base de données vectorielle. Les tutoriels associent ChatGPT à des noms comme Pinecone, Chroma et pgvector comme s’ils étaient obligatoires. Ils sont utiles, mais ils n’ont rien de magique, et bien des petits projets peuvent s’en passer complètement.
L’idée part des plongements. Un modèle de plongement transforme un morceau de texte en une longue liste de nombres, un vecteur, de sorte que des textes au sens semblable se retrouvent avec des nombres semblables. Une base de données vectorielle est un logiciel conçu pour stocker ces vecteurs et répondre vite à une seule question : quels vecteurs stockés sont les plus proches de ce nouveau vecteur?
Comment fonctionne la recherche par similarité
Les bases de données ordinaires excellent dans les correspondances exactes : trouver la commande numéro 4471, ou tous les clients au Québec. Une recherche par mots-clés trouve les documents qui contiennent les mots tapés. Chercher par le sens, c’est autre chose. Un client qui demande « Je n’arrive pas à accéder à mon compte » devrait trouver l’article d’aide intitulé « Réinitialiser votre mot de passe », même s’ils n’ont aucun mot en commun.
Voici le processus, étape par étape.
- Découpez vos documents en morceaux, comme des paragraphes ou des articles d’aide.
- Calculez le plongement de chaque morceau avec un modèle de plongement et stockez ensemble le vecteur, le texte original et toute étiquette (appelée métadonnée).
- Calculez le plongement de la question avec le même modèle.
- Comparez le vecteur de la question avec ceux qui sont stockés et renvoyez les quelques plus proches.
- Transmettez ces morceaux à un modèle de langage comme contexte, pour qu’il réponde à partir de votre matériel. On appelle souvent ce modèle la génération augmentée par récupération (retrieval-augmented generation), ou RAG.
La proximité se mesure à l’aide d’une formule. Les choix courants sont la distance euclidienne (la distance en ligne droite), la similarité cosinus (si deux vecteurs pointent dans la même direction) et le produit scalaire.
Un exemple concret avec de tout petits vecteurs
Les vrais plongements comptent des centaines ou des milliers de nombres. Pour saisir l’idée, imaginez un plongement qui n’en compte que trois. Les vecteurs ci-dessous sont inventés pour l’illustration.
| Article d’aide | Vecteur | Similarité cosinus avec la question |
|---|---|---|
| A. Comment réinitialiser mon mot de passe? | [0.8, 0.2, 0.1] | 0,99 |
| B. Heures d’ouverture du magasin | [0.1, 0.9, 0.1] | 0,24 |
| C. Changer votre adresse courriel de connexion | [0.7, 0.1, 0.4] | 0,96 |
| D. Notre politique de remboursement | [0.1, 0.2, 0.9] | 0,34 |
La question « Je n’arrive pas à accéder à mon compte » devient [0.9, 0.1, 0.2]. La similarité cosinus va de −1 à 1, et plus elle est élevée, plus le sens est proche. Les articles A et C arrivent en tête, ce qu’une personne aurait aussi choisi. B et D traînent loin derrière.
Avec quatre articles, comparer la question à chacun est instantané. Avec dix millions, vérifier chaque vecteur prend trop de temps; les bases de données vectorielles construisent donc un index pour la recherche approximative des plus proches voisins (approximate nearest neighbor, ANN). Un index ANN trouve des correspondances très proches sans comparer chaque élément, en acceptant une petite chance de manquer la meilleure correspondance exacte en échange d’une bien plus grande vitesse.
En avez-vous vraiment besoin?
Posez-vous trois questions.
- Combien de morceaux? Pour quelques centaines ou quelques milliers, vous pouvez garder les vecteurs dans un fichier, les charger en mémoire et les comparer tous avec une courte boucle ou une bibliothèque comme NumPy. C’est exact, gratuit et facile à examiner.
- La collection change-t-elle souvent? Si des utilisateurs ajoutent des documents toute la journée, une base de données qui gère l’ajout, la mise à jour et la suppression de vecteurs vous évite de reconstruire un fichier.
- Avez-vous besoin de filtres? Des questions comme « cherche seulement dans les manuels en français de 2022 » exigent un filtrage par métadonnées en plus de la similarité, ce que fournissent les bases de données vectorielles.
Si les trois réponses sont modestes, commencez avec un fichier. Vous pourrez passer à une base de données plus tard sans changer vos plongements, puisque les vecteurs ne sont que des nombres.
À essayer : prenez dix courts paragraphes de vos propres notes et écrivez pour chacun une question d’une ligne à laquelle il devrait répondre. Calculez leurs plongements avec n’importe quelle API de plongement, stockez les vecteurs dans un fichier JSON et vérifiez si la meilleure correspondance de chaque question est bien le paragraphe attendu. Notez les ratés avant d’ajouter quelque base de données que ce soit.
En quoi Pinecone, Chroma et pgvector diffèrent-ils?
Ils règlent le même problème par trois chemins différents.
| Pinecone | Chroma | pgvector | |
|---|---|---|---|
| Ce que c’est | Un service géré de base de données vectorielle | Une base de données de plongements à code source ouvert | Une extension à code source ouvert pour Postgres |
| Où il fonctionne | Dans le nuage de Pinecone, utilisé par une API | Dans votre application Python ou JavaScript, ou comme serveur | Dans une base de données Postgres que vous avez déjà |
| Comment l’interroger | Appels d’API | Quatre fonctions de base : client, collection, ajout, requête | Du SQL ordinaire, trié par distance |
| Plongements | Vous les fournissez | Peut les créer pour vous ou accepter les vôtres | Vous les fournissez |
| Idéal pour | Les grands systèmes en production sans équipe de bases de données | Les prototypes et les applications créées avec LangChain ou LlamaIndex | Les équipes qui utilisent déjà Postgres |
Pinecone est un service hébergé : vous envoyez vecteurs et requêtes par une API, et Pinecone s’occupe de l’indexation, de la répartition sur plusieurs machines et des copies pour la fiabilité. Vous ne gérez aucun serveur, mais vos données sont chez un tiers et, au-delà de l’inscription gratuite, vous payez pour la capacité.
Chroma est gratuit sous licence Apache 2.0 et s’installe avec une seule commande pip install chromadb. Il peut fonctionner entièrement en mémoire pour des essais rapides. Par défaut, il calcule pour vous les plongements du texte avec un modèle Sentence Transformers, ou vous pouvez brancher les plongements d’OpenAI ou de Cohere.
pgvector ajoute un type de colonne vector à Postgres. Vous stockez les plongements à côté de vos autres données et trouvez les voisins avec une requête normale triée par distance. Il fait une recherche exacte par défaut; ajouter un index ivfflat fait passer à une recherche approximative plus rapide. Si votre application fonctionne déjà sur Postgres, c’est souvent le plus petit pas à franchir : aucun nouveau système à apprendre ni à payer.
Sources
- What is a Vector Database? — Pinecone, 27 mars 2023
- Chroma - the open-source embedding database (README) — Chroma (chroma-core) on GitHub, 7 avril 2023
- pgvector: Open-source vector similarity search for Postgres (README) — pgvector project on GitHub, 5 mai 2023