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
- .NET 8.0 SDK oder höher – Installieren Sie das .NET 8.0 SDK.
- Ein API-Schlüssel aus OpenAI, damit Sie dieses Beispiel ausführen können
Voraussetzungen
- .NET 8.0 SDK oder höher – .NET 8 SDKinstallieren.
- Azure-Abonnement – kostenloses Abonnement erstellen.
- Zugriff auf Azure OpenAI Service
- Azure Developer CLI (optional) – Installieren oder Aktualisieren der Azure Developer CLI.
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.
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
Wechseln Sie das Verzeichnis in den App-Ordner:
cd VectorDataAI
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:Azure.Identity
bietetMicrosoft Entra ID
Unterstützung für die Tokenauthentifizierung im Azure SDK mithilfe von Klassen wieDefaultAzureCredential
.Azure.AI.OpenAI
ist das offizielle Paket für die Verwendung der .NET-Bibliothek von OpenAI mit dem Azure OpenAI-Dienst.Microsoft.SemanticKernel.Connectors.InMemory
stellt eine speicherinterne Speicherklasse zum Speichern abfragebarer Vektordatensätze bereit.Microsoft.Extensions.VectorData.Abstractions
ermöglicht Create-Read-Update-Delete (CRUD) und Suchvorgänge in Vektorspeichern.- Microsoft.Extensions.Configuration bietet die Implementierung einer Konfiguration auf Basis von Schlüssel-Wert-Paaren.
-
Microsoft.Extensions.Configuration.UserSecrets
ist eine Implementierung des Konfigurationsanbieters von geheimen Benutzerschlüsseln fürMicrosoft.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
In der folgenden Liste wird beschrieben, wofür jedes Paket in der
VectorDataAI
-App verwendet wird:Microsoft.Extensions.AI.OpenAI
stellt KI-Abstraktionen für openAI-kompatible Modelle oder Endpunkte bereit. Diese Bibliothek enthält auch die offizielleOpenAI
Bibliothek für die OpenAI-Dienst-API als Abhängigkeit.Microsoft.SemanticKernel.Connectors.InMemory
stellt eine speicherinterne Speicherklasse zum Speichern abfragebarer Vektordatensätze bereit.Microsoft.Extensions.VectorData.Abstractions
ermöglicht Create-Read-Update-Delete (CRUD) und Suchvorgänge in Vektorspeichern.- Microsoft.Extensions.Configuration stellt die Implementierung der auf Schlüssel-Wert-Paaren basierenden Konfiguration bereit.
-
Microsoft.Extensions.Configuration.UserSecrets
ist eine Implementierung des Konfigurationsanbieters von geheimen Benutzerschlüsseln fürMicrosoft.Extensions.Configuration
.
Ö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.
Navigieren Sie über ein Terminal oder eine Eingabeaufforderung zum
src\quickstarts\azure-openai
Verzeichnis des Beispielrepo.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
Navigieren Sie über ein Terminal oder eine Eingabeaufforderung zum Stammverzeichnis Ihres .NET-Projekts.
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 wietext-embedding-3-small
odertext-embedding-3-large
angeben, um Einbettungen für die Vektorsuche in den folgenden Abschnitten zu generieren.
Hinzufügen des App-Codes
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.
- Die von
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." }
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, dieAzure 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);
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.
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(); }
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