Condividi tramite


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

In questa guida introduttiva, si crea un'app console .NET in grado di 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.

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.

Informazioni sulle librerie

L'app usa le Microsoft.Extensions.AI librerie e Microsoft.Extensions.VectorData 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.

📦 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 create-read-update-delete (CRUD) negli archivi vettoriali.
  • Usare la ricerca vettoriale e di testo negli archivi vettoriali.

Nota

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

Prerequisiti

Prerequisiti

Creare l'app

Completare la procedura seguente per creare un'app console .NET in grado di:

  • Creare e popolare un archivio vettoriale generando incorporamenti per un set di dati.
  • Genera un embedding per la richiesta dell'utente.
  • Eseguire una query sull'archivio vettoriale usando la richiesta di incorporamento da parte dell'utente.
  • Visualizzare 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
    dotnet add package System.Linq.AsyncEnumerable
    

    L'elenco seguente descrive 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
    dotnet add package System.Linq.AsyncEnumerable
    

    L'elenco seguente descrive ogni pacchetto nell'app VectorDataAI :

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

    code .
    

Creare il servizio di intelligenza artificiale

  1. Per effettuare il provisioning di un servizio e un modello OpenAI di Azure, completare la procedura descritta nell'articolo Creare e distribuire una risorsa del servizio OpenAI di Azure .

  2. Dal terminale o dal prompt dei comandi, vai alla cartella principale della directory del progetto.

  3. Eseguire i comandi seguenti per configurare l'endpoint OpenAI di Azure e il nome del modello per l'app di esempio:

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_OPENAI_GPT_NAME <your-Azure-OpenAI-model-name>
    

Configurare l'app

  1. Vai alla radice del tuo progetto .NET da un terminale o da un prompt dei comandi.

  2. Eseguire i comandi seguenti per configurare la chiave API 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>
    

Nota

Per il nome del modello, è necessario specificare un modello di incorporamento del testo, text-embedding-3-small ad esempio o text-embedding-3-large per generare incorporamenti per la ricerca vettoriale nelle sezioni seguenti. Per altre informazioni sull'incorporamento dei modelli, vedere Incorporamenti.

Aggiungere il codice dell'app

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

    using Microsoft.Extensions.VectorData;
    
    namespace VectorDataAI;
    
    internal class CloudService
    {
        [VectorStoreKey]
        public int Key { get; set; }
    
        [VectorStoreData]
        public string Name { get; set; }
    
        [VectorStoreData]
        public string Description { get; set; }
    
        [VectorStoreVector(
            Dimensions: 384,
            DistanceFunction = DistanceFunction.CosineSimilarity)]
        public ReadOnlyMemory<float> Vector { get; set; }
    }
    

    Gli Microsoft.Extensions.VectorData attributi, ad esempio VectorStoreKeyAttribute, influenzano il modo in cui ogni proprietà viene gestita quando viene usata in un archivio vettoriale. La Vector proprietà archivia un incorporamento generato che rappresenta il significato semantico del valore per le Description ricerche vettoriali.

  2. Program.cs Nel file aggiungere il codice seguente per creare un set di dati che descrive una raccolta di servizi cloud:

    List<CloudService> cloudServices =
    [
        new() {
                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() {
                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() {
                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() {
                Key = 3,
                Name = "Microsoft Entra ID",
                Description = "Manage user identities and control access to your apps, data, and resources."
        },
        new() {
                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() {
                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.
    IConfigurationRoot 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())
            .GetEmbeddingClient(deploymentName: model)
            .AsIEmbeddingGenerator();
    

    Nota

    DefaultAzureCredential cerca le credenziali di autenticazione dai tuoi strumenti locali. Sarà necessario assegnare il Azure AI Developer ruolo all'account usato per accedere a Visual Studio o all'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Eseguire l'autenticazione ai servizi di intelligenza artificiale di Azure con .NET.

    // Load the configuration values.
    IConfigurationRoot 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))
          .GetEmbeddingClient(model: model)
          .AsIEmbeddingGenerator();
    
  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();
    VectorStoreCollection<int, CloudService> cloudServicesStore =
        vectorStore.GetCollection<int, CloudService>("cloudServices");
    await cloudServicesStore.EnsureCollectionExistsAsync();
    
    foreach (CloudService service in cloudServices)
    {
        service.Vector = await generator.GenerateVectorAsync(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.
    string query = "Which Azure service should I use to store my Word documents?";
    ReadOnlyMemory<float> queryEmbedding = await generator.GenerateVectorAsync(query);
    
    IAsyncEnumerable<VectorSearchResult<CloudService>> results =
        cloudServicesStore.SearchAsync(queryEmbedding, top: 1);
    
    await foreach (VectorSearchResult<CloudService> result in results)
    {
        Console.WriteLine($"Name: {result.Record.Name}");
        Console.WriteLine($"Description: {result.Record.Description}");
        Console.WriteLine($"Vector match score: {result.Score}");
    }
    
  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

Se non sono più necessari, eliminare la risorsa e la distribuzione del modello OpenAI di Azure.

  1. Nel portale di Azure passare alla risorsa OpenAI di Azure.
  2. Selezionare la risorsa OpenAI di Azure e quindi selezionare Elimina.

Passaggi successivi