Comprimere i vettori usando la quantizzazione scalare o binaria
Ricerca di intelligenza artificiale di Azure supporta la quantizzazione scalare e binaria per ridurre le dimensioni dei vettori in un indice di ricerca. La quantizzazione è consigliata per ridurre le dimensioni del vettore perché riduce sia il consumo di memoria che di archiviazione su disco per gli incorporamenti float16 e float32. Per compensare gli effetti della compressione con perdita di dati, è possibile aggiungere sovracampionamento e riesemplificamento su vettori non compressi.
Per usare la quantizzazione predefinita, seguire questa procedura:
- Iniziare con i campi vettoriali e una
vectorSearch
configurazione per un indice - Aggiungere
vectorSearch.compressions
- Aggiungere una configurazione di
scalarQuantization
obinaryQuantization
e assegnare ad essa un nome - Impostare proprietà facoltative per attenuare gli effetti dell'indicizzazione con perdita di dati
- Creare un nuovo profilo vettoriale che usa la configurazione denominata
- Creare un nuovo campo vettore con il nuovo profilo vettoriale
- Caricare l'indice con dati float32 o float16 quantizzati durante l'indicizzazione con la configurazione definita
- Facoltativamente, eseguire una query sui dati quantizzati usando il parametro di sovracampionamento se si vuole eseguire l'override del valore predefinito
Prerequisiti
- Campi vettoriali in un indice di ricerca con una
vectorSearch
configurazione, usando gli algoritmi HNSW (Navigable Small Worlds) gerarchici o gli algoritmi K-nearest neighbor (eKNN) completi e un nuovo profilo vettoriale.
Tecniche di quantizzazione supportate
La quantizzazione si applica ai campi vettoriali che ricevono vettori di tipo float. Negli esempi di questo articolo il tipo di dati del campo è Collection(Edm.Single)
per gli incorporamenti float32 in ingresso, ma è supportato anche float16. Quando i vettori vengono ricevuti in un campo con compressione configurata, il motore esegue automaticamente la quantizzazione per ridurre il footprint dei dati vettoriali in memoria e su disco.
Sono supportati due tipi di quantizzazione:
La quantizzazione scalare comprime i valori float in tipi dati maggiormente narrow. AI Search supporta attualmente int8, ovvero 8 bit, riducendo le dimensioni dell'indice vettoriale quattro volte.
La quantizzazione binaria converte float in bit binari, che richiede 1 bit. Ciò comporta fino a 28 volte la riduzione delle dimensioni dell'indice vettoriale.
Aggiungere "compressioni" a un indice di ricerca
Nell'esempio seguente viene illustrata una definizione di indice parziale con una raccolta campi che include un campo vettoriale e una sezione vectorSearch.compressions
.
Include entrambi scalarQuantization
o binaryQuantization
. È possibile specificare il numero di configurazioni di compressione necessarie e quindi assegnare quelle desiderate a un profilo vettoriale.
La sintassi per vectorSearch.Compressions
varia tra le API REST stabili e di anteprima, con l'anteprima aggiungendo nuove opzioni per l'ottimizzazione dell'archiviazione, oltre alle modifiche alla sintassi esistente. La compatibilità con le versioni precedenti viene mantenuta tramite mapping delle API interne, ma è consigliabile adottare la nuova sintassi nel codice destinato a versioni future e 2024-11-01-preview.
Usare l'API REST Crea indice o Crea o Aggiorna indice per configurare le impostazioni di compressione.
POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01
{
"name": "my-index",
"fields": [
{ "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
{ "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
{ "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
],
"vectorSearch": {
"profiles": [ ],
"algorithms": [ ],
"compressions": [
{
"name": "use-scalar",
"kind": "scalarQuantization",
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
},
{
"name": "use-binary",
"kind": "binaryQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
}
]
}
}
Punti principali:
kind
deve essere impostato suscalarQuantization
obinaryQuantization
.rerankWithOriginalVectors
usa i vettori originali non compressi per ricalcolare la somiglianza e rerank i risultati principali restituiti dalla query di ricerca iniziale. I vettori non compressi sono presenti nell'indice di ricerca anche sestored
è false. Questa proprietà è facoltativa. Il valore predefinito è true.defaultOversampling
considera un set più ampio di potenziali risultati per compensare la riduzione delle informazioni dalla quantizzazione. La formula per i risultati potenziali è costituita dak
nella query, con un moltiplicatore di sovracampionamento. Ad esempio, se la query specifica unk
di 5 e se il sovracampionamento è 20, la query richiede di fatto 100 documenti per l'uso durante la ricategorizzazione, usando il vettore originale non compresso a tale scopo. Vengono restituiti solo i primik
risultati classificati di nuovo. Questa proprietà è facoltativa. Il valore predefinito è 4.quantizedDataType
è facoltativo e si applica solo alla quantizzazione scalare. Se lo si aggiunge, deve essere impostato suint8
. Questo è l'unico tipo di dati primitivo supportato per la quantizzazione scalare in questo momento. Il valore predefinito èint8
.
Aggiungere l'algoritmo di ricerca vettoriale
È possibile usare l'algoritmo HNSW o knn completo nell'API REST 2024-11-01-preview. Per la versione stabile, usare solo HNSW.
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
Creare e assegnare un nuovo profilo vettoriale
Per usare una nuova configurazione di quantizzazione, è necessario creare un nuovo profilo vettoriale. La creazione di un nuovo profilo vettoriale è necessaria per la compilazione di indici compressi in memoria. Il nuovo profilo usa HNSW.
Nella stessa definizione di indice creare un nuovo profilo vettoriale e aggiungere una proprietà di compressione e un algoritmo. Ecco due profili, uno per ogni approccio di quantizzazione.
"vectorSearch": { "profiles": [ { "name": "vector-profile-hnsw-scalar", "compression": "use-scalar", "algorithm": "use-hnsw", "vectorizer": null }, { "name": "vector-profile-hnsw-binary", "compression": "use-binary", "algorithm": "use-hnsw", "vectorizer": null } ], "algorithms": [ <see previous section> ], "compressions": [ <see previous section> ] }
Assegnare un profilo vettoriale a un nuovo campo vettoriale. Il tipo di dati del campo è float32 o float16.
In Azure AI Search, gli equivalenti di Entity Data Model (EDM) dei tipi float32 e float16 sono rispettivamente
Collection(Edm.Single)
eCollection(Edm.Half)
.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Caricare l'indice usando indicizzatori per l'indicizzazione del modello pull o API per l'indicizzazione del modello push.
Funzionamento della quantizzazione scalare in Azure AI Search
La quantizzazione scalare riduce la risoluzione di ogni numero all'interno di ogni incorporamento di vettori. Anziché descrivere ogni numero come numero a virgola mobile a 16 bit o 32 bit, usa un intero a 8 bit. Identifica un intervallo di numeri (in genere il 99° percentile minimo e massimo) e li divide in un numero finito di livelli o bin, assegnando a ogni bin un identificatore. Nella quantizzazione scalare a 8 bit sono presenti 2^8 o 256 bin possibili.
Ogni componente del vettore viene sottoposto a mapping al valore rappresentativo più vicino all'interno di questo set di livelli di quantizzazione in un processo simile all'arrotondamento di un numero reale all'intero più vicino. Nel vettore a 8 bit quantizzato il numero di identificatore prende il posto del valore originale. Dopo la quantizzazione, ogni vettore è rappresentato da una matrice di identificatori per i bin a cui appartengono i relativi componenti. Questi vettori quantizzati richiedono molti meno bit da archiviare rispetto al vettore originale, riducendo così i requisiti di archiviazione e il footprint di memoria.
Funzionamento della quantizzazione binaria in Azure AI Search
La quantizzazione binaria comprime vettori altamente dimensionali rappresentando ogni componente come un singolo bit, ovvero 0 o 1. Questo metodo riduce drasticamente il footprint della memoria e accelera le operazioni di confronto dei vettori, fondamentali per le attività di ricerca e recupero. I test di benchmark mostrano fino al 96% di riduzione delle dimensioni dell'indice vettoriale.
È particolarmente efficace per gli incorporamenti con dimensioni maggiori di 1024. Per dimensioni più piccole, è consigliabile testare la qualità della quantizzazione binaria o provare invece quella scalare. Sono state inoltre rilevate prestazioni BQ molto elevate quando gli incorporamenti sono centrati intorno allo zero. I modelli di incorporamento più diffusi, ad esempio OpenAI, Cohere e Mistral, sono centrati intorno allo zero.
Eseguire una query su un campo vettoriale quantizzato usando il sovracampionamento
La sintassi delle query per un campo vettore compresso o quantizzato è uguale a quella per i campi vettoriali non compressi, a meno che non si voglia eseguire l'override dei parametri associati all'oversampling o alla riscoring con vettori originali.
Tenere presente che la definizione di compressione vettoriale nell'indice include impostazioni per rerankWithOriginalVectors
e defaultOversampling
per attenuare gli effetti della compressione con perdita di dati. È possibile eseguire l'override dei valori predefiniti per variare il comportamento in fase di query. Ad esempio, se defaultOversampling
è 10.0, è possibile modificarlo in un altro elemento nella richiesta di query.
È possibile impostare il parametro di sovracampionamento anche se l'indice non ha una definizione di rerankWithOriginalVectors
o di defaultOversampling
in modo esplicito. Se si specifica oversampling
in fase di query, le impostazioni dell'indice per tale query vengono sovrascritte e la query viene eseguita con un valore rerankWithOriginalVectors
effettivo come true.
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
Punti principali:
Si applica ai campi vettoriali che subiscono la compressione vettoriale, in base all'assegnazione del profilo vettoriale.
Esegue l'override del valore
defaultOversampling
o introduce il sovracampionamento in fase di query, anche se la configurazione della compressione dell'indice non specifica le opzioni di sovracampionamento o ricategorizzazione.