Partage via


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

Prérequis

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
  1. Dans un répertoire vide sur votre ordinateur, utilisez la commande dotnet new pour créer une application console :

    dotnet new console -o VectorDataAI
    
  2. Modifiez le répertoire dans le dossier de l’application :

    cd VectorDataAI
    
  3. 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 :

    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 :

  4. Ouvrez l’application dans Visual Studio Code (ou votre éditeur de votre choix).

    code .
    

Créer le service IA

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.

  1. À 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.

  2. 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

  1. Accédez à la racine de votre projet .NET à partir d’un terminal ou d’une invite de commandes.

  2. 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

  1. 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
  2. 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."
            }
    
  3. 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ôle Azure 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);
    
  4. 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.

  5. 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();
    }
    
  6. 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

Étapes suivantes