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
- .NET 8.0 SDK o versione successiva: Installare .NET 8.0 SDK.
- Una chiave API da OpenAI per poter eseguire questo esempio.
Prerequisiti
- .NET 8.0 SDK o versione successiva: Installare .NET 8 SDK.
- Una sottoscrizione di Azure: crearne una gratuitamente.
- Accedere al Servizio OpenAI di Azure.
- Interfaccia della riga di comando per sviluppatori di Azure (facoltativo): installare o aggiornare l'interfaccia della riga di comando per sviluppatori di Azure.
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
In una directory vuota nel computer usare il comando
dotnet new
per creare una nuova app console:dotnet new console -o VectorDataAI
Modificare la directory nella cartella dell'app:
cd VectorDataAI
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
:-
Azure.Identity
fornisce supporto per l'autenticazione token diMicrosoft Entra ID
nell'intero SDK di Azure usando classi comeDefaultAzureCredential
. -
Azure.AI.OpenAI
è il pacchetto ufficiale per l'uso della libreria .NET di OpenAI con il servizio OpenAI di Azure. -
Microsoft.SemanticKernel.Connectors.InMemory
fornisce una classe per l'archiviazione in memoria di record di dati vettoriali interrogabili. -
Microsoft.Extensions.VectorData.Abstractions
abilita le operazioni di tipo CRUD (Create-Read-Update-Delete) e di ricerca negli archivi vettoriali. - Microsoft.Extensions.Configuration fornisce l'implementazione della configurazione basata su coppie chiave-valore.
-
Microsoft.Extensions.Configuration.UserSecrets
è un'implementazione del provider di configurazione dei segreti utente perMicrosoft.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
L'elenco seguente descrive l'uso di ogni pacchetto nell'app
VectorDataAI
:-
Microsoft.Extensions.AI.OpenAI
fornisce astrazioni di intelligenza artificiale per i modelli o gli endpoint compatibili con OpenAI. Questa libreria include anche come dipendenza la libreria ufficialeOpenAI
per l'API del servizio OpenAI. -
Microsoft.SemanticKernel.Connectors.InMemory
fornisce una classe di archivio vettoriale in memoria per contenere record di dati vettoriali interrogabili. -
Microsoft.Extensions.VectorData.Abstractions
abilita le operazioni Crea-Leggi-Update-Delete (CRUD) e di ricerca negli archivi vettoriali. - Microsoft.Extensions.Configuration fornisce l'implementazione della configurazione basata su coppie chiave-valore.
-
Microsoft.Extensions.Configuration.UserSecrets
è un'implementazione del provider di configurazione dei segreti utente perMicrosoft.Extensions.Configuration
.
-
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.
Da un terminale o un prompt dei comandi passare alla
src\quickstarts\azure-openai
directory del repository di esempio.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
Passare alla directory principale del tuo progetto .NET da un terminale o da un prompt dei comandi.
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
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.
- Gli attributi C# forniti da
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." }
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 ruoloAzure 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);
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.
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(); }
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