Dela via


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

Förutsättningar

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
  1. I en tom katalog på datorn använder du kommandot dotnet new för att skapa en ny konsolapp:

    dotnet new console -o VectorDataAI
    
  2. Ändra katalog till appmappen:

    cd VectorDataAI
    
  3. 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:

    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:

  4. Ö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.

  1. Från en terminal eller kommandotolk navigerar du till src\quickstarts\azure-openai katalogen för exempeldatabasen.

  2. 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

  1. Navigera till roten av ditt .NET-projekt från en terminal eller kommandotolk.

  2. 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 exempel text-embedding-3-small eller text-embedding-3-large för att generera inbäddningar för vektorsökning i de avsnitt som följer.

Lägg till appkoden

  1. 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.
  2. 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."
            }
    
  3. 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 tilldela Azure 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);
    
  4. 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.

  5. 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();
    }
    
  6. 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

Nästa steg