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
- Zestaw .NET 8.0 SDK lub nowszy — Zainstaluj zestaw .NET 8.0 SDK.
- Klucz interfejsu API z interfejsu OpenAI , aby można było uruchomić ten przykład.
Wymagania wstępne
- Zestaw .NET 8.0 SDK lub nowszy — Zainstaluj zestaw .NET 8 SDK.
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- Dostęp do usługi Azure OpenAI.
- Interfejs wiersza polecenia dla deweloperów platformy Azure (opcjonalnie) — instalowanie lub aktualizowanie interfejsu wiersza polecenia dla deweloperów platformy Azure.
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
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 za pomocą tokenówMicrosoft Entra ID
w całym zestawie Azure SDK, korzystając z klas takich 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 repozytoriach wektorowych. - Microsoft.Extensions.Configuration oferuje implementację konfiguracji opartą na parach klucz-wartość.
-
Microsoft.Extensions.Configuration.UserSecrets
to implementacja 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. W tej bibliotece znajduje się również oficjalna bibliotekaOpenAI
jako zależność dla interfejsu API usługi 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 opartą na parach klucz-wartość.
-
Microsoft.Extensions.Configuration.UserSecrets
to implementacja dostawcy konfiguracji sekretów użytkownika dlaMicrosoft.Extensions.Configuration
.
-
Otwórz aplikację w programie Visual Studio Code (lub edytorze).
code .
Tworzenie usługi sztucznej inteligencji
- Interfejs wiersza polecenia dla deweloperów platformy Azure
- Interfejs wiersza polecenia platformy Azure
- Azure Portal
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.
W terminalu lub wierszu polecenia przejdź do
src\quickstarts\azure-openai
katalogu 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
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
Przejdź do katalogu głównego projektu platformy .NET z poziomu terminalu lub wiersza polecenia.
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
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
- 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 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);
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.
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(); }
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