Créer une application de recherche vectorielle .NET AI
Dans ce guide de démarrage rapide, vous créez une application console .NET pour effectuer une recherche sémantique sur un magasin vectoriel afin de trouver les résultats pertinents pour la requête de l’utilisateur. Vous apprenez à générer des embeddings pour les invites utilisateur et à utiliser ces embeddings pour interroger le stockage de données vectorielles. La fonctionnalité de recherche vectorielle est également un composant clé pour les scénarios de récupération augmentée (RAG). L’application utilise les bibliothèques Microsoft.Extensions.AI et Microsoft.Extensions.VectorData.Abstractions afin de pouvoir écrire du code à l’aide d’abstractions IA plutôt qu’un KIT de développement logiciel (SDK) spécifique. Les abstractions IA permettent de créer du code faiblement couplé qui vous permet de modifier le modèle IA sous-jacent avec des modifications minimales de l’application.
Prérequis
- SDK .NET 8.0 ou version ultérieure : Installer le SDK .NET 8.0.
- Une clé API d’OpenAI pour pouvoir exécuter cet échantillon.
Prérequis
- SDK .NET 8.0 ou version ultérieure - Installer le SDK .NET 8.
- Un abonnement Azure : créez-en un gratuitement.
- Accès auprès d’Azure OpenAI Service.
- Azure Developer CLI (facultatif) : installez ou mettez à jour Azure Developer CLI.
Clonez l’exemple de dépôt
Vous pouvez créer votre propre application à l’aide des étapes décrites dans les sections à l’avance, ou vous pouvez cloner le dépôt GitHub qui contient les exemples d’applications terminés pour tous les guides de démarrage rapide. Si vous envisagez d’utiliser Azure OpenAI, l’exemple de dépôt est également structuré en tant que modèle Azure Developer CLI qui peut approvisionner une ressource Azure OpenAI pour vous.
git clone https://github.com/dotnet/ai-samples.git
Interagir avec vos données à l’aide de paquets de vecteurs
Les magasins vectoriels ou les bases de données vectorielles sont essentiels pour les tâches telles que la recherche sémantique, la récupération augmentée (RAG) et d’autres scénarios qui nécessitent des réponses d’IA génératives. Bien que les bases de données relationnelles et les bases de données de documents soient optimisées pour les données structurées et semi-structurées, les bases de données vectorielles sont conçues pour stocker, indexer et gérer efficacement les données représentées en tant que vecteurs d’incorporation. Par conséquent, les algorithmes d’indexation et de recherche utilisés par les bases de données vectorielles sont optimisés pour récupérer efficacement les données qui peuvent être utilisées en aval dans vos applications.
Explorer Microsoft.Extensions.VectorData.Abstractions
Microsoft.Extensions.VectorData.Abstractions est une bibliothèque .NET développée en collaboration avec le noyau sémantique et l’écosystème .NET plus large pour fournir une couche unifiée d’abstractions pour interagir avec les magasins vectoriels.
Les abstractions de Microsoft.Extensions.VectorData.Abstractions
fournissent aux auteurs et développeurs de bibliothèque les fonctionnalités suivantes :
- Effectuer des opérations CRUD (création/lecture/mise à jour/suppression) sur les magasins de vecteurs
- Utiliser la recherche de vecteurs et de texte sur les stocks de vecteurs
Remarque
La bibliothèque Microsoft.Extensions.VectorData.Abstractions est actuellement en préversion.
Créer l’application
Effectuez les étapes suivantes pour créer une application console .NET qui peut effectuer les opérations suivantes :
- Créer et remplir un magasin de vecteurs en générant des incorporations pour un jeu de données
- Générer une incorporation pour l’invite utilisateur
- Interroger le magasin de vecteurs à l’aide de l’incorporation de l’invite utilisateur
- Affiche les résultats pertinents de la recherche vectorielle
Dans un répertoire vide sur votre ordinateur, utilisez la commande
dotnet new
pour créer une application console :dotnet new console -o VectorDataAI
Modifiez le répertoire dans le dossier de l’application :
cd VectorDataAI
Installez les packages requis :
dotnet add package Azure.Identity dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
La liste suivante décrit ce que chaque package est utilisé dans l’application
VectorDataAI
:-
Azure.Identity
assure la prise en charge de l’authentification par jetonMicrosoft Entra ID
dans le kit SDK Azure à l’aide de classes telles queDefaultAzureCredential
. Azure.AI.OpenAI
est le package officiel pour l’utilisation de la bibliothèque .NET d’OpenAI avec le service Azure OpenAI.Microsoft.SemanticKernel.Connectors.InMemory
fournit une classe de magasin de vecteurs en mémoire pour contenir les enregistrements de données vectorielles interrogeables.Microsoft.Extensions.VectorData.Abstractions
permet les opérations Create-Read-Update-Delete (CRUD) et de recherche sur les bases de données vectorielles.- Microsoft.Extensions.Configuration fournit l’implémentation de la configuration basée sur une paire clé-valeur.
Microsoft.Extensions.Configuration.UserSecrets
est une implémentation de fournisseur de configuration de secrets utilisateur pourMicrosoft.Extensions.Configuration
.
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
La liste suivante décrit ce que chaque package est utilisé dans l’application
VectorDataAI
:Microsoft.Extensions.AI.OpenAI
fournit des abstractions IA pour les modèles ou points de terminaison compatibles OpenAI. Cette bibliothèque inclut également la bibliothèque officielleOpenAI
pour l’API OpenAI en tant que dépendance.Microsoft.SemanticKernel.Connectors.InMemory
fournit une classe de magasin de vecteurs en mémoire pour contenir les enregistrements de données vectorielles interrogeables.-
Microsoft.Extensions.VectorData.Abstractions
active les opérations CRUD (création/lecture/mise à jour/suppression) et de recherche sur les magasins de vecteurs. - Microsoft.Extensions.Configuration fournit l’implémentation de la configuration basée sur une paire clé-valeur.
Microsoft.Extensions.Configuration.UserSecrets
est une implémentation de fournisseur de configuration de secrets utilisateur pourMicrosoft.Extensions.Configuration
.
-
Ouvrez l’application dans Visual Studio Code (ou votre éditeur de votre choix).
code .
Créer le service IA
- Azure Developer CLI
- Azure CLI
- Portail Azure
L’exemple de référentiel GitHub est structuré en tant que modèle Azure Developer CLI (azd
), que azd
peut utiliser pour approvisionner le service et le modèle Azure OpenAI pour vous.
À partir d’un terminal ou d’une invite de commandes, accédez au
src\quickstarts\azure-openai
répertoire de l’exemple de dépôt.Exécutez la commande
azd up
pour approvisionner les ressources Azure OpenAI. La création du service Azure OpenAI et le déploiement du modèle peuvent prendre plusieurs minutes.azd up
azd
configure également les secrets utilisateur requis pour l’exemple d’application, comme le point de terminaison Azure OpenAI et le nom du modèle.
Configurer l’application
Accédez à la racine de votre projet .NET à partir d’un terminal ou d’une invite de commandes.
Exécutez les commandes suivantes pour configurer votre clé API OpenAI en tant que secret pour l’exemple d’application :
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
Ajouter le code de l’application
Ajoutez une nouvelle classe nommée CloudService à votre projet avec les propriétés suivantes :
using Microsoft.Extensions.VectorData; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VectorDataAI { internal class CloudService { [VectorStoreRecordKey] public int Key { get; set; } [VectorStoreRecordData] public string Name { get; set; } [VectorStoreRecordData] public string Description { get; set; } [VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)] public ReadOnlyMemory<float> Vector { get; set; } } }
Dans le code précédent :
- Les attributs C# fournis par
Microsoft.Extensions.VectorData
influencent la façon dont chaque propriété est gérée lorsqu’elle est utilisée dans un magasin de vecteurs - La propriété Vector stocke une incorporation générée qui représente la signification sémantique du Nom et de la Description pour les recherches vectorielles
- Les attributs C# fournis par
Dans le fichier Program.cs, ajoutez le code suivant pour créer un jeu de données qui décrit une collection de services cloud :
var cloudServices = new List<CloudService>() { new CloudService { Key=0, Name="Azure App Service", Description="Host .NET, Java, Node.js, and Python web applications and APIs in a fully managed Azure service. You only need to deploy your code to Azure. Azure takes care of all the infrastructure management like high availability, load balancing, and autoscaling." }, new CloudService { Key=1, Name="Azure Service Bus", Description="A fully managed enterprise message broker supporting both point to point and publish-subscribe integrations. It's ideal for building decoupled applications, queue-based load leveling, or facilitating communication between microservices." }, new CloudService { Key=2, Name="Azure Blob Storage", Description="Azure Blob Storage allows your applications to store and retrieve files in the cloud. Azure Storage is highly scalable to store massive amounts of data and data is stored redundantly to ensure high availability." }, new CloudService { Key=3, Name="Microsoft Entra ID", Description="Manage user identities and control access to your apps, data, and resources.." }, new CloudService { Key=4, Name="Azure Key Vault", Description="Store and access application secrets like connection strings and API keys in an encrypted vault with restricted access to make sure your secrets and your application aren't compromised." }, new CloudService { Key=5, Name="Azure AI Search", Description="Information retrieval at scale for traditional and conversational search applications, with security and options for AI enrichment and vectorization." }
Créez et configurez une implémentation de
IEmbeddingGenerator
pour envoyer des requêtes à un modèle IA incorporé :// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]; string model = config["AZURE_OPENAI_GPT_NAME"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new AzureOpenAIClient( new Uri(endpoint), new DefaultAzureCredential())
Remarque
DefaultAzureCredential recherche les informations d'identification dans vos outils locaux. Si vous n’utilisez pas le modèle
azd
pour approvisionner la ressource Azure OpenAI, vous devez affecter le rôleAzure AI Developer
au compte que vous avez utilisé pour vous connecter à Visual Studio ou à Azure CLI. Pour plus d’informations, voir Authentification aux services Azure AI avec .NET.// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string model = config["ModelName"]; string key = config["OpenAIKey"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new OpenAIClient(new ApiKeyCredential(key)) .AsEmbeddingGenerator(modelId: model);
Créez et remplissez un magasin de vecteurs avec les données du service cloud. Utilisez l’implémentation
IEmbeddingGenerator
pour créer et affecter un vecteur d’incorporation pour chaque enregistrement dans les données du service cloud :// Create and populate the vector store var vectorStore = new InMemoryVectorStore(); var cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync(); foreach (var service in cloudServices) { service.Vector = await generator.GenerateEmbeddingVectorAsync(service.Description); await cloudServicesStore.UpsertAsync(service); }
Les incorporations sont des représentations numériques de la signification sémantique pour chaque enregistrement de données, ce qui les rend compatibles avec les fonctionnalités de recherche vectorielle.
Créez une incorporation pour une requête de recherche et utilisez-la pour effectuer une recherche vectorielle sur le magasin vectoriel :
// Convert a search query to a vector and search the vector store var query = "Which Azure service should I use to store my Word documents?"; var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query); var results = await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions() { Top = 1, VectorPropertyName = "Vector" }); await foreach (var result in results.Results) { Console.WriteLine($"Name: {result.Record.Name}"); Console.WriteLine($"Description: {result.Record.Description}"); Console.WriteLine($"Vector match score: {result.Score}"); Console.WriteLine(); }
Utilisez la commande
dotnet run
pour exécuter l’application :dotnet run
L’application imprime le résultat supérieur de la recherche vectorielle, qui est le service cloud le plus pertinent pour la requête d’origine. Vous pouvez modifier la requête pour essayer différents scénarios de recherche.
Nettoyer les ressources
Lorsque vous n’avez plus besoin de l’exemple d’application ou de ressources, supprimez le déploiement correspondant et toutes les ressources.
azd down