Condividi tramite


Creare un'app di ricerca vettoriale di intelligenza artificiale .NET

In questa guida introduttiva si crea un'app console .NET per eseguire la ricerca semantica in un archivio vettoriale per trovare i risultati pertinenti per la query dell'utente. Si apprenderà come generare incorporamenti per le richieste degli utenti e usare tali incorporamenti per eseguire query sull'archivio dati vettoriale. La funzionalità di ricerca vettoriale è anche un componente chiave per gli scenari di generazione aumentata tramite recupero delle informazioni (RAG, Retrieval Augmented Generation). L'app usa le librerie Microsoft.Extensions.AI e Microsoft.Extensions.VectorData.Abstractions in modo da poter scrivere codice usando astrazioni di intelligenza artificiale anziché un SDK specifico. Le astrazioni di intelligenza artificiale consentono di creare codice ad accoppiamento libero che consente di modificare il modello di intelligenza artificiale sottostante con modifiche minime all'app.

Prerequisiti

Prerequisiti

Clonare il repository di esempio:

È possibile creare un'app personalizzata seguendo la procedura descritta nelle sezioni in anticipo oppure clonare il repository GitHub che contiene le app di esempio completate per tutte le guide introduttive. Se si prevede di usare Azure OpenAI, il repository di esempio è strutturato anche come modello dell'interfaccia della riga di comando per sviluppatori di Azure in grado di effettuare automaticamente il provisioning di una risorsa OpenAI di Azure.

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

Interagire con i dati usando archivi vettoriali

Gli archivi vettoriali o i database vettoriali sono essenziali per attività come la ricerca semantica, la generazione aumentata di recupero e altri scenari che richiedono risposte di intelligenza artificiale generative. Mentre i database relazionali e i database di documenti sono ottimizzati per i dati strutturati e semistrutturati, i database vettoriali vengono creati per archiviare, indicizzare e gestire in modo efficiente i dati rappresentati come vettori di incorporamento. Di conseguenza, gli algoritmi di indicizzazione e ricerca usati dai database vettoriali sono ottimizzati per recuperare in modo efficiente i dati che possono essere usati downstream nelle applicazioni.

Esplora Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions è una libreria .NET sviluppata in collaborazione con il kernel semantico e l'ecosistema .NET più ampio per fornire un livello unificato di astrazioni per interagire con gli archivi vettoriali.

Le astrazioni in Microsoft.Extensions.VectorData.Abstractions forniscono agli autori e agli sviluppatori della libreria le funzionalità seguenti:

  • Eseguire operazioni di creazione-lettura-Update-Delete (CRUD) negli archivi vettoriali
  • Usare la ricerca vettoriale e di testo negli archivi vettoriali

Nota

La libreria Microsoft.Extensions.VectorData.Abstractions è attualmente disponibile in anteprima.

Creare l'app

Completare i passaggi seguenti per creare un'app console .NET in grado di eseguire le operazioni seguenti:

  • Creare e popolare un archivio vettoriale generando incorporamenti per un set di dati
  • Generare un embedding per la richiesta dell'utente
  • Eseguire una query sull'archivio vettoriale usando l'incorporamento del prompt dell'utente
  • Visualizza i risultati pertinenti dalla ricerca vettoriale
  1. In una directory vuota nel computer usare il comando dotnet new per creare una nuova app console:

    dotnet new console -o VectorDataAI
    
  2. Modificare la directory nella cartella dell'app:

    cd VectorDataAI
    
  3. Installare i pacchetti necessari:

    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
    

    L'elenco seguente descrive l'uso di ogni pacchetto nell'app 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
    

    L'elenco seguente descrive l'uso di ogni pacchetto nell'app VectorDataAI:

  4. Aprire l'app in Visual Studio Code (o nell'editor preferito).

    code .
    

Creare il servizio di intelligenza artificiale

Il repository GitHub di esempio è strutturato come modello dell'interfaccia della riga di comando per sviluppatori di Azure (azd), che azd può essere usato per effettuare il provisioning del servizio Azure OpenAI e del modello.

  1. Da un terminale o un prompt dei comandi passare alla src\quickstarts\azure-openai directory del repository di esempio.

  2. Eseguire il comando per effettuare il azd up provisioning delle risorse OpenAI di Azure. La creazione del Servizio Azure OpenAI e la distribuzione del modello possono richiedere alcuni minuti.

    azd up
    

    azd configura anche i segreti utente necessari per l'app di esempio, ad esempio l'endpoint OpenAI di Azure e il nome del modello.

Configurare l'app

  1. Passare alla directory principale del tuo progetto .NET da un terminale o da un prompt dei comandi.

  2. Usare i comandi seguenti per configurare la chiave API di OpenAI come segreto per l'app di esempio:

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

Aggiungere il codice dell'app

  1. Aggiungere una nuova classe denominata CloudService al progetto con le proprietà seguenti:

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

    Nel codice precedente:

    • Gli attributi C# forniti da Microsoft.Extensions.VectorData influenzano il modo in cui ogni proprietà viene gestita quando viene usata in un archivio vettoriale
    • La proprietà Vector archivia un embedded generato che rappresenta il significato semantico del Nome e della Descrizione per le ricerche vettoriali.
  2. Nel file Program.cs aggiungere il codice seguente per creare un set di dati che descrive una raccolta di servizi cloud:

    
    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. Creare e configurare un'implementazione IEmbeddingGenerator per inviare richieste a un modello AI di embedding.

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

    Nota

    DefaultAzureCredential cerca le credenziali di autenticazione dai tuoi strumenti locali. Se non si usa il modello azd per il provisioning della risorsa Azure OpenAI, è necessario assegnare il ruolo Azure AI Developer all'account usato per accedere a Visual Studio o all'Azure CLI. Per altre informazioni, vedere Eseguire l'autenticazione ai servizi di intelligenza artificiale di Azure con .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. Creare e popolare un archivio vettoriale con i dati del servizio cloud. Usare l'implementazione IEmbeddingGenerator per creare e assegnare un vettore di incorporamento per ogni record nei dati del servizio cloud:

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

    Gli incorporamenti sono rappresentazioni numeriche del significato semantico per ogni record di dati, che li rende compatibili con le funzionalità di ricerca vettoriale.

  5. Creare un'incorporazione per una query di ricerca e usarla per eseguire una ricerca vettoriale nell'archivio vettoriale.

    // 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. Usare il comando dotnet run per eseguire l'app:

    dotnet run
    

    L'app stampa il risultato principale della ricerca vettoriale, ovvero il servizio cloud più rilevante per la query originale. È possibile modificare la query per provare diversi scenari di ricerca.

Pulire le risorse

Quando l'applicazione o le risorse di esempio non sono più necessarie, rimuovere la distribuzione corrispondente e tutte le risorse.

azd down

Passaggi successivi