Cours
L'indexation vectorielle est devenue un outil puissant pour la création d'applications modernes. Il vous permet d'effectuerdes recherches de similarité d' s rapides et efficaces sur des données à haute dimension, souvent appelées incrustations vectorielles. Cette fonctionnalité est désormais intégrée de manière transparente dans MongoDB, permettant aux développeurs de créer des fonctionnalités sophistiquées directement dans leurs bases de données.
Cet article est un guide pratique pour configurer et utiliser l'indexation vectorielle dans MongoDB. Nous allons vous guider étape par étape tout au long du processus, depuis la création de votre premier index jusqu'à l'exécution de requêtes complexes. Vous découvrirez également les meilleures pratiques et explorerez un exemple concret de création d'un système de recommandation de produits pour une boutique en ligne.
Qu'est-ce que l'indexation vectorielle ?
À la base, l'indexation vectorielle est une technique permettant d'organiser les plongements vectoriels afin d'accélérer les recherches par similarité. Contrairement aux index traditionnels qui fonctionnent sur des valeurs scalaires (telles que des nombres ou des chaînes de caractères), un index vectoriel est optimisé pour trouver des vecteurs « voisins » dans un espace multidimensionnel.
Les plongées vectorielles sont des représentations numériques de données complexes, notamment du texte, des images et de l'audio. Par exemple, une description de produit peut être convertie en un vecteur où les produits similaires ont des vecteurs plus proches les uns des autres dans l'espace. Cette proximité permet des applications performantes telles que :
- Recherche sémantique : Recherche de produits en fonction de la signification d'une requête, et non pas uniquement en fonction de mots-clés correspondants.
- Systèmes de recommandation : Proposer des produits ou du contenu aux utilisateurs en fonction de leurs préférences.
- Reconnaissance d'image : Identification d'images similaires à partir d'une vaste base de données.
Configuration de l'indexation vectorielle dans MongoDB
Pour commencer, vous aurez besoin d'un cluster MongoDB Atlas. La recherche vectorielle est une fonctionnalité native du cloud. Vous pouvez tester cette fonctionnalité soit sur MongoDB Atlas, soit sur l'édition communautaire gratuite. Community Edition. Dans cet article, nous utiliserons MongoDB Atlas.
Étape 1 : Créer un cluster MongoDB Atlas
Veuillez créer un nouveau cluster dans MongoDB Atlas. Le niveau M0 gratuit est suffisant pour les tests.
Étape 2 : Créer une collection et insérer des données
Tout d'abord, veuillez vous connecter à votre cluster à l'aide de MongoDB Shell (mongosh) ou de votre pilote préféré. Ensuite, veuillez créer une nouvelle collection intitulée «Produits de l' » et insérer des documents contenant un champ vectoriel. Chaque document doit représenter un produit et inclure un champd'intégration d' , qui contiendra la représentation vectorielle du produit.
Voici un exemple plus complet avec trois documents distincts sur des produits, chacun contenant un vecteur généré aléatoirement afin d'illustrer à quoi pourraient ressembler les données. Dans un scénario réel, vous remplaceriez ces éléments par des intégrations générées par un modèle d'IA.
db.products.insertMany([
{
"name": "Wireless Noise-Canceling Headphones",
"category": "Electronics",
"description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
"price": 249.99,
"embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
},
{
"name": "Smart Coffee Maker",
"category": "Home Goods",
"description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
"price": 129.99,
"embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
},
{
"name": "Ultra-light Backpack",
"category": "Travel",
"description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
"price": 79.99,
"embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
}
]);
Chaque document contient un nom, une catégorie, une description et un prix, ainsi que le champ d' sd'intégration essentiel . L'encodage d' est un tableau de nombres de taille fixe qui représente la signification sémantique de la description du produit. La taille de ce tableau, oudimensionnalité de l' , dépend du modèle utilisé pour créer les intégrations. Dans cet exemple, la dimensionnalité est de 128.
Ce sont les données sur lesquelles nous construirons notre index vectoriel afin de permettre la recherche sémantique et recommandations de produits.
Étape 3 : Créer un index vectoriel
Une fois que vous avez vos données avec les intégrations dans une collection, l'étape suivante consiste à créer un index vectoriel. Cet index est essentiel pour permettre des recherches de similitude rapides et efficaces. La commande ci-dessous utilise createSearchIndex pour créer un index vectoriel sur le champd'intégration.
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"dynamic": true,
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 128,
"similarity": "cosine"
}
]
},
}
});
Comprendre la configuration
La configuration de l'index est définie dans les champs de l'objet de définition du tableau d'. Cette structure constitue le modèle sur lequel MongoDB Atlas s'appuie pour organiser vos vecteurs afin de permettre une récupération rapide.
Les paramètres principaux pour l'indexation vectorielle sont les suivants :
- Chemin d'accès: Ceci spécifie le nom exact du champ dans vos documents qui contient le tableau vectoriel, à savoir « embedding » dans cet exemple.
- numDimensions: Il s'agit du paramètre le plus important. Son nombre d'élémentsdoit correspondre exactement au nombre d'éléments du tableau vectoriel généré par votre modèle d'intégration (par exemple, 128, 768, 1536).
- s de similitude: Ceci définit la métrique mathématique utilisée pour calculer la « proximité » entre deux vecteurs lors d'une recherche.
- cosinus est généralement recommandée pour la recherche sémantique, car elle mesure l'angle entre les vecteurs, en se concentrant sur la direction sémantique.
- D'autres options incluent euclidienne (distance en ligne droite) et dotProduct.
Paramètres de performance facultatifs
Pour l'optimisation avancée des performances optimisation des performances, MongoDB Atlas vous permet de spécifier des paramètres facultatifs afin d'optimiser le stockage et la mémoire :
- s de quantification: Ce paramètre est utilisé pour compresser vos vecteurs, ce qui réduit considérablement la taille de l'index et l'empreinte mémoire.
- scalaire ou binaire peut être spécifié pour quantifier les vecteurs, ce qui permet de gagner considérablement en stockage et en vitesse au détriment d'une légère perte en rappel.
Exécution de requêtes de recherche vectorielle
Une fois l'index créé, vous pouvez utiliser la fonction $vectorSearch stage d'agrégation pour effectuer des requêtes de similarité.
Identifions les produits les plus similaires à un vecteur de requête. Cette requête est généralement générée à partir de la recherche effectuée par un utilisateur.
// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": queryVector,
"path": "embedding",
"numCandidates": 100, // Number of documents to scan
"limit": 5 // Number of results to return
}
},
{
"$project": {
"name": 1,
"description": 1,
"_id": 0
}
}
]);
- s queryVector: Le vecteur que vous recherchez.
- Chemin d'accès: Le nom du champ contenant les intégrations vectorielles.
- numCandidates: Le nombre de documents candidats à analyser dans l'index. Un nombre plus élevé améliore la précision mais augmente la latence.
- limite d': Le nombre de résultats principaux à renvoyer.
Le projet étape $project est facultative, mais utile pour façonner la sortie et exclure les données vectorielles du résultat.
Meilleures pratiques pour l'indexation vectorielle
Lorsque vous optimisez votre index vectoriel pour obtenir des performances optimales, il est essentiel de trouver le juste équilibre entre précision et rapidité.. Il est essentiel d'ajuster les paramètres de l'indice en fonction de votre ensemble de données spécifique et de vos objectifs de performance.
Choisir la bonne mesure de similarité
Le choix de la métrique est essentiel, car il définit le degré de « similitude » entre deux vecteurs. Vous pouvez consulter la documentation MongoDB pour en savoir plus sur les champs.
- cosinus: Idéal pour la similarité sémantique, en particulier avec du texte. Il mesure l'angle entre les vecteurs, sans tenir compte de leur longueur. Ceci est essentiel pour les modèles où la longueur du vecteur n'est pas significative.
- euclidienne: Calcule la distance en ligne droite entre deux vecteurs. Veuillez utiliser cette option si la magnitude (ou la longueur) des vecteurs est significative pour leur signification, comme dans certains types de données où une valeur plus élevée indique une caractéristique plus forte.
- dotProduct: Calcule le produit scalaire de deux vecteurs. Cet indicateur est fréquemment utilisé dans les systèmes de recommandation. Lorsque les plongements vectoriels sont normalisés à une longueur de 1, le produit scalaire est fonctionnellement équivalent à la similarité cosinus.
Gestion des dimensions d'intégration
Le paramètre dimensions est essentiel et doit correspondre exactement à la sortie de votre modèle d'intégration. Une erreur courante consiste à choisir un nombre qui ne correspond pas au résultat du modèle. Un modèle comportant un plus grand nombre de dimensions peut capturer davantage de détails, mais entraînera un index plus volumineux et des requêtes potentiellement plus lentes. Veuillez toujours vérifier la documentation de votre modèle afin de confirmer ses dimensions (par exemple,le modèle text-embedding-ada-002 d'OpenAI génère 1536 dimensions).
Réglage de l'index
Les paramètres numCandidates et numLists sont essentiels pour équilibrer la vitesse et la précision de l'. Une bonne règle générale consiste à commencer avec un faiblenombre de candidats et à l'augmenter jusqu'à obtenir un niveau de précision satisfaisant. Vous pouvez également tester différentesvaleurs de numLists pour les indexivf afin de déterminer la valeur optimale pour votre ensemble de données.
Exemple de cas d'utilisation : Développement d'un système de recommandation simple
Appliquons ces concepts à un exemple concret : un système de recommandation de produits dans le domaine du commerce électronique.
Étape 1 : Stockez les données produit avec des intégrations
Tout d'abord, nous enregistrerons les noms des produits, les catégories et un vecteur d'intégration pour chacun d'entre eux. L'intégration peut être générée à partir de la description ou des caractéristiques du produit.
db.products.insertMany([
{
"name": "Smart Speaker",
"category": "Electronics",
"embedding": [0.8, 0.9, 0.1, ...]
},
{
"name": "Wireless Earbuds",
"category": "Electronics",
"embedding": [0.7, 0.8, 0.2, ...]
},
{
"name": "Leather Wallet",
"category": "Fashion",
"embedding": [0.1, 0.2, 0.9, ...]
}
]);
Étape 2 : Créer un index vectoriel surun encodage d'
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"fields": [
{
"type": "vector",
"path": "embedding", // The field containing the vectors
"numDimensions": 128, // The correct field name is 'numDimensions'
"similarity": "cosine" // The correct field name is 'similarity'
// Index algorithm (like HNSW) is managed automatically by Atlas
}
]
}
}
});
Étape 3 : Recherche de produits similaires
Maintenant, recherchons des produits similaires à l'enceinte connectée. Nous utiliserons l'intégration pour Smart Speaker comme vecteur de requête.
const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": smartSpeakerEmbedding,
"path": "embedding",
"numCandidates": 50,
"limit": 3
}
},
{
"$project": {
"name": 1,
"category": 1,
"_id": 0
}
}
]);
Cette requête renverra les trois produits dont les vecteurs d'intégration sont les plus proches de ceux de l'enceinte connectée, recommandant ainsi efficacement des articles similaires, tels que des écouteurs sans fil.
Conclusion
Les capacités de recherche vectorielle de MongoDB ouvrent de nouvelles perspectives pour la création d'applications intelligentes et personnalisées. En intégrant directement l'indexation vectorielle dans la base de données, MongoDB simplifie l'architecture, facilitant ainsi la gestion des données et la réalisation de recherches rapides par similarité.
Grâce à la puissance de la recherche vectorielle, vous pouvez aller au-delà de la simple correspondance de mots-clés et créer des fonctionnalités qui comprennent le contexte et la signification de vos données. Nous vous encourageons à commencer à tester le offre gratuite MongoDB Atlas et à découvrir comment l'indexation vectorielle peut améliorer vos applications.
Questions fréquentes
Qu'est-ce qu'un encodage vectoriel et pourquoi est-il nécessaire pour la recherche vectorielle ?
Un encodage vectoriel est une représentation numérique de données telles que du texte ou des images. Il est nécessaire pour la recherche vectorielle, car il permet à la base de données de mesurer la similarité sémantique entre les éléments en calculant la distance entre leurs vecteurs, allant ainsi au-delà de la simple correspondance de mots-clés.
Ai-je besoin d'une version spécifique de MongoDB pour utiliser Vector Search ?
Oui. La recherche vectorielle est une fonctionnalité intégrée à MongoDB Atlas, la version hébergée dans le cloud de MongoDB. Cette fonctionnalité n'est pas disponible dans les éditions communautaire ou sur site de la base de données.
Dois-je générer moi-même des intégrations vectorielles ?
Oui, il est nécessaire de générer les intégrations vectorielles pour vos données avant de pouvoir les stocker dans MongoDB et créer un index vectoriel. MongoDB ne génère pas ces intégrations pour vous. Vous utiliserez généralement un service tiers ou un modèle pré-entraîné provenant d'une plateforme tellequ' OpenAI, Hugging Face ou Google AI pour convertir votre texte, vos images ou d'autres données en vecteurs numériques.
Puis-je associer la recherche vectorielle à d'autres requêtes MongoDB ?
Oui, c'est possible. La recherche vectorielle est une étape d'agrégation ($vectorSearch), ce qui signifie que vous pouvez l'utiliser dans un pipeline d'agrégation MongoDB plus large. Cela vous permet de combiner la recherche vectorielle avec d'autres étapes puissantes telles que $match, $project, $limit et $lookup afin de créer des requêtes sophistiquées qui effectuent le filtrage, le tri et l'enrichissement des données en une seule opération. Cette fonctionnalité, appelée recherche hybride, est essentielle pour créer des applications concrètes.
Quelle est la différence entre les types d'indices IVF et HNSW ?
La FIV et le HNSW sont tous deux des algorithmes utilisés pour la recherche approximative du plus proche voisin (ANN). La principale différence réside dans la manière dont ils structurent les données.
Karen est une ingénieure de données passionnée par la construction de plateformes de données évolutives. Elle a de l'expérience dans l'automatisation de l'infrastructure avec Terraform et est ravie de partager ses connaissances dans des articles de blog et des tutoriels. Karen est une bâtisseuse de communauté, et elle est passionnée par la promotion des liens entre les professionnels des données.