Udostępnij za pośrednictwem


Tworzenie aplikacji wyszukiwania wektorów sztucznej inteligencji platformy .NET

W tym szybkim przewodniku utworzysz aplikację konsolową platformy .NET, aby przeprowadzić wyszukiwanie semantyczne w magazynie wektorów i znaleźć odpowiednie wyniki zapytania użytkownika. Dowiesz się, jak generować osadzanie dla monitów użytkownika i używać tych osadzania do wykonywania zapytań dotyczących magazynu danych wektorowych. Funkcja wyszukiwania wektorowego jest również kluczowym składnikiem scenariuszy generowania wspomaganego wyszukiwaniem (RAG). Aplikacja używa bibliotek Microsoft.Extensions.AI i Microsoft.Extensions.VectorData.Abstractions, aby można było pisać kod przy użyciu abstrakcji sztucznej inteligencji, a nie określonego zestawu SDK. Abstrakcje sztucznej inteligencji ułatwiają tworzenie luźno powiązanego kodu, który umożliwia zmianę bazowego modelu sztucznej inteligencji przy minimalnych zmianach aplikacji.

Wymagania wstępne

Wymagania wstępne

Klonowanie przykładowego repozytorium

Możesz utworzyć własną aplikację, wykonując kroki opisane w sekcjach z wyprzedzeniem lub sklonować repozytorium GitHub zawierające ukończone przykładowe aplikacje dla wszystkich przewodników Szybki start. Jeśli planujesz używać usługi Azure OpenAI, przykładowe repozytorium jest również ustrukturyzowane jako szablon interfejsu wiersza polecenia dla deweloperów platformy Azure, który może aprowizować zasób usługi Azure OpenAI.

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

Interakcja z danymi przy użyciu magazynów wektorów

Magazyny wektorów lub bazy danych wektorów są niezbędne w przypadku zadań takich jak wyszukiwanie semantyczne, generacja rozszerzona o pobieranie (RAG) i inne scenariusze, które wymagają uzasadnienia odpowiedzi generowanych przez sztuczną inteligencję. Chociaż relacyjne bazy danych i bazy danych dokumentów są zoptymalizowane pod kątem danych strukturalnych i częściowo ustrukturyzowanych, bazy danych wektorów są tworzone w celu wydajnego przechowywania, indeksowania i zarządzania danymi reprezentowanymi jako wektory osadzania. W związku z tym algorytmy indeksowania i wyszukiwania używane przez wektorowe bazy danych są zoptymalizowane pod kątem wydajnego pobierania danych, które mogą być używane podrzędnie w aplikacjach.

Eksplorowanie obiektów Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions to biblioteka platformy .NET opracowana we współpracy z jądrem semantycznym i szerszym ekosystemem platformy .NET, która zapewnia ujednoliconą warstwę abstrakcji na potrzeby interakcji z magazynami wektorów.

Abstrakcje w programie Microsoft.Extensions.VectorData.Abstractions zapewniają autorom bibliotek i deweloperom następujące funkcje:

  • Wykonaj operacje Create-Read-Update-Delete (CRUD) w magazynach wektorowych
  • Używanie wyszukiwania wektorowego i tekstowego w repozytoriach wektorów

Notatka

Biblioteka Microsoft.Extensions.VectorData.Abstractions jest obecnie dostępna w wersji zapoznawczej.

Tworzenie aplikacji

Wykonaj następujące kroki, aby utworzyć aplikację konsolową platformy .NET, która może wykonać następujące czynności:

  • Tworzenie i wypełnianie magazynu wektorów przez generowanie osadzeń dla zestawu danych
  • Generowanie osadzania dla monitu użytkownika
  • Wykonywanie zapytań dotyczących magazynu wektorów przy użyciu osadzania monitu użytkownika
  • Wyświetla odpowiednie wyniki z wyszukiwania wektorowego
  1. W pustym katalogu na komputerze użyj polecenia dotnet new, aby utworzyć nową aplikację konsolową:

    dotnet new console -o VectorDataAI
    
  2. Zmień katalog na folder aplikacji:

    cd VectorDataAI
    
  3. Zainstaluj wymagane pakiety:

    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
    

    Poniższa lista zawiera opis poszczególnych pakietów używanych w aplikacji 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
    

    Poniższa lista zawiera opis poszczególnych pakietów używanych w aplikacji VectorDataAI:

  4. Otwórz aplikację w programie Visual Studio Code (lub edytorze).

    code .
    

Tworzenie usługi sztucznej inteligencji

Przykładowe repozytorium GitHub jest ustrukturyzowane jako szablon interfejsu wiersza polecenia dla deweloperów platformy Azure (azd), którego azd można użyć do aprowizacji usługi Azure OpenAI i modelu.

  1. W terminalu lub wierszu polecenia przejdź do src\quickstarts\azure-openai katalogu przykładowego repozytorium.

  2. Uruchom polecenie , azd up aby aprowizować zasoby usługi Azure OpenAI. Utworzenie usługi Azure OpenAI i wdrożenie modelu może potrwać kilka minut.

    azd up
    

    azd Konfiguruje również wymagane wpisy tajne użytkownika dla przykładowej aplikacji, takie jak punkt końcowy usługi Azure OpenAI i nazwa modelu.

Konfigurowanie aplikacji

  1. Przejdź do katalogu głównego projektu platformy .NET z poziomu terminalu lub wiersza polecenia.

  2. Uruchom następujące polecenia, aby skonfigurować klucz interfejsu API OpenAI jako wpis tajny dla przykładowej aplikacji:

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

Dodawanie kodu aplikacji

  1. Dodaj nową klasę o nazwie CloudService do projektu z następującymi właściwościami:

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

    W poprzednim kodzie:

    • Atrybuty języka C# udostępniane przez Microsoft.Extensions.VectorData wpływają na sposób obsługi każdej właściwości w przypadku użycia w magazynie wektorów
    • Właściwość Vector przechowuje wygenerowane osadzanie, które reprezentuje semantyczne znaczenie Name i Description na potrzeby wyszukiwania wektorów
  2. W pliku Program.cs dodaj następujący kod, aby utworzyć zestaw danych opisujący kolekcję usług w chmurze:

    
    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. Utwórz i skonfiguruj implementację IEmbeddingGenerator w celu wysyłania żądań do modelu osadzania sztucznej inteligencji:

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

    Notatka

    DefaultAzureCredential wyszukuje poświadczenia uwierzytelniające z lokalnych narzędzi. Jeśli nie używasz szablonu azd do aprowizacji zasobu usługi Azure OpenAI, musisz przypisać rolę Azure AI Developer do konta użytego do zalogowania się do programu Visual Studio lub interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie do usług Azure AI przy użyciu platformy .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. Utwórz i wypełnij magazyn wektorów danymi usługi w chmurze. Użyj implementacji IEmbeddingGenerator, aby utworzyć i przypisać wektor osadzania dla każdego rekordu w danych usługi w chmurze:

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

    Osadzanie to liczbowe reprezentacje semantycznego znaczenia dla każdego rekordu danych, co sprawia, że są one zgodne z funkcjami wyszukiwania wektorowego.

  5. Utwórz osadzanie dla zapytania wyszukiwania i użyj go do wykonania wyszukiwania wektorowego w magazynie wektorów:

    // 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. Użyj polecenia , dotnet run aby uruchomić aplikację:

    dotnet run
    

    Aplikacja wyświetla górny wynik wyszukiwania wektorowego, czyli usługę w chmurze, która jest najbardziej odpowiednia dla oryginalnego zapytania. Możesz zmodyfikować zapytanie, aby wypróbować różne scenariusze wyszukiwania.

Czyszczenie zasobów

Jeśli nie potrzebujesz już przykładowej aplikacji lub zasobów, usuń odpowiednie wdrożenie i wszystkie zasoby.

azd down

Następne kroki