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.
I database vettoriali archiviano e gestiscono incorporamenti vettoriali. Gli incorporamenti sono rappresentazioni numeriche di dati che mantengono il significato semantico. Parole, documenti, immagini, audio e altri tipi di dati possono essere tutti vettorizzati. È possibile usare gli incorporamenti per aiutare un modello di intelligenza artificiale a comprendere il significato degli input in modo da poter eseguire confronti e trasformazioni, ad esempio riepilogando il testo, trovando dati correlati contestualmente o creando immagini da descrizioni di testo.
È possibile, ad esempio, usare un database vettoriale per eseguire le azioni seguenti:
- Identificare immagini, documenti e canzoni simili in base ai relativi contenuti, temi, valutazioni e stili.
- Identificare prodotti simili in base alle relative caratteristiche e funzionalità e ai rispettivi gruppi utenti.
- Consigliare contenuti, prodotti o servizi in base alle preferenze utente.
- Identificare le migliori opzioni potenziali per soddisfare requisiti complessi da un ampio pool di scelte.
- Identificare anomalie dei dati o attività fraudolente diverse dai criteri normali o predominanti.
Informazioni sulla ricerca vettoriale
I database vettoriali offrono funzionalità di ricerca vettoriale in grado di trovare elementi simili in base alle caratteristiche dei dati anziché cercando corrispondenze esatte in un campo di proprietà. La ricerca vettoriale funziona analizzando le rappresentazioni vettoriali dei dati creati usando un modello di incorporamento di intelligenza artificiale, ad esempio Azure modelli di incorporamento OpenAI. Il processo di ricerca misura la distanza tra i vettori di dati e il vettore di query. I vettori di dati più vicini al vettore di query sono quelli più simili semanticamente.
La maggior parte dei prodotti di database moderni supporta la ricerca vettoriale insieme all'esecuzione di query tradizionali; questo è il caso di Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL e molti altri prodotti principali. In alternativa, esiste un'ampia gamma di prodotti di database vettoriali dedicati e specializzati. Questi prodotti sono altamente ottimizzati per eseguire la ricerca vettoriale e vengono in genere installati insieme a un database tradizionale esclusivamente per gestire i carichi di lavoro di ricerca vettoriale.
Flussi di lavoro di ricerca vettoriale con .NET e OpenAI
I database vettoriali e le relative funzionalità di ricerca sono particolarmente utili nei flussi di lavoro RAG con Azure OpenAI. Questo modello consente di aumentare il modello di intelligenza artificiale con conoscenze semantiche aggiuntive sui dati. Un flusso di lavoro di intelligenza artificiale comune che usa i database vettoriali include questi passaggi:
- Creare incorporamenti per i dati usando un modello di incorporamento OpenAI.
- Archiviare e indicizzare gli incorporamenti in un database vettoriale o in un servizio di ricerca.
- Convertire in incorporamenti le richieste utente provenienti dall'applicazione.
- Esegui una ricerca vettoriale nei tuoi dati, confrontando l'embedding del prompt dell'utente con gli embedding nel tuo database.
- Usare un modello linguistico, come gpt-4o, per assemblare un completamento facile da usare dai risultati della ricerca vettoriale.
Per un esempio pratico di questo flusso, vedere l'esercitazione Implement Azure OpenAI con RAG usando la ricerca vettoriale in un'app .NET.
Altri vantaggi del modello RAG includono:
- Capacità di generare risposte contestualmente pertinenti e accurate alle richieste degli utenti da modelli di intelligenza artificiale.
- Superare i limiti dei token LLM: l'operazione intensiva viene eseguita tramite la ricerca vettoriale nel database.
- Riduzione dei costi derivanti dall'ottimizzazione frequente dei dati aggiornati.
The Microsoft.Extensions.VectorData library
Per usare la ricerca vettoriale da .NET, è possibile usare il normale driver di database o l'SDK senza richiedere librerie o API aggiuntive. Ad esempio, in SQL Server, la ricerca vettoriale può essere eseguita in T-SQL quando si usa il driver .NET standard SqlClient. Tuttavia, l'accesso alla ricerca vettoriale in questo modo è spesso di basso livello, richiede un processo complesso per gestire la serializzazione/deserializzazione e il codice risultante non è trasferibile tra i database.
In alternativa, il pacchetto 📦 Microsoft.Extensions.VectorData.Abstractions fornisce un livello unificato di astrazioni per interagire con gli archivi vettoriali in .NET. Queste astrazioni consentono di scrivere codice semplice di alto livello in una singola API e di scambiare l'archivio vettoriale sottostante con modifiche minime all'applicazione.
La libreria offre le funzionalità chiave seguenti:
- Mappatura senza soluzione di continuità dei tipi .NET: mappatura del tipo .NET direttamente nel database, simile a un mapper oggetti/relazionale.
- Modello di dati unificato: definire il modello di dati una volta usando gli attributi .NET e usarlo in qualsiasi archivio vettoriale supportato.
- Operazioni CRUD: creare, leggere, aggiornare ed eliminare record in un archivio vettoriale.
- Ricerca vettoriale e ibrida: eseguire query sui record in base alla somiglianza semantica usando la ricerca vettoriale o combinare la ricerca di vettori e testo per la ricerca ibrida.
- Gestione della generazione di incorporamento: configurare il generatore di incorporamento una sola volta e consentire alla libreria di gestire in modo trasparente la generazione.
- Gestione raccolta: creare, elencare ed eliminare raccolte (tabelle o indici) in un archivio vettoriale.
Microsoft. Extensions.VectorData è anche il blocco predefinito per livelli aggiuntivi di livello superiore che devono interagire con il database vettoriale. Ad esempio, il Microsoft. Extensions.DataIngestion.
Microsoft.Extensions.VectorData e Entity Framework Core
Se si usa già Entity Framework Core per accedere al database, è probabile che il provider di database supporti già la ricerca vettoriale e le query LINQ possano essere usate per esprimere tali ricerche; Microsoft. Extensions.VectorData non è necessariamente necessario in tali applicazioni. Tuttavia, la maggior parte dei database vettoriali dedicati non è supportata da EF Core e Microsoft. Extensions.VectorData può offrire un'esperienza ottimale per l'uso di tali elementi. Inoltre, è anche possibile trovare se stessi usando EF e Microsoft. Extensions.VectorData nella stessa applicazione, ad esempio quando si usa un livello aggiuntivo, ad esempio Microsoft. Extensions.DataIngestion.
Astrazioni chiave
Ecco un esempio end-to-end minimo che crea una raccolta, aggiorna/inserisce record ed esegue una ricerca vettoriale:
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;
// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;
// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();
// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });
// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}
// Define the data model
class Movie
{
[VectorStoreKey]
public int Key { get; set; }
[VectorStoreData]
public string Title { get; set; }
[VectorStoreVector(Dimensions: 1536)]
public string Description { get; set; }
}
Provider di archivi vettoriali
Il pacchetto Microsoft.Extensions.VectorData.Abstractions definisce le astrazioni e i pacchetti provider forniscono implementazioni per database vettoriali specifici. Scegliere il provider che corrisponde al database vettoriale, ad esempio Microsoft. SemanticKernel.Connectors.AzureAISearch.
Annotazioni
Nonostante l'inclusione di "SemanticKernel" nei nomi dei pacchetti, questi provider non hanno nulla a che fare con Kernel semantico e sono utilizzabili ovunque in .NET, incluso Agent Framework.
Tutti i provider implementano le stesse VectorStore classi e VectorStoreCollection<TKey,TRecord> astratte, quindi è possibile passare da una classe all'altra senza modificare la logica dell'applicazione.
Suggerimento
Usare il provider in memoria (Microsoft. SemanticKernel.Connectors.InMemory) durante lo sviluppo/prototipazione iniziale, non richiede alcun servizio o configurazione esterno ed è possibile scambiarlo per un provider di produzione in un secondo momento. Evitare di usare il provider InMemory per i test, perché possono esserci differenze importanti tra questo provider e il database di produzione. Provare a usare testcontainer per eseguire test sul sistema di database di produzione.