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 Beispiel-Repositorys

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, in denen das Verankern von generativen KI-Antworten erforderlich ist, unerlässlich. 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. Infolgedessen sind die von Vektordatenbanken verwendeten Indizierungs- und Suchalgorithmen so optimiert, dass die Daten effizient abgerufen werden können und 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 in Vektorspeichern

Anmerkung

Die Microsoft.Extensions.VectorData.Abstractions Bibliothek befindet sich derzeit in der Vorschauphase.

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-Beispiel-Repository ist als Azure Developer CLI(azd)-Vorlage strukturiert, die azd verwenden können, um den Azure OpenAI-Dienst und -Modell für Sie bereitzustellen.

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

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

    azd up
    

    azd konfiguriert auch 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 geheimen Schlüssel 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>
    

    Anmerkung

    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;
    
    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 vorherigen 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())
    

    Anmerkung

    DefaultAzureCredential sucht von Ihrem lokalen Tool nach Authentifizierungsanmeldeinformationen. 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.

    IEmbeddingGenerator<string, Embedding<float>> generator =
        new OpenAIClient(new ApiKeyCredential(key))
                .AsEmbeddingGenerator(modelId: model);
    
    // Create and populate the vector store.
    var vectorStore = new InMemoryVectorStore();
    IVectorStoreRecordCollection<int, CloudService> cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices");
    await cloudServicesStore.CreateCollectionIfNotExistsAsync();
    
  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();
    Microsoft.Extensions.VectorData.IVectorStoreRecordCollection<int, CloudService> cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices");
    await cloudServicesStore.CreateCollectionIfNotExistsAsync();
    
    foreach (CloudService 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
    string query = "Which Azure service should I use to store my Word documents?";
    ReadOnlyMemory<float> queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);
    
    VectorSearchResults<CloudService> results =
        await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions<CloudService>()
    {
        Top = 1
    });
    
    await foreach (VectorSearchResult<CloudService> 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