Freigeben über


Erstellen einer .NET AI-Vektorsuch-App

In dieser Schnellstartanleitung erstellen Sie eine .NET-Konsolen-App, um eine semantische Suche in einem Vektorspeicher durchzuführen, um relevante Ergebnisse für die Abfrage des Benutzers zu finden. Sie erfahren, wie Sie Einbettungen für Benutzeraufforderungen generieren und diese Einbettungen verwenden, um den Vektordatenspeicher abzufragen. Die Vektorsuchfunktionalität ist auch eine Schlüsselkomponente für Rag-Szenarien (Retrieval Augmented Generation). Die App verwendet die Microsoft.Extensions.AI und Microsoft.Extensions.VectorData.Abstractions Bibliotheken, sodass Sie Code mithilfe von KI-Abstraktionen und nicht mit einem bestimmten SDK schreiben können. KI-Abstraktionen helfen beim Erstellen lose gekoppelter Code, mit dem Sie das zugrunde liegende KI-Modell mit minimalen App-Änderungen ändern können.

Voraussetzungen

Voraussetzungen

Klonen des Beispielrepositorys

Sie können Ihre eigene App mit den Schritten in den vorherigen Abschnitten erstellen oder das GitHub-Repository klonen, das die abgeschlossenen Beispiel-Apps für alle Schnellstarts enthält. Wenn Sie Beabsichtigen, Azure OpenAI zu verwenden, ist das Beispiel-Repository auch als Azure Developer CLI-Vorlage strukturiert, die eine Azure OpenAI-Ressource für Sie bereitstellen kann.

git clone https://github.com/dotnet/ai-samples.git

Interagieren mit Ihren Daten mithilfe von Vektorspeichern

Vektorspeicher oder Vektordatenbanken sind für Aufgaben wie semantische Suche, Retrieval Augmented Generation (RAG) und andere Szenarien unerlässlich, die eine fundierte Basis für generative KI-Antworten bereitstellen. Während relationale Datenbanken und Dokumentdatenbanken für strukturierte und halbstrukturierte Daten optimiert sind, werden Vektordatenbanken erstellt, um Daten, die als Eingebettete Vektoren dargestellt werden, effizient zu speichern, zu indizieren und zu verwalten. Daher sind die von Vektordatenbanken verwendeten Indizierungs- und Suchalgorithmen so optimiert, dass Daten effizient abgerufen werden können, die in Ihren Anwendungen weiterverwendet werden können.

Näheres zu Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions ist eine .NET-Bibliothek, die in Zusammenarbeit mit Semantic Kernel und dem umfassenderen .NET-Ökosystem entwickelt wurde, um eine einheitliche Abstraktionsebene für die Interaktion mit Vektorspeichern bereitzustellen.

Die Abstraktionen in Microsoft.Extensions.VectorData.Abstractions bieten Bibliotheksautoren und Entwicklern die folgende Funktionalität:

  • Ausführen von Create-Read-Update-Delete (CRUD)-Vorgängen in Vektorspeichern
  • Verwenden Sie die Vektor- und Textsuche bei Vektorspeichern

Hinweis

Die Microsoft.Extensions.VectorData.Abstractions Bibliothek befindet sich derzeit als Vorschauversion.

Erstellen der App

Führen Sie die folgenden Schritte aus, um eine .NET-Konsolen-App zu erstellen, die Folgendes ausführen kann:

  • Erstellen und Auffüllen eines Vektorspeichers durch Generieren von Einbettungen für einen Datensatz
  • Generieren einer Einbettung für den Benutzerprompt
  • Abfrage des Vektorspeichers mithilfe der Einbettung für den Benutzerprompt
  • Zeigt die relevanten Ergebnisse aus der Vektorsuche an.
  1. Verwenden Sie in einem leeren Verzeichnis auf Ihrem Computer den Befehl dotnet new, um eine neue Konsolen-App zu erstellen:

    dotnet new console -o VectorDataAI
    
  2. Wechseln Sie das Verzeichnis in den App-Ordner:

    cd VectorDataAI
    
  3. Installieren Sie die erforderlichen Pakete:

    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
    

    In der folgenden Liste wird beschrieben, wofür jedes Paket in der VectorDataAI-App verwendet wird:

    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
    

    In der folgenden Liste wird beschrieben, wofür jedes Paket in der VectorDataAI-App verwendet wird:

  4. Öffnen Sie die App in Visual Studio Code (oder Ihrem ausgewählten Editor).

    code .
    

Erstellen des KI-Diensts

Das GitHub-Beispielrepository ist als Azure Developer CLI-Vorlage (azd) strukturiert, die azd zum Bereitstellen der Azure OpenAI Service-Instanz und -Modells für Sie verwenden kann.

  1. Navigieren Sie über ein Terminal oder eine Eingabeaufforderung zum src\quickstarts\azure-openai Verzeichnis des Beispielrepo.

  2. Führen Sie den azd up-Befehl aus, um die Azure OpenAI-Ressourcen bereitzustellen. Es kann mehrere Minuten dauern, bis Azure OpenAI Service erstellt und das Modell bereitgestellt ist.

    azd up
    

    azd konfiguriert außerdem die erforderlichen Benutzerschlüssel für die Beispiel-App, z. B. den Azure OpenAI-Endpunkt und den Modellnamen.

Konfigurieren der App

  1. Navigieren Sie über ein Terminal oder eine Eingabeaufforderung zum Stammverzeichnis Ihres .NET-Projekts.

  2. Führen Sie die folgenden Befehle aus, um Ihren OpenAI-API-Schlüssel als Geheimnis für die Beispiel-App zu konfigurieren:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    dotnet user-secrets set ModelName <your-openai-model-name>
    

    Hinweis

    Für den ModelName Wert müssen Sie ein OpenAI-Texteinbettungsmodell wie text-embedding-3-small oder text-embedding-3-large angeben, um Einbettungen für die Vektorsuche in den folgenden Abschnitten zu generieren.

Hinzufügen des App-Codes

  1. Fügen Sie ihrem Projekt eine neue Klasse namens CloudService- mit den folgenden Eigenschaften hinzu:

    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; }
        }
    }
    

    Im obigen Code:

    • Die von Microsoft.Extensions.VectorData bereitgestellten C#-Attribute beeinflussen, wie jede Eigenschaft bei Verwendung in einem Vektorspeicher behandelt wird.
    • Die Vector-Eigenschaft speichert eine generierte Einbettung, die die semantische Bedeutung des Name und Description für Vektorsuchen darstellt.
  2. Fügen Sie in der datei Program.cs den folgenden Code hinzu, um einen Datensatz zu erstellen, der eine Sammlung von Clouddiensten beschreibt:

    
    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. Erstellen und Konfigurieren einer IEmbeddingGenerator Implementierung zum Senden von Anforderungen an ein eingebettetes KI-Modell:

    
    // 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())
    

    Hinweis

    DefaultAzureCredential sucht in Ihrem lokalen Tool nach Authentifizierungsdaten. Wenn Sie die azd Vorlage nicht zum Bereitstellen der Azure OpenAI-Ressource verwenden, müssen Sie dem Konto, das Sie für die Anmeldung bei Visual Studio oder der Azure CLI verwendet haben, die Azure AI Developer Rolle zuweisen. Weitere Informationen finden Sie unter Authentifizieren von Azure AI-Diensten mit .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. Erstellen und Auffüllen eines Vektorspeichers mit den Clouddienstdaten. Verwenden Sie die IEmbeddingGenerator Implementierung, um einen Einbettungsvektor für jeden Datensatz in den Clouddienstdaten zu erstellen und zuzuweisen:

    // 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);
    }
    

    Die Einbettungen sind numerische Darstellungen der semantischen Bedeutung für jeden Datensatz, wodurch sie mit Vektorsuchfunktionen kompatibel sind.

  5. Erstellen Sie eine Einbettung für eine Suchabfrage, und verwenden Sie sie, um eine Vektorsuche im Vektorspeicher auszuführen:

    // 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. Verwenden Sie den Befehl dotnet run, um die App auszuführen:

    dotnet run
    

    Die App druckt das oberste Ergebnis der Vektorsuche, bei dem es sich um den Clouddienst handelt, der für die ursprüngliche Abfrage am relevantesten ist. Sie können die Abfrage ändern, um verschiedene Suchszenarien auszuprobieren.

Bereinigen von Ressourcen

Wenn Sie die Beispielanwendung oder Ressourcen nicht mehr benötigen, entfernen Sie die entsprechende Bereitstellung und alle Ressourcen.

azd down

Nächste Schritte