Mettre en œuvre la génération de récupération augmentée à l’aide d’index vectoriels dans Azure Cosmos DB pour MongoDB avec vCore
À l’aide d’Azure OpenAI et d’Azure Cosmos DB for MongoDB vCore, vous pouvez implémenter un système RAG (génération augmentée de récupération). Ce système associe les fonctionnalités de recherche vectorielle d’Azure Cosmos DB for MongoDB vCore aux modèles IA avancés d’Azure OpenAI pour fournir des réponses détaillées en fonction des résultats de la recherche. Cette approche améliore considérablement la qualité et la pertinence des réponses générées par l’IA à l’aide de vos propres données.
Configurer Azure Cosmos DB for MongoDB vCore pour la recherche vectorielle
La première partie d’un système RAG (génération augmentée de récupération) consiste à poser une question et à rechercher dans vos données des éléments similaires en fonction d’une similarité vectorielle. En d’autres termes, votre question est convertie en vecteur numérique et le système recherche dans vos données les éléments les plus similaires à ce vecteur.
Ce processus nécessite d’abord la configuration de votre base de données Azure Cosmos DB for MongoDB vCore pour permettre la prise en charge de la recherche vectorielle. Cette configuration comporte trois étapes principales :
- Ajoutez des champs vectoriels à vos documents pour stocker les incorporations de leurs données textuelles.
- Générez des incorporations à partir des données textuelles de votre document et stockez-les dans les champs vectoriels.
- Créez des index vectoriels pour ces champs vectoriels.
Découvrons chaque étape de plus près.
Ajouter des champs vectoriels à vos documents
Vous commencez par ajouter des champs vectoriels à vos documents Azure Cosmos DB for MongoDB avec vCore. Ces champs sont cruciaux, car ils stockent des données vectorielles de grande dimension. Vous remplissez ces champs vectoriels en utilisant des incorporations générées à partir des données textuelles de votre document. Une fois remplis, vos index vectoriels sont ensuite créés à partir de ces champs vectoriels.
Générer des embeddings
Pour pouvoir tirer parti des index vectoriels, vous devez générer des incorporations pour certains des champs de texte stockés dans les documents de votre base de données. Les incorporations vectorielles sont des représentations numériques des données textuelles, ce qui permet aux systèmes IA d’effectuer une comparaison de similarité efficace entre les documents. Par exemple, un vecteur d’incorporation généré pour un champ de texte peut ressembler à ceci :
[0.123, 0.234, 0.345, ...]
Supposons que vous disposiez de la collection products dans la base de données sales d’Adventure Works Bike Shop. Vous pouvez générer des incorporations pour les champs category et description du document de la collection. Azure OpenAI peut vous aider à générer ces incorporations à partir des données de texte des champs. Une fois ces incorporations générées, vous pouvez les stocker dans les champs vectoriels de votre document.
Pour créer vos incorporations de champs vectoriel, vous pouvez utiliser le Kit de développement logiciel (SDK) Python ou Node.js d’Azure OpenAI, entre autres langages. Par exemple, vous pouvez utiliser les extraits de code suivants afin de générer des incorporations pour le texte du champ category à l’aide de l’API d’Azure OpenAI :
Python
response = AzureOpenAIClient.embeddings.create(
input=categoryText,
model=embeddings_deployment)
Node.JS
const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);
Ces commandes appellent l’API d’Azure OpenAI afin de générer des incorporations numériques pour la variable categoryText à l’aide du modèle spécifié (par exemple GPT4). Une fois que vous avez généré les incorporations du document, vous pouvez les stocker dans vos champs vectoriels en tirant parti de la commande insert ou update d’une collection MongoDB.
Créer des index vectoriels
Pour pouvoir effectuer des recherches vectorielles afin d’obtenir les résultats dont nous avons besoin pour notre système RAG, nous devons créer des index vectoriels sur ces champs vectoriels. Ces index vous permettent d’effectuer des recherches vectorielles efficaces pour récupérer les éléments similaires en fonction d’une similarité vectorielle. Il existe deux types d’index vectoriels disponibles dans Azure Cosmos DB for MongoDB : HNSW (Hierarchical Navigable Small World) et IVF (Inverted File). Vous pouvez choisir le type d’index en fonction des besoins de votre application.
Par exemple, pour créer un index vectoriel à l’aide de l’algorithme HNSW, vous pouvez utiliser la commande MongoDB suivante :
db.command({
"createIndexes": "exampleCollection",
"indexes": [
{
"name": "VectorSearchIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-hnsw",
"m": 16,
"efConstruction": 64,
"similarity": "COS",
"dimensions": 3
}
}
]
});
Cette commande MongoDB crée un index vectoriel appelé VectorSearchIndex sur la collection exampleCollection du champ vectoriel contentVector. Vous pouvez utiliser une commande similaire pour créer un index vectoriel à l’aide de l’algorithme IVF. Nous abordons cet exemple dans l’exercice du module. Une fois que vous avez créé les index vectoriels, vous pouvez désormais les utiliser pour effectuer des recherches de similarité sur votre base de données Azure Cosmos DB for MongoDB vCore. Votre base de données Azure Cosmos DB for MongoDB vCore est désormais prête à effectuer des recherches vectorielles.
Effectuer une recherche vectorielle
Une fois que vous avez créé les index vectoriels, vous pouvez effectuer des recherches vectorielles pour récupérer les éléments similaires en fonction d’une similarité vectorielle. Le processus de recherche comporte deux étapes principales :
Incorporer une requête : Convertissez une question en langage naturel en vecteur en utilisant les mêmes fonctions d’incorporation que celles utilisées pour créer les incorporations de champs vectoriels. Par exemple, si vous entrez une question ressemblant à ceci : Quels types de vélos vendez-vous ?, vous devez générer l’incorporation de la question à l’aide de la même fonction API Azure OpenAI que celle que vous avez utilisée pour créer les incorporations category ou description du document.
Rechercher : Utilisez l’incorporation générée (également appelée vecteur de requête) pour rechercher les éléments similaires dans la base de données. L’algorithme de recherche compare le vecteur de requête aux données vectorielles stockées dans la base de données pour trouver les éléments les plus similaires. Pour effectuer une recherche vectorielle, vous pouvez utiliser la commande MongoDB aggregate suivante :
db.exampleCollection.aggregate([
{
"$search": {
"cosmosSearch": {
"vector": "queryVector",
"path": "contentVector",
"k": 2,
"efSearch": 40
},
}
}
]);
Le résultat de la recherche vectorielle retourne les éléments les plus similaires en fonction du vecteur de requête. Dans cette commande, contentVector est le nom de votre champ vectoriel. Ces résultats ne sont qu’un tableau de vos documents avec les scores de similarité les plus élevés. Toutefois, vous pouvez améliorer davantage l’expérience utilisateur en intégrant Azure OpenAI pour générer des réponses détaillées en fonction des résultats de la recherche. Cette intégration est la dernière étape de notre système RAG (génération augmentée de récupération).
Intégrer Azure OpenAI
Bien que les résultats de la recherche vectorielle fournissent des éléments pertinents, vous pouvez améliorer davantage l’expérience utilisateur en intégrant Azure OpenAI pour générer des réponses détaillées en fonction des résultats de la recherche vectorielle. Les modèles IA avancés d’Azure OpenAI peuvent fournir des réponses contextuelles qui complètent les résultats de la recherche vectorielle.
Que devons-nous faire pour intégrer Azure OpenAI aux résultats de la recherche vectorielle ? Créons tout d’abord un prompt structuré qu’Azure OpenAI pourra utiliser pour générer des réponses détaillées en fonction des résultats de la recherche vectorielle. Le prompt structuré combine les éléments suivants :
- Requête d’origine que vous avez utilisée dans votre recherche vectorielle : par exemple Quels types de vélos vendez-vous ?
- Prompt système défini par l’utilisateur : le prompt système fournit une description claire du travail, détaillant les tâches que l’IA est censée gérer. Par exemple, il peut définir son rôle en tant qu’assistant chez Adventure Works Bike Shop. Il décrit la façon dont l’IA doit répondre aux questions, en veillant à ce que toutes les réponses soient pertinentes et retournées dans un format facile à suivre. Le prompt système peut comporter les composants suivants :
- Description du travail : Qui l’IA est censée représenter, par exemple « En tant qu’assistant chez Adventure Works Bike Shop, tu dois répondre aux questions des clients sur les vélos que nous vendons ».
- Mise en forme des réponses de l’IA : Le prompt indique avec précision à l’IA comment mettre en forme ses réponses, par exemple en utilisant des listes ayant un espacement spécifique. Cette mise en forme permet de présenter les informations de manière claire et cohérente pour que les utilisateurs puissent les comprendre facilement.
- Limitation des réponses dans le cadre de l’interaction avec l’IA : Le prompt peut inclure une liste de sujets que l’IA doit pouvoir aborder, par exemple les différents types de vélos, les prix et la disponibilité. Cette liste permet de garantir la cohérence de l’IA par rapport au sujet, et de fournir des informations pertinentes.
- Gestion de l’incertitude : Le prompt permet à l’IA de savoir comment gérer les situations où elle ne dispose peut-être pas de suffisamment d’informations pour fournir une réponse. L’IA peut suggérer des expressions telles que « Je ne sais pas », ou encourager les utilisateurs à mener leurs propres recherches. Cette section peut permettre à l’IA de mieux gérer les situations d’incertitude.
- Autres instructions : Le prompt peut inclure d’autres instructions, par exemple comment fournir des ressources supplémentaires aux utilisateurs, ou comment gérer les questions inappropriées. Vous devez donc inclure tout ce que vous souhaitez que l’IA fasse dans le prompt système. Ces instructions permettent à l’IA d’offrir une expérience cohérente et utile aux utilisateurs.
- Résultats de la recherche vectorielle : Les résultats de la recherche vectorielle fournissent les éléments les plus similaires parmi vos données en fonction du vecteur de requête. Dans la mesure où les résultats de la recherche vectorielle retournés correspondent aux documents entiers eux-mêmes, vous devez choisir les champs les plus pertinents à inclure dans le prompt, par exemple la catégorie (category) ou la description (description) du vélo. L’IA peut utiliser ces informations pour générer des réponses détaillées en fonction des résultats de la recherche vectorielle. Par exemple, si les résultats de la recherche vectorielle retournent Mountain Bikes (VTT) et Road Bikes (vélos de route), l’IA peut fournir des informations détaillées sur ces types de vélos.
Il existe de nombreuses façons programmatiques de générer le prompt. La clé consiste à le structurer pour fournir des instructions claires à l’IA sur la façon de générer des réponses en fonction des résultats de la recherche vectorielle. Nous abordons l’une de ces méthodes dans l’exercice du module.
Une fois que vous avez défini votre prompt structuré, vous pouvez utiliser les extraits de code suivants pour générer des réponses à l’aide d’Azure OpenAI :
Python
response = AzureOpenAICompletionClient.chat.completions.create(
model=completion_deployment, messages=structuredPrompt)
Node.JS
const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);
Ces commandes appellent l’API d’Azure OpenAI afin de générer des réponses détaillées basées sur le prompt structuré, en utilisant le modèle spécifié pour fournir des informations contextuelles qui complètent les résultats de la recherche vectorielle.
Cette configuration associe les données client d’Azure Cosmos DB for MongoDB vCore aux modèles IA d’Azure OpenAI pour former votre système RAG (génération augmentée de récupération). En intégrant la recherche vectorielle, elle permet à l’IA d’extraire des informations précises et pertinentes d’Azure Cosmos DB for MongoDB vCore pour améliorer les réponses. Cette approche améliore considérablement la qualité et la pertinence des réponses générées par l’IA à l’aide de vos propres données.