Skapa en .NET AI-vektorsökningsapp
I den här snabbstarten skapar du en .NET-konsolapp för att utföra semantisk sökning i ett vektorarkiv för att hitta relevanta resultat för användarens fråga. Du lär dig hur du genererar inbäddningar för användarfrågor och använder dessa inbäddningar för att fråga vektordatalagret. Funktioner för vektorsökning är också en nyckelkomponent för RAG-scenarier (Retrieval Augmented Generation). Appen använder Microsoft.Extensions.AI och Microsoft.Extensions.VectorData.Abstractions bibliotek så att du kan skriva kod med AI-abstraktioner i stället för ett specifikt SDK. AI-abstraktioner hjälper dig att skapa löst kopplad kod som gör att du kan ändra den underliggande AI-modellen med minimala appändringar.
Förutsättningar
- .NET 8.0 SDK eller senare - Installera .NET 8.0 SDK.
- En API-nyckel från OpenAI så att du kan köra det här exemplet.
Förutsättningar
- .NET 8.0 SDK eller senare – Installera .NET 8 SDK.
- En Azure-prenumeration – Skapa en kostnadsfritt.
- Åtkomst till Azure OpenAI-tjänsten.
- Azure Developer CLI (valfritt) – Installera eller uppdatera Azure Developer CLI-.
Klona exempellagringsplatsen
Du kan skapa en egen app med hjälp av stegen i de kommande avsnitten, eller så kan du klona GitHub-lagringsplatsen som innehåller de färdiga exempelapparna för alla snabbstarter. Om du planerar att använda Azure OpenAI är exempelrepoen också strukturerad som en Azure Developer CLI-mall som kan etablera en Azure OpenAI-resurs åt dig.
git clone https://github.com/dotnet/ai-samples.git
Interagera med dina data med hjälp av vektorlager
Vektorlager eller vektordatabaser är viktiga för uppgifter som semantisk sökning, RAG (Retrieval Augmented Generation) och andra scenarier som kräver grundläggande generativa AI-svar. Relationsdatabaser och dokumentdatabaser är optimerade för strukturerade och halvstrukturerade data, men vektordatabaser skapas för att effektivt lagra, indexera och hantera data som representeras som inbäddningsvektorer. Därför optimeras indexerings- och sökalgoritmerna som används av vektordatabaser för att effektivt hämta data som kan användas nedströms i dina program.
Utforska Microsoft.Extensions.VectorData.Abstractions
Microsoft.Extensions.VectorData.Abstractions är ett .NET-bibliotek som utvecklats i samarbete med Semantic Kernel och det bredare .NET-ekosystemet för att ge ett enhetligt lager av abstraktioner för interaktion med vektorlager.
Abstraktionerna i Microsoft.Extensions.VectorData.Abstractions
ge biblioteksförfattare och utvecklare följande funktioner:
- Utföra Create-Read-Update-Delete (CRUD) operationer på vektorlager
- Använd vektor- och textsökning på vektorlager
Obs
Biblioteket Microsoft.Extensions.VectorData.Abstractions finns för närvarande i förhandsversion.
Skapa appen
Utför följande steg för att skapa en .NET-konsolapp som kan utföra följande:
- Skapa och fylla i ett vektorlager genom att generera inbäddningar för en datauppsättning
- Generera en inbäddning för användarprompten
- Fråga vektorarkivet med hjälp av inbäddning av användarprompt
- Visar relevanta resultat från vektorsökningen
I en tom katalog på datorn använder du kommandot
dotnet new
för att skapa en ny konsolapp:dotnet new console -o VectorDataAI
Ändra katalog till appmappen:
cd VectorDataAI
Installera de paket som krävs:
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
I följande lista beskrivs vad varje paket används för i appen
VectorDataAI
:-
Azure.Identity
tillhandahåller stöd förMicrosoft Entra ID
tokenautentisering i Azure SDK med hjälp av klasser somDefaultAzureCredential
. -
Azure.AI.OpenAI
är det officiella paketet för att använda OpenAI:s .NET-bibliotek med Azure OpenAI-tjänsten. -
Microsoft.SemanticKernel.Connectors.InMemory
tillhandahåller en minnesintern vektorlagerklass som innehåller frågebara vektordataposter. -
Microsoft.Extensions.VectorData.Abstractions
aktiverar CRUD (Create-Read-Update-Delete) och sökåtgärder i vektorlager. - Microsoft.Extensions.Configuration tillhandahåller implementering av nyckel/värde-parbaserad konfiguration.
-
Microsoft.Extensions.Configuration.UserSecrets
är en implementering av en konfigurationsprovider för användarhemligheter kopplad tillMicrosoft.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
I följande lista beskrivs vad varje paket används för i appen
VectorDataAI
:-
Microsoft.Extensions.AI.OpenAI
tillhandahåller AI-abstraktioner för OpenAI-kompatibla modeller eller slutpunkter. Det här biblioteket innehåller även det officiellaOpenAI
-biblioteket för OpenAI-tjänst-API:et som ett beroende. -
Microsoft.SemanticKernel.Connectors.InMemory
tillhandahåller en minnesintern vektorlagerklass som innehåller frågebara vektordataposter. -
Microsoft.Extensions.VectorData.Abstractions
aktiverar CRUD (Create-Read-Update-Delete) och sökåtgärder i vektorlager. - Microsoft.Extensions.Configuration tillhandahåller implementering av nyckel/värde-parbaserad konfiguration.
-
Microsoft.Extensions.Configuration.UserSecrets
är en implementering av en konfigurationsprovider för användarhemligheter kopplad tillMicrosoft.Extensions.Configuration
.
-
Öppna appen i Visual Studio Code (eller valfri redigerare).
code .
Skapa AI-tjänsten
GitHub-exempellagringsplatsen är strukturerad som en Azure Developer CLI-mall (azd
) som azd
kan använda för att etablera Azure OpenAI-tjänsten och modellen åt dig.
Från en terminal eller kommandotolk navigerar du till
src\quickstarts\azure-openai
katalogen för exempeldatabasen.azd up
Kör kommandot för att etablera Azure OpenAI-resurserna. Det kan ta flera minuter att skapa Azure OpenAI-tjänsten och distribuera modellen.azd up
azd
konfigurerar också nödvändiga användarhemligheter för exempelappen, till exempel Azure OpenAI-slutpunkten och modellnamnet.
Konfigurera appen
Navigera till roten av ditt .NET-projekt från en terminal eller kommandotolk.
Kör följande kommandon för att konfigurera din OpenAI API-nyckel som en hemlighet för exempelappen:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
Obs
För det
ModelName
värdet måste du ange en OpenAI-textinbäddningsmodell, till exempeltext-embedding-3-small
ellertext-embedding-3-large
för att generera inbäddningar för vektorsökning i de avsnitt som följer.
Lägg till appkoden
Lägg till en ny klass med namnet CloudService i projektet med följande egenskaper:
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; } } }
I föregående kod:
- C#-attributen som tillhandahålls av
Microsoft.Extensions.VectorData
påverkar hur varje egenskap hanteras när den används i ett vektorlager. - Egenskapen Vector lagrar en genererad inbäddning som representerar den semantiska innebörden av Name och Description för vektorsökningar.
- C#-attributen som tillhandahålls av
I filen Program.cs lägger du till följande kod för att skapa en datauppsättning som beskriver en samling molntjänster:
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." }
Skapa och konfigurera en
IEmbeddingGenerator
implementering för att skicka begäranden till en inbäddnings-AI-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())
Obs
DefaultAzureCredential söker efter autentiseringsuppgifter från ditt lokala verktyg. Om du inte använder
azd
-mallen för att etablera Azure OpenAI-resursen måste du tilldelaAzure AI Developer
rollen till det konto som du använde för att logga in på Visual Studio eller Azure CLI. Mer information finns i Autentisera till Azure AI-tjänster med .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);
Skapa och fylla i ett vektorlager med molntjänstdata. Använd implementeringen
IEmbeddingGenerator
för att skapa och tilldela en inbäddningsvektor för varje post i molntjänstdata:// 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); }
Inbäddningarna är numeriska representationer av den semantiska innebörden för varje datapost, vilket gör dem kompatibla med vektorsökningsfunktioner.
Skapa en inbäddning för en sökfråga och använd den för att utföra en vektorsökning i vektorarkivet:
// 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(); }
dotnet run
Använd kommandot för att köra appen:dotnet run
Appen skriver ut det översta resultatet av vektorsökningen, vilket är den molntjänst som är mest relevant för den ursprungliga frågan. Du kan ändra frågan för att prova olika sökscenarier.
Rensa resurser
När du inte längre behöver exempelprogrammet eller resurserna tar du bort motsvarande distribution och alla resurser.
azd down