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 del modo in cui è stato indicizzato il contenuto vettoriale, la ricerca di corrispondenze pertinenti è esaustiva o vincolata ai vicini vicini 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 di ricerca vettoriale includono vicini k-near più completi (KNN) 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 KNN esaustivo

KnN esaustivo calcola le distanze tra tutte le coppie di punti dati e trova i vicini più vicini esatti k per un punto di query. È destinato agli scenari in cui il richiamo elevato è di massima importanza e gli utenti sono disposti ad accettare i compromessi nella latenza delle query. Poiché è a elevato utilizzo di calcolo, usare KNN completo per 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 seconary consiste nel creare un set di dati per valutare il richiamo approssimativo dell'algoritmo vicino più vicino. Il KNN completo può essere usato per costruire il set di verità sul terreno dei vicini più vicini.

Il supporto KNN completo è disponibile tramite l'API REST 2023-11-01, 2023-10-01-Preview API REST e nelle librerie client di Azure SDK destinate a entrambe le versioni dell'API REST.

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 grafo. 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 di ricerca. Ad esempio, in fase di query, è possibile specificare le opzioni per la ricerca completa, anche se il campo vettoriale è indicizzato per HNSW.

Durante l'esecuzione delle query, HNSW abilita query adiacenti veloci passando attraverso il grafico. Questo approccio consente di bilanciare l'accuratezza della ricerca e l'efficienza di calcolo. HNSW è consigliato per la maggior parte degli scenari a causa dell'efficienza durante la ricerca in set di dati di dimensioni maggiori.

Funzionamento della ricerca nei vicini più vicini

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 in un cluster di vettori che rappresentano documenti relativi agli hotel. L'identificazione dei vettori più simili alla query, in base a una metrica di somiglianza, determina quali documenti sono i più rilevanti.

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

Creazione del grafico HNSW

Durante l'indicizzazione, il servizio di ricerca costruisce il grafico HNSW. L'obiettivo dell'indicizzazione di un nuovo vettore in un grafico HNSW consiste nell'aggiungerlo alla struttura del grafo in modo da consentire una ricerca più efficiente nei vicini più vicini. La procedura seguente sintetizza il processo:

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

  2. Punto di ingresso: si tratta del primo livello del grafico gerarchico e funge da punto di partenza per l'indicizzazione.

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

    • Ogni nodo è connesso ai m vicini vicini. Questo è il m parametro .

    • Il numero di punti dati considerati come connessioni candidate è regolato dal efConstruction parametro . Questo elenco dinamico costituisce il set di punti più vicini nel grafico esistente da considerare per l'algoritmo. I valori più elevati efConstruction comportano la considerazione di più nodi, che spesso portano a quartieri locali più densi per ogni vettore.

    • Queste connessioni usano la somiglianza metric configurata 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 grafo: ciò può verificarsi dopo l'indicizzazione di tutti i vettori e migliora la navigazione e l'efficienza del grafico HNSW.

Una query vettoriale consente di esplorare la struttura gerarchica del grafo per cercare 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: attraversa quindi il livello del grafo per livello, passando 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 la 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ù vicini. 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 vicino alla query, che consente di perfezionare il set candidato di vettori, migliorando l'accuratezza.

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

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 è influenzato dalle lunghezze dei vettori diverse. Matematicamente, calcola l'angolo tra due vettori. Cosine è la metrica di somiglianza usata 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 essi. Matematicamente, calcola i prodotti delle grandezza dei vettori e l'angolo tra di essi. Per i vettori normalizzati, questo comportamento è identico alla cosine somiglianza, 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 k risultati. La @search.score proprietà contiene il punteggio. Nella tabella seguente viene illustrato l'intervallo entro il quale un punteggio cadrà.

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

Percosine la metrica, è importante notare che il valore calcolato @search.score non è il coseno tra il vettore di query e i vettori di documento. Ricerca di intelligenza artificiale di Azure applica invece trasformazioni in modo che la funzione score sia monotonicamente decrescente, il che significa che i valori dei punteggi diminuiscono sempre nel valore man mano che la somiglianza diventa peggiore. 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 coseno è definita come 1 - cosine_similarity.

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

Gli sviluppatori che hanno bisogno di un valore coseno anziché il 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 di risultati di bassa qualità.

Suggerimenti per l'ottimizzazione della pertinenza

Se non si ottengono risultati rilevanti, provare a modificare la configurazione delle query. Non esistono funzionalità di ottimizzazione specifiche, ad esempio un profilo di assegnazione dei punteggi o un campo o un boosting dei termini, per le query vettoriali:

  • Sperimentare le dimensioni e la sovrapposizione dei blocchi. Provare ad aumentare le dimensioni del blocco e verificare che ci sia una sovrapposizione 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 100 e 1.000.

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

  • Provare le query ibride con classificazione semantica. Nei test di benchmark questa combinazione ha prodotto in modo coerente i risultati più rilevanti.

Passaggi successivi