Ce projet est un tutoriel pratique pour comprendre comment stocker et interroger des données dans une base vectorielle Qdrant, en mettant l'accent sur l'importance du choix des modèles d'embedding et leurs dimensions.
- Comprendre le fonctionnement d'une base de données vectorielle (Qdrant)
- Apprendre à utiliser différents modèles d'embedding selon les besoins
- Maîtriser l'importance de la dimension des vecteurs dans les collections
- Implémenter une recherche sémantique simple avec TypeScript
Les bases de données vectorielles comme Qdrant permettent de stocker des données sous forme de vecteurs et d'effectuer des recherches par similarité. Contrairement aux bases de données traditionnelles qui recherchent des correspondances exactes, les bases vectorielles trouvent les éléments les plus "proches" sémantiquement.
Les modèles d'embedding transforment du texte en vecteurs numériques qui capturent le sens sémantique. Ce projet utilise deux modèles différents de HuggingFace :
- sentence-transformers/bert-base-nli-mean-tokens : Génère des vecteurs de dimension 768
- sentence-transformers/all-MiniLM-L6-v2 : Génère des vecteurs de dimension 384
La dimension des vecteurs est cruciale pour plusieurs raisons :
- Elle doit correspondre exactement à celle définie dans la collection Qdrant
- Les dimensions plus élevées peuvent capturer plus de nuances sémantiques
- Les dimensions plus faibles sont plus efficaces en termes de stockage et de vitesse de recherche
quick-rag/
├── src/
│ ├── index.ts # Point d'entrée principal
│ ├── qdrantService.ts # Service pour l'interaction avec Qdrant
│ └── bot.ts # Logique de recherche et démonstration
├── .env # Configuration (URL Qdrant, clés API)
├── .env.exemple # Exemple de configuration
├── package.json # Dépendances
└── tsconfig.json # Configuration TypeScript
- Node.js (16+)
- npm ou yarn
- Une instance Qdrant (cloud ou locale) avec la doc Qdrant en collection
- Accès aux modèles HuggingFace
- Clonez ce dépôt
- Installez les dépendances :
npm install
- Configurez votre fichier
.env
en vous basant sur.env.exemple
:QDRANT_URL="votre_url_qdrant" QDRANT_API_KEY="votre_clé_api"
Ce service gère l'interaction avec la base de données Qdrant :
- Création de collections avec une dimension spécifique
- Chargement de données depuis un fichier CSV
- Conversion des données en vecteurs et stockage dans Qdrant
// Exemple de création d'une collection
await this.client.createCollection(this.collectionName, {
vectors: { size: dimension, distance: "Cosine" }
});
Le fichier bot.ts
montre comment utiliser différents modèles d'embedding selon la collection :
// Sélection du modèle selon la collection
const embedding = await new HuggingFaceEmbedding({
modelType: collectionName === "salim_embeddings"
? "sentence-transformers/bert-base-nli-mean-tokens" // 768 dimensions
: "sentence-transformers/all-MiniLM-L6-v2", // 384 dimensions
quantized: false,
}).getTextEmbedding(query);
Le projet démontre comment effectuer une recherche sémantique dans Qdrant :
- Conversion de la requête en vecteur avec le même modèle que la collection
- Recherche des vecteurs les plus similaires dans Qdrant
- Affichage des résultats avec leur score de similarité
Le projet inclut deux collections d'exemple :
salim_embeddings
: Utilise des vecteurs de 768 dimensions (BERT)qdrant-doc
: Utilise des vecteurs de 384 dimensions (MiniLM)
Pour chaque collection, une requête différente est utilisée pour démontrer la recherche sémantique.
npm run dev
Cette commande :
- Initialise la connexion à Qdrant
- Crée la collection si elle n'existe pas déjà
- Charge les données depuis le CSV (si nécessaire)
- Exécute une requête de démonstration
- Affiche les résultats au format JSON
Les résultats montrent :
- Le score de similarité (en pourcentage)
- Le texte correspondant
- Des métadonnées supplémentaires (si disponibles)
Plus le score est élevé, plus le résultat est sémantiquement proche de la requête.
Pour tester différentes configurations :
- Modifiez la variable
collectionName
dansbot.ts
- Le modèle d'embedding approprié sera automatiquement sélectionné
- Assurez-vous que la dimension correspond à celle définie dans la collection
- Les dimensions des vecteurs doivent correspondre exactement entre le modèle et la collection
- Les performances de recherche dépendent de la qualité du modèle d'embedding
- Différents modèles peuvent donner des résultats très différents pour la même requête
- Implémenter un système RAG complet avec génération de réponses
- Ajouter plus de modèles d'embedding pour comparaison
- Intégrer des mécanismes de filtrage par métadonnées
- Créer une interface utilisateur pour tester différentes requêtes
Ce tutoriel vous a montré l'importance du choix des modèles d'embedding et de leurs dimensions dans le contexte des bases de données vectorielles. En comprenant ces concepts, vous pouvez construire des systèmes de recherche sémantique plus efficaces et plus précis.