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, aby znaleźć odpowiednie wyniki dla 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 wariantów generowania z rozszerzonym pobieraniem (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.
Warunki wstępne
- Zestaw .NET 8.0 SDK lub nowszy — Zainstaluj zestaw .NET 8.0 SDK.
- Klucz API z OpenAI, aby uruchomić ten przykład.
Warunki wstępne
- Zestaw .NET 8.0 SDK lub nowszy — Zainstaluj zestaw .NET 8 SDK.
- Subskrypcja platformy Azure — Utwórz bezpłatną subskrypcję.
- Dostęp do usługi Azure OpenAI.
- Interfejs wiersza polecenia dla deweloperów platformy Azure (opcjonalnie) — instalowanie lub aktualizowanie interfejsu wiersza polecenia dewelopera platformy Azure.
Klonowanie przykładowego repozytorium
Możesz utworzyć własną aplikację, wykonując kroki opisane w kolejnych sekcjach lub sklonować repozytorium GitHub zawierające ukończone przykładowe aplikacje dla wszystkich szybkich startów. Jeśli planujesz używać usługi Azure OpenAI, przykładowe repozytorium jest również ustrukturyzowane jako szablon CLI dla deweloperów Azure, który może tworzyć zasób Azure OpenAI dla ciebie.
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, pobieranie rozszerzonej generacji (RAG) i inne scenariusze, które wymagają uziemienia odpowiedzi generowania sztucznej inteligencji. 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:
- Obsługa operacji Create-Read-Update-Delete (CRUD) w sklepach wektorowych.
- Obsługiwać wyszukiwanie wektorowe i tekstowe w sklepach wektorowych
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 wygenerowanie osadzonych elementów dla zestawu danych
- Generowanie embeddingu dla polecenia użytkownika
- Wykonywanie zapytań dotyczących magazynu wektorów przy użyciu osadzania monitu użytkownika
- Wyświetla odpowiednie wyniki z wyszukiwania wektorowego
W pustym katalogu na komputerze użyj polecenia
dotnet new
, aby utworzyć nową aplikację konsolową:dotnet new console -o VectorDataAI
Zmień katalog na folder aplikacji:
cd VectorDataAI
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
:-
Azure.Identity
zapewnia obsługę uwierzytelniania tokenówMicrosoft Entra ID
w zestawie Azure SDK przy użyciu takich klas, jakDefaultAzureCredential
. -
Azure.AI.OpenAI
to oficjalny pakiet do korzystania z biblioteki platformy .NET platformy OpenAI w usłudze Azure OpenAI. -
Microsoft.SemanticKernel.Connectors.InMemory
udostępnia klasę magazynu wektorów w pamięci do przechowywania rekordów danych wektorów z możliwością wykonywania zapytań. -
Microsoft.Extensions.VectorData.Abstractions
umożliwia operacje create-read-Update-Delete (CRUD) i wyszukiwania w magazynach wektorów. - Microsoft.Extensions.Configuration zapewnia implementację konfiguracji opartej na parach klucz-wartość.
-
Microsoft.Extensions.Configuration.UserSecrets
jest implementacją dostawcy konfiguracji tajnych danych użytkownika dlaMicrosoft.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
Poniższa lista zawiera opis poszczególnych pakietów używanych w aplikacji
VectorDataAI
:-
Microsoft.Extensions.AI.OpenAI
zapewnia abstrakcje sztucznej inteligencji dla modeli lub punktów końcowych zgodnych z platformą OpenAI. Ta biblioteka zawiera również oficjalną bibliotekęOpenAI
dla interfejsu API usługi OpenAI, dodaną jako zależność. -
Microsoft.SemanticKernel.Connectors.InMemory
udostępnia klasę magazynu wektorów w pamięci do przechowywania rekordów danych wektorów z możliwością wykonywania zapytań. -
Microsoft.Extensions.VectorData.Abstractions
umożliwia operacje tworzenia-odczytu-Update-Delete (CRUD) oraz wyszukiwania w repozytoriach wektorów. - Microsoft.Extensions.Configuration zapewnia implementację konfiguracji opartej na parach klucz-wartość.
-
Microsoft.Extensions.Configuration.UserSecrets
to dostawca implementacji konfiguracji tajemnic użytkownika dlaMicrosoft.Extensions.Configuration
.
-
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óry azd
może służyć do aprowizacji usługi Azure OpenAI i modelu.
W terminalu lub wierszu polecenia przejdź do katalogu
src\quickstarts\azure-openai
przykładowego repozytorium.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
również konfiguruje wymagane tajne klucze użytkownika dla przykładowej aplikacji, takie jak punkt końcowy Azure OpenAI i nazwa modelu.
Konfigurowanie aplikacji
Przejdź do katalogu głównego projektu platformy .NET z poziomu terminalu lub wiersza polecenia.
Uruchom następujące polecenia, aby skonfigurować klucz API OpenAI jako sekret 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>
Nota
Dla wartości
ModelName
należy określić model osadzania tekstu OpenAI, taki jaktext-embedding-3-small
lubtext-embedding-3-large
, aby wygenerować osadzanie na potrzeby wyszukiwania wektorów w kolejnych sekcjach.
Dodawanie kodu aplikacji
Dodaj nową klasę o nazwie CloudService do projektu z następującymi właściwościami:
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; } } }
W poprzednim kodzie:
- Atrybuty języka C# udostępniane przez
Microsoft.Extensions.VectorData
wpływają na sposób, w jaki każda właściwość jest zarządzana podczas użycia w magazynie wektorowym. - Właściwość Vector przechowuje wygenerowane osadzenie, które reprezentuje semantyczne znaczenie dla wyszukiwań wektorowych Name i Description.
- Atrybuty języka C# udostępniane przez
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." }
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 uwierzytelniania 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 Uwierzytelnij się w usługach Azure AI przy użyciu platformy .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();
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(); 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); }
Osadzanie to liczbowe reprezentacje semantycznego znaczenia dla każdego rekordu danych, co sprawia, że są one zgodne z funkcjami wyszukiwania wektorowego.
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 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(); }
Uruchom aplikację za pomocą polecenia
dotnet run
: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