Rilevanza nella ricerca vettoriale

Durante l'esecuzione di query vettoriali, il motore di ricerca cerca vettori simili per trovare i candidati migliori da restituire nei risultati della ricerca. A seconda di come è stato indicizzato il contenuto vettoriale, la ricerca di corrispondenze rilevanti è esaustiva o vincolata ai vicini più prossimi per un'elaborazione più rapida. Dopo aver trovato i candidati, le metriche di somiglianza vengono usate per assegnare un punteggio a ogni risultato in base alla forza della corrispondenza.

Questo articolo illustra gli algoritmi usati per trovare corrispondenze pertinenti e le metriche di somiglianza usate per l'assegnazione dei punteggi. Offre anche suggerimenti per migliorare la pertinenza se i risultati della ricerca non soddisfano le aspettative.

Gli algoritmi della ricerca vettoriale includono k vicini più prossimi (KNN) esaustivi e HNSW (Hierarchical Navigable Small World).

Solo i campi vettoriali contrassegnati come searchable nell'indice o come searchFields nella query vengono usati per la ricerca e l'assegnazione dei punteggi.

Quando usare il KNN esaustivo

Il KNN esaustivo calcola le distanze tra tutte le coppie di punti dati e trova i vicini più prossimi esatti k per un punto di query. È destinato a scenari in cui il richiamo elevato è della massima importanza e gli utenti sono disposti ad accettare i compromessi nella latenza delle query. Considerata l'elevata intensità di calcolo, usare il KNN esaustivo per i set di dati di piccole e medie dimensioni o quando i requisiti di precisione superano le considerazioni sulle prestazioni delle query.

Un caso d'uso secondario consiste nel creare un set di dati per valutare il richiamo approssimativo dell'algoritmo del vicino più prossimo. Il KNN completo può essere usato per creare il set di dati ground truth dei vicini più prossimi.

Quando usare HNSW

Durante l'indicizzazione, HNSW crea strutture di dati aggiuntive per una ricerca più veloce, organizzando i punti dati in una struttura gerarchica del grafico. HNSW include diversi parametri di configurazione che possono essere ottimizzati per ottenere la velocità effettiva, la latenza e gli obiettivi di richiamo per l'applicazione della ricerca. Ad esempio, in fase di query, è possibile specificare le opzioni per la ricerca esaustiva, anche se il campo vettoriale è indicizzato per HNSW.

Durante l'esecuzione della query, HNSW abilita le query adiacenti veloci navigando attraverso il grafico. Questo approccio raggiunge un equilibrio tra accuratezza della ricerca ed efficienza di calcolo. HNSW è consigliato per la maggior parte degli scenari grazie alla sua efficienza durante la ricerca in set di dati di grandi dimensioni.

Funzionamento della ricerca nei vicini più prossimi

Le query vettoriali vengono eseguite su uno spazio di incorporamento costituito da vettori generati dallo stesso modello di incorporamento. In genere, il valore di input all'interno di una richiesta di query viene inserito nello stesso modello di Machine Learning che ha generato incorporamenti nell'indice vettoriale. L'output è un vettore nello stesso spazio di incorporamento. Poiché i vettori simili vengono raggruppati insieme, la ricerca di corrispondenze equivale a trovare i vettori più vicini al vettore di query e restituire i documenti associati come risultato della ricerca.

Ad esempio, se una richiesta di query riguarda gli hotel, il modello esegue il mapping della query in un vettore esistente da qualche parte in un cluster di vettori che rappresentano documenti relativi agli hotel. Identificare quali vettori sono i più simili alla query, in base a una metrica di somiglianza, determina quali documenti sono i più rilevanti.

Quando i campi vettoriali sono indicizzati per un KNN esaustivo, la query viene eseguita su "tutti gli elementi adiacenti". Per i campi indicizzati per HNSW, il motore di ricerca usa un grafico HNSW per cercare su un subset di nodi all'interno dell'indice vettoriale.

Creazione del grafico HNSW

Durante l'indicizzazione, il servizio di ricerca crea il grafico HNSW. L'obiettivo di indicizzare un nuovo vettore in un grafico HNSW è quello di aggiungerlo alla struttura del grafico in un modo che consenta un'efficiente ricerca del vicino più prossimo. La procedura seguente sintetizza il processo:

  1. Inizializzazione: inizia con un grafico HNSW vuoto o il grafico HNSW esistente se non è un nuovo indice.

  2. Punto di ingresso: questo è il livello superiore del grafico gerarchico e funge da punto di partenza per l'indicizzazione.

  3. Aggiunta al grafico: livelli gerarchici diversi rappresentano granularità del grafico diverse, con livelli superiori più globali e livelli inferiori più granulari. Ogni nodo del grafico rappresenta un punto vettoriale.

    • Ogni nodo è connesso a un massimo di m vicini che si trovano nelle vicinanze. Si tratta del parametro m.

    • Il numero di punti dati considerati come connessioni candidate è regolato dal parametro efConstruction. Questo elenco dinamico costituisce il set di punti più vicini nel grafico esistente da prendere in considerazione per l'algoritmo. Valori di efConstruction più elevati si traducono in più nodi da prendere in considerazione, il che porta spesso a quartieri locali più densi per ogni vettore.

    • Queste connessioni usano la somiglianza configurata metric per determinare la distanza. Alcune connessioni sono connessioni a "lunga distanza" che si connettono tra diversi livelli gerarchici, creando collegamenti nel grafico che migliorano l'efficienza della ricerca.

  4. Eliminazione e ottimizzazione del grafico: ciò può verificarsi dopo l'indicizzazione di tutti i vettori e migliora la navigazione e l'efficienza del grafico HNSW.

Una query vettoriale esplora la struttura gerarchica del grafico per cercare le corrispondenze. Di seguito sono riepilogati i passaggi del processo:

  1. Inizializzazione: l'algoritmo avvia la ricerca al livello superiore del grafico gerarchico. Questo punto di ingresso contiene il set di vettori che fungono da punti di partenza per la ricerca.

  2. Attraversamento: successivamente, attraversa il grafico livello per livello, navigando dal livello superiore ai livelli inferiori, selezionando i nodi candidati più vicini al vettore di query in base alla metrica della distanza configurata, ad esempio somiglianza del coseno.

  3. Eliminazione: per migliorare l'efficienza, l'algoritmo elimina lo spazio di ricerca considerando solo i nodi che probabilmente contengono i vicini più prossimi. Questa operazione viene ottenuta mantenendo una coda di priorità dei potenziali candidati e aggiornandola man mano che la ricerca procede. La lunghezza di questa coda viene configurata dal parametro efSearch.

  4. Perfezionamento: man mano che l'algoritmo passa a livelli più bassi e più granulari, HNSW considera più vicini adiacenti alla query, che consente di perfezionare il set di vettori candidati, migliorando l'accuratezza.

  5. Completamento: la ricerca viene completata quando è stato identificato il numero desiderato di vicini più prossimi o quando vengono soddisfatti altri criteri di arresto. Questo numero desiderato di vicini più prossimi è regolato dal parametro query-time k.

Metriche di somiglianza usate per misurare la prossimità

L'algoritmo trova vettori candidati per valutare la somiglianza. Per eseguire questa attività, un calcolo delle metriche di somiglianza confronta il vettore candidato con il vettore di query e misura la somiglianza. L'algoritmo tiene traccia del set ordinato di vettori più simili trovati, che costituisce il set di risultati classificato quando l'algoritmo ha raggiunto il completamento.

Metrico Descrizione
cosine Questa metrica misura l'angolo tra due vettori e non è influenzata dalle lunghezze dei vettori diverse. Matematicamente, calcola l'angolo tra due vettori. Il coseno è la metrica di somiglianza utilizzata dai modelli di incorporamento di Azure OpenAI, quindi se si usa Azure OpenAI, specificare cosine nella configurazione del vettore.
dotProduct Questa metrica misura sia la lunghezza di ogni coppia di due vettori che l'angolo tra di loro. Matematicamente, calcola i prodotti delle grandezza dei vettori e l'angolo tra di loro. Per i vettori normalizzati, questo comportamento è identico alla somiglianza cosine, ma leggermente più efficiente.
euclidean (noto anche come l2 norm) Questa metrica misura la lunghezza della differenza del vettore tra due vettori. Matematicamente, calcola la distanza euclidea tra due vettori, che è la norma l2 della differenza dei due vettori.

Punteggi nei risultati della ricerca vettoriale

I punteggi vengono calcolati e assegnati a ogni corrispondenza, con le corrispondenze più alte restituite come risultati k. La proprietà @search.score contiene il punteggio. Nella tabella seguente viene illustrato l'intervallo entro il quale cadrà un punteggio.

Metodo di ricerca Parametro Metrica di assegnazione dei punteggi Intervallo
ricerca vettoriale @search.score Coseno 0.333 - 1.00

Per la metrica cosine, è importante notare che il @search.score calcolato non è il valore coseno tra il vettore di query e i vettori del documento. Azure AI Search applica invece trasformazioni in modo che la funzione score sia monotonicamente decrescente, il che significa che i valori dei punteggi diminuiranno sempre di valore man mano che la somiglianza peggiora. Questa trasformazione garantisce che i punteggi di ricerca siano utilizzabili a scopo di classificazione.

Esistono alcune sfumature con punteggi di somiglianza:

  • La somiglianza del coseno è definita come il coseno dell'angolo tra due vettori.
  • La distanza del coseno è definita come 1 - cosine_similarity.

Per creare una funzione monotonicamente decrescente, @search.score viene definito come 1 / (1 + cosine_distance).

Gli sviluppatori che hanno bisogno di un valore coseno anziché del valore sintetico possono usare una formula per convertire il punteggio di ricerca in distanza coseno:

double ScoreToSimilarity(double score)
{
    double cosineDistance = (1 - score) / score;
    return  -cosineDistance + 1;
}

Avere il valore del coseno originale può essere utile nelle soluzioni personalizzate che configurano soglie per ridurre i risultati dei risultati di bassa qualità.

Suggerimenti per l'ottimizzazione della pertinenza

Se non si ottengono risultati pertinenti, sperimentare le modifiche apportate alla configurazione delle query. Non esistono funzionalità di ottimizzazione specifiche, ad esempio un profilo di punteggio o un potenziamento del campo o del termine, per le query vettoriali:

  • Sperimentare con le dimensioni delblocco e la sovrapposizione. Provare ad aumentare le dimensioni del blocco e verificare che la sovrapposizione sia sufficiente per mantenere il contesto o la continuità tra blocchi.

  • Per HNSW, provare diversi livelli di efConstruction per modificare la composizione interna del grafico di prossimità. Il valore predefinito è 400. L'intervallo è compreso tra i valori 100 e 1,000.

  • Aumentare i risultati k per inserire più risultati di ricerca in un modello di chat, se ne si usa uno.

  • Provare query ibride con classificazione semantica. Nei test di benchmark, questa combinazione ha prodotto costantemente i risultati più rilevanti.

Passaggi successivi