Sdílet prostřednictvím


Vytvoření aplikace pro vektorové vyhledávání AI v .NET

V tomto rychlém startu vytvoříte konzolovou aplikaci .NET, která provede sémantické vyhledávání v úložišti vektorů a vyhledá relevantní výsledky pro dotaz uživatele. Naučíte se generovat vkládání pro výzvy uživatelů a pomocí těchto vložených dat dotazovat úložiště vektorových dat. Funkce vektorového vyhledávání je také klíčovou komponentou pro scénáře načítání rozšířené generace (RAG). Aplikace používá Microsoft.Extensions.AI a knihovny Microsoft.Extensions.VectorData.Abstractions, takže můžete psát kód pomocí abstrakcí AI místo konkrétní sady SDK. Abstrakce AI pomáhají vytvořit volně propojený kód, který umožňuje změnit základní model AI s minimálními změnami aplikace.

Požadavky

Požadavky

Klonování ukázkového úložiště

Vlastní aplikaci můžete vytvořit pomocí kroků v dalších částech nebo můžete naklonovat úložiště GitHub, které obsahuje dokončené ukázkové aplikace pro všechny rychlé starty. Pokud plánujete používat Azure OpenAI, ukázkové úložiště je také strukturované jako šablona Azure Developer CLI, která vám může zřídit prostředek Azure OpenAI.

git clone https://github.com/dotnet/ai-samples.git

Interakce s daty pomocí vektorových úložišť

Vektorové úložiště nebo vektorové databáze jsou nezbytné pro úlohy, jako je sémantické vyhledávání, načítání rozšířené generace (RAG) a další scénáře, které vyžadují uzemnění generačních odpovědí AI. Zatímco relační databáze a databáze dokumentů jsou optimalizované pro strukturovaná a částečně strukturovaná data, vektorové databáze se vytvářejí tak, aby efektivně ukládaly, indexovaly a spravovaly data reprezentovaná jako vektory vkládání. V důsledku toho jsou algoritmy indexování a vyhledávání používané vektorovými databázemi optimalizované tak, aby efektivně načítaly data, která je možné použít ve vašich aplikacích.

Seznámení s Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions je knihovna .NET vyvinutá ve spolupráci s sémantickým jádrem a širším ekosystémem .NET, která poskytuje jednotnou vrstvu abstrakcí pro interakci s vektorovými úložišti.

Abstrakce v Microsoft.Extensions.VectorData.Abstractions poskytují autorům knihoven a vývojářům následující funkce:

  • Provádění CRUD (Create-Read-Update-Delete) operací v úložištích vektorů
  • Použití vektoru a vyhledávání textu v úložištích vektorů

Poznámka

Knihovna Microsoft.Extensions.VectorData.Abstractions je aktuálně ve verzi Preview.

Vytvoření aplikace

Provedením následujících kroků vytvořte konzolovou aplikaci .NET, která dokáže provést následující:

  • Vytvořte a naplňte vektorové úložiště generováním embeddingů pro datovou sadu.
  • Vygenerujte embedding pro uživatelský dotaz
  • Dotazování na úložiště vektorů pomocí výzvy uživatele k vložení
  • Zobrazí relevantní výsledky z hledání vektorů.
  1. V prázdném adresáři v počítači pomocí příkazu dotnet new vytvořte novou konzolovou aplikaci:

    dotnet new console -o VectorDataAI
    
  2. Změňte adresář do složky aplikace:

    cd VectorDataAI
    
  3. Nainstalujte požadované balíčky:

    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
    

    Následující seznam popisuje, k čemu se jednotlivé balíčky používají v aplikaci 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
    

    Následující seznam popisuje, k čemu se jednotlivé balíčky používají v aplikaci VectorDataAI:

  4. Otevřete aplikaci v editoru Visual Studio Code (nebo v libovolném editoru).

    code .
    

Vytvoření služby AI

Ukázkové úložiště GitHubu je strukturované jako šablona Azure Developer CLI (azd), která azd umožňuje zřídit službu Azure OpenAI a model za vás.

  1. Z terminálu nebo příkazového řádku přejděte do src\quickstarts\azure-openai adresáře ukázkového úložiště.

  2. Spuštěním azd up příkazu zřiďte prostředky Azure OpenAI. Vytvoření služby Azure OpenAI a nasazení modelu může trvat několik minut.

    azd up
    

    azd nakonfiguruje také požadované tajné kódy uživatelů pro ukázkovou aplikaci, jako je koncový bod Azure OpenAI a název modelu.

Konfigurace aplikace

  1. V terminálu nebo příkazovém řádku přejděte do kořenového adresáře projektu .NET.

  2. Spuštěním následujících příkazů nakonfigurujte klíč rozhraní API OpenAI jako tajný klíč pro ukázkovou aplikaci:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    dotnet user-secrets set ModelName <your-openai-model-name>
    

    Poznámka

    Pro ModelName hodnotu je nutné zadat model vkládání textu OpenAI, jako je text-embedding-3-small nebo text-embedding-3-large pro generování vkládání pro vektorové vyhledávání v následujících částech.

Přidání kódu aplikace

  1. Přidejte do projektu novou třídu s názvem CloudService s následujícími vlastnostmi:

    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; }
        }
    }
    

    V předchozím kódu:

    • Atributy jazyka C# poskytované Microsoft.Extensions.VectorData ovlivňují způsob zpracování jednotlivých vlastností při použití v úložišti vektorů.
    • Vlastnost Vektor ukládá vygenerované zakódování, které představuje sémantický význam Název a Popis pro vyhledávání vektorů.
  2. Do souboru Program.cs přidejte následující kód pro vytvoření datové sady, která popisuje kolekci cloudových služeb:

    
    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. Vytvořte a nakonfigurujte implementaci IEmbeddingGenerator tak, aby odesílala požadavky na model AI pro vložení:

    
    // 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())
    

    Poznámka

    DefaultAzureCredential hledá přihlašovací údaje z vašich místních nástrojů. Pokud k zřízení prostředku Azure OpenAI nepoužíváte šablonu azd, budete muset přiřadit Azure AI Developer roli k účtu, který jste použili k přihlášení k sadě Visual Studio nebo Azure CLI. Další informace najdete v tématu Ověřování ve službách Azure AI pomocí rozhraní .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. Vytvořte a naplňte vektorové úložiště dat cloudové služby. Pomocí implementace IEmbeddingGenerator vytvořte a přiřaďte vektor vkládání pro každý záznam v datech cloudové služby:

    // 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);
    }
    

    Vkládání jsou číselné reprezentace sémantického významu každého datového záznamu, díky čemuž jsou kompatibilní s funkcemi vektorového vyhledávání.

  5. Vytvořte vložení pro vyhledávací dotaz a použijte ho k provedení vektorového vyhledávání v úložišti vektorů:

    // 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 Spuštění aplikace pomocí příkazu:

    dotnet run
    

    Aplikace vypíše nejlepší výsledek vektorového vyhledávání, což je cloudová služba, která je pro původní dotaz nejbližší. Dotaz můžete upravit a vyzkoušet různé scénáře hledání.

Vyčištění prostředků

Pokud už ukázkovou aplikaci nebo prostředky nepotřebujete, odeberte odpovídající nasazení a všechny prostředky.

azd down

Další kroky