Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
- .NET 8.0 SDK o versione successiva - Installare il .NET 8.0 SDK.
- Una chiave API da OpenAI in modo da poter eseguire questo esempio.
Prerequisiti
- .NET 8.0 SDK o versione successiva: Installare il .NET 8 SDK.
- Un abbonamento ad Azure - Creane uno gratuitamente.
- Interfaccia della riga di comando per sviluppatori di Azure (facoltativa): installare o aggiornare l'interfaccia della riga di comando per sviluppatori di Azure.
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.
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 dotnet add package System.Linq.AsyncEnumerable
L'elenco seguente descrive 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.Extensions.VectorData.Abstractions
abilita le operazioni di tipo CRUD (Create-Read-Update-Delete) e di ricerca negli archivi vettoriali. -
Microsoft.SemanticKernel.Connectors.InMemory
fornisce una classe per l'archiviazione in memoria di record di dati vettoriali interrogabili. - Microsoft.Extensions.Configuration fornisce un'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 dotnet add package System.Linq.AsyncEnumerable
L'elenco seguente descrive 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.Extensions.VectorData.Abstractions
abilita le operazioni di tipo CRUD (Create-Read-Update-Delete) e di ricerca negli archivi vettoriali. -
Microsoft.SemanticKernel.Connectors.InMemory
fornisce una classe per l'archiviazione in memoria di record di dati vettoriali interrogabili. - Microsoft.Extensions.Configuration fornisce un'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
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 .
Dal terminale o dal prompt dei comandi, vai alla cartella principale della directory del progetto.
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
Vai alla radice del tuo progetto .NET da un terminale o da un prompt dei comandi.
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
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 leDescription
ricerche vettoriali.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." } ];
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();
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.
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}"); }
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.