Condividi tramite


Panoramica delle ricerche vettoriali e degli indici vettoriali nel motore di database SQL

Si applica a: SQL Server 2025 (17.x) Anteprima del databaseSQL di Azure Istanza gestita di SQL di Azurein Microsoft Fabric

I vettori sono matrici ordinate di numeri (in genere float) che possono rappresentare informazioni su alcuni dati. Ad esempio, un'immagine può essere rappresentata come vettore di valori pixel oppure una stringa di testo può essere rappresentata come vettore di valori ASCII. Il processo per trasformare i dati in un vettore è denominato vettorializzazione.

Annotazioni

Incorporamenti

Gli incorporamenti sono vettori che rappresentano caratteristiche importanti dei dati. Gli incorporamenti vengono spesso appresi con un modello di Deep Learning e i modelli di apprendimento automatico e intelligenza artificiale li usano come funzionalità. Gli incorporamenti possono inoltre acquisire la somiglianza semantica tra concetti simili. Ad esempio, durante la generazione di un incorporamento per le parole person e human, ci si aspetterebbe che gli incorporamenti (rappresentazione vettoriale) siano simili in valore, poiché anche le parole sono semanticamente simili.

Azure OpenAI offre modelli per creare incorporamenti da dati di testo. Il servizio suddivide il testo in token e genera incorporamenti usando modelli sottoposti a training preliminare da OpenAI. Per altre informazioni, consultare Creazione di incorporamenti con Azure OpenAI.

Dopo aver generato gli incorporamenti, possono essere archiviati in un database di SQL Server. Ciò consente di archiviare gli incorporamenti insieme ai dati rappresentati e di eseguire query di ricerca vettoriali per trovare punti dati simili.

La ricerca vettoriale si riferisce al processo di ricerca di tutti i vettori in un set di dati simile a un vettore di query specifico. Pertanto, un vettore di query per la parola human cerca nell'intero dataset vettori simili e quindi parole simili: in questo esempio dovrebbe trovare la parola person come corrispondenza stretta. Questa vicinanza, o distanza, viene misurata usando una metrica di distanza, ad esempio la distanza del coseno. Quanto più i vettori sono vicini, tanto più sono simili.

SQL Server offre il supporto predefinito per i vettori tramite il tipo di dati vector . I vettori vengono archiviati in un formato binario ottimizzato, ma esposti come matrici JSON per praticità. Ogni elemento del vettore viene archiviato usando un valore a virgola mobile a precisione singola (4 byte). Insieme al tipo di dati sono disponibili funzioni dedicate per operare su vettori. Ad esempio, è possibile trovare la distanza tra due vettori usando la funzione VECTOR_DISTANCE . La funzione restituisce un valore scalare con la distanza tra due vettori in base alla metrica di distanza specificata.

Poiché i vettori vengono in genere gestiti come matrici di float, la creazione di un vettore può essere eseguita semplicemente eseguendo il cast di una matrice JSON a un tipo di dati vector . Ad esempio, il codice seguente crea un vettore da una matrice JSON:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

oppure, usando il cast implicito

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

Lo stesso vale per la conversione di un vettore in una matrice JSON:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

Ricerca esatta e distanza vettoriale (vicini esatti)

Ricerca esatta, nota anche come ricerca k-Nearest Neighbor (k-NN), comporta il calcolo della distanza tra un determinato vettore e tutti gli altri vettori in un set di dati, l'ordinamento dei risultati e la selezione dei vicini più vicini in base a una metrica di distanza specificata. Questo metodo garantisce un recupero preciso dei vicini più vicini, ma può essere a elevato utilizzo di calcolo, soprattutto per set di dati di grandi dimensioni.

Le funzioni Vector Distance vengono usate per misurare la vicinanza tra vettori. Le metriche di distanza comuni includono distanza euclidea, somiglianza del coseno e prodotto punto. Queste funzioni sono essenziali per eseguire ricerche k-NN e garantire risultati accurati.

Exact Nearest Neighbor (ENN) Vector Search esegue un calcolo completo della distanza tra tutti i vettori indicizzati per garantire il recupero dei vicini più vicini in base a una metrica di distanza specificata. Questo metodo è preciso ma a elevato utilizzo di risorse, rendendolo adatto per set di dati o scenari più piccoli in cui l'accuratezza è fondamentale.

Nel motore di database SQL, è possibile eseguire ricerche k-NN usando la funzione VECTOR_DISTANCE , che consente un calcolo efficiente delle distanze tra vettori e facilita il recupero dei vicini più vicini.

Nell'esempio seguente viene illustrato come eseguire k-NN per restituire i primi 10 vettori più simili archiviati nella content_vector tabella al vettore @qvdi query specificato.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' model Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) as distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

L'uso di una ricerca esatta è consigliato quando non si dispone di molti vettori per la ricerca (meno di 50.000 vettori come raccomandazione generale). La tabella può contenere molti più vettori, purché i predicati di ricerca riducano il numero di vettori da usare per la ricerca adiacente a 50.000 o meno.

Indice vettoriale approssimativo e ricerca vettoriale (Vicini più prossimi approssimativi)

L'identificazione di tutti i vettori vicini a un determinato vettore di query richiede risorse sostanziali per calcolare la distanza tra il vettore di query e i vettori archiviati nella tabella. La ricerca di tutti i vettori vicino a un determinato vettore di query comporta un'analisi completa della tabella e un utilizzo significativo della CPU. Si tratta di una query "K-Nearest Neighbors" o "KNN" e restituisce i "k" vettori più vicini.

I vettori vengono usati per trovare dati simili per i modelli di intelligenza artificiale per rispondere alle query degli utenti. Ciò comporta l'esecuzione di query sul database per i vettori "k" più vicini al vettore di query usando metriche di distanza come il prodotto punto (interno), la somiglianza del coseno o la distanza euclidea.

Le query KNN spesso hanno difficoltà con la scalabilità, rendendo accettabile in molti casi sacrificare un certo grado di accuratezza, in particolare la richiamata, per ottenere miglioramenti significativi in termini di velocità. Questo metodo è noto come Nearest Neighbors (ANN) approssimativo.

Il richiamo è un concetto importante che deve acquisire familiarità con tutti gli utenti che usano o pianificano l'uso di vettori e incorporamenti. In effetti, il richiamo misura la proporzione dei vicini più vicini approssimativi identificati dall'algoritmo, rispetto agli esatti vicini più vicini restituiti da una ricerca completa. Pertanto, è una buona misurazione della qualità dell'approssimazione eseguita dall'algoritmo. Un richiamo perfetto, equivalente a nessuna approssimazione, è 1.

Per le applicazioni di intelligenza artificiale, il compromesso è abbastanza ragionevole. Poiché gli embedding vettoriali approssimano già i concetti, l'uso di ANN non influisce significativamente sui risultati, purché il recall sia vicino a 1. Ciò garantisce che i risultati restituiti siano molto simili a quelli di KNN, offrendo prestazioni notevolmente migliorate e un utilizzo delle risorse notevolmente ridotto, che è estremamente vantaggioso per i database operativi.

È importante comprendere che il termine "index" quando si fa riferimento a un indice vettoriale ha un significato diverso rispetto all'indice usato per lavorare nei database relazionali. Infatti, un indice vettoriale restituisce risultati approssimativi.

Nel motore MSSQL gli indici vettoriali si basano sull'algoritmo DiskANN . DiskANN si basa sulla creazione di un grafico per spostarsi rapidamente tra tutti i vettori indicizzati per trovare la corrispondenza più vicina a un determinato vettore. DiskANN è un sistema basato su grafo per l'indicizzazione e la ricerca di grandi set di dati vettoriali usando risorse di calcolo limitate. Usa in modo efficiente unità SSD e memoria minima per gestire più dati rispetto agli indici in memoria, mantenendo al contempo query elevate al secondo e bassa latenza, garantendo un equilibrio tra memoria, utilizzo CPU e I/O e prestazioni di ricerca.

È possibile eseguire prima una ricerca di algoritmi Nearest Neighbors approssimativi creando un indice vettoriale usando il comando CREATE VECTOR INDEX T-SQL e quindi usando VECTOR_SEARCH funzione T-SQL per eseguire la ricerca approssimativa.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' model Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] as t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance