La ricerca vettoriale e l'uso di embedding aprono nuove opportunità per gestire dati complessi, come immagini, testo e suoni. I vettori, essendo array ordinati di numeri (spesso float), rappresentano informazioni in modo compatto e comparabile. Azure OpenAI offre strumenti per creare embedding da testo e questi vettori possono essere salvati in database per analisi e ricerche successive in base alla loro similarità.
Di recente è stato introdotto il supporto ai vettori anche su Azure SQL Database permettendoci così di coniugare la ricerca per colonne e testo insieme a quelle dei vettori, prestandosi in maniera ottimale a realizzare RAG (Retrieval-Augmented Generation) utile soprattutto per i chat bot. Questa funzionalità è in preview ed è già disponibile sui database già in essere o su quelli futuri.
Per fare ciò SQL Server supporta il tipo di dato VECTOR, utilizzando un formato binario ottimizzato e accessibile anche come array JSON, e funzioni specifiche per calcoli, come VECTOR_DISTANCE, che misura la distanza tra due vettori tramite metriche come la distanza coseno. Per calcolare la distanza tra un vettore di query e i dati, si può usare una query SQL come questa:
DECLARE @v VECTOR(3) = '[0.5, -0.1, 0.8]'; SELECT TOP(10) id, title, VECTOR_DISTANCE('cosine', @v, title_vector) AS distance FROM [dbo].[wikipedia_articles] ORDER BY distance
Nell'esempio, @v è il vettore di esempio, e VECTOR_DISTANCE calcola la distanza coseno tra @v e i vettori dei titoli memorizzati. Ordinando per distanza, otteniamo i risultati più simili in cima alla lista.
Possiamo utilizzare tutto questo anche con Entity Framework Core mediante un pacchetto NuGet di nome EFCore.SqlServer.VectorSearch il quale introduce delle nuove funzioni da utilizzare con il framework. Prima di tutto dobbiamo configurare il contesto supportando i vettori ed impostare la colonna del modello con il tipo vector, come nell'esempio seguente.
public class ApplicationDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(o => o.UseVectorSearch()); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Configura la proprietà float[] come un vettore modelBuilder.Entity<Post>().Property(b => b.Embedding).HasColumnType("vector(1536)"); } public DbSet<Post> Posts { get; set; } }
Nella classe di dominio Post, definiamo di conseguenza una proprietà float[] per rappresentare l'embedding:
public class Post { public int Id { get; set; } public string Title { get; set; } public float[] Embedding { get; set; } = []; }
Questa configurazione permette di eseguire query sui vettori con Entity Framework Core, rendendo possibile il calcolo della somiglianza vettoriale direttamente nel database. Per farlo possiamo utilizzare la funzione VectorDistance all'interno delle nostre query, sia per ordinare che per le proiezioni.
float[] vector = CalcoloVettore(); var relatedPosts = db.Posts .Where(p => p.Blog.Name == "Sample Blog") .OrderBy(p => EF.Functions.VectorDistance("cosine", p.Embedding, vector)) .Select(p => new { p.Title, Distance = EF.Functions.VectorDistance("cosine", p.Embedding, vector)}) .Take(5) .ToArray();
Sono possibili anche altri tipi di ricerca, anche se quella per coseno è quella più utilizzata. L'uso dei vettori e delle operazioni di similarità semplifica ricerche semantiche avanzate e confronti tra grandi quantità di dati non strutturati, come il testo, ottimizzando l'esperienza utente nelle applicazioni di ricerca.
Per maggiori informazioni sui vettori di SQL Server rimandiamo alla documentazione https://learn.microsoft.com/en-us/sql/relational-databases/vectors/vectors-sql-server
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Supportare la sessione affinity di Azure App Service con Application Gateway
Configurare e gestire sidecar container in Azure App Service
Eliminare una project wiki di Azure DevOps
Triggerare una pipeline su un altro repository di Azure DevOps
Eseguire i worklow di GitHub su runner potenziati
Assegnare un valore di default a un parametro di una lambda in C#
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Rendere le variabili read-only in una pipeline di Azure DevOps
- Utilizzare l'attributo accesskey in HTML
- Generare una User Delegation SAS in .NET per Azure Blob Storage
- Nuova preview per Expression Interactive Designer