Condividi tramite


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 perché riduce sia la memoria che l'archiviazione su disco per incorporamenti float16 e float32. Per compensare gli effetti della compressione con perdita di dati, è possibile aggiungere sovracampionamento e rescoring.

Per usare la quantizzazione predefinita, seguire questa procedura:

  • Inizia con i campi vettoriali e una vectorSearch configurazione per un indice
  • Aggiungere vectorSearch.compressions
  • Aggiungere una configurazione di scalarQuantization o binaryQuantization 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 query su dati quantizzati usando il parametro di sovracampionamento. Se il campo vettore non specifica il sovracampionamento nella relativa definizione, è possibile aggiungerlo in fase di query.

Suggerimento

Ricerca di intelligenza artificiale di Azure: ridurre i costi dei vettori fino a 92.5% con le nuove tecniche di compressione confronta le strategie di compressione e illustra i risparmi in termini di archiviazione e costi. Include anche le metriche per misurare la rilevanza in base al guadagno cumulativo scontata normalizzato (NDCG), dimostrando che è possibile comprimere i dati senza sacrificare la qualità della ricerca.

Prerequisiti

  • Campi vettoriali in un indice di ricerca, con una vectorSearch configurazione che specifica l'algoritmo HNSW (Hierarchical Navigable Small Worlds) o un algoritmo K-nearest neighbor (eKNN) completo 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 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 i numeri float in bit binari, che occupano 1 bit. Ciò comporta fino a 28 volte la riduzione delle dimensioni dell'indice vettoriale.

Nota

Anche se i servizi gratuiti supportano la quantizzazione, non dimostrano i risparmi di archiviazione completi dovuti alla quota di archiviazione limitata.

La riscoratura è una tecnica usata per compensare la perdita di informazioni a causa della compressione vettoriale. Usa il sovracampionamento per prelevare vettori aggiuntivi e informazioni supplementari per ricalcolare i risultati iniziali trovati dalla query. Le informazioni supplementari sono vettori originali precisi non compressi oppure, solo per la quantizzazione binaria, si ha la possibilità di eseguire il rescoring usando i candidati dei documenti quantizzati binari rispetto al vettore di query. Le opzioni di rescoring vengono specificate nell'indice, ma è possibile richiamare la rescoring in fase di query se l'indice lo supporta.

Le versioni API stabiliscono quale comportamento di riscorazione sia operativo per il vostro codice. L'API di anteprima più recente supporta un nuovo approccio di rivalutazione per la quantizzazione binaria. Gli indici creati con 2025-03-01-preview possono usare i nuovi comportamenti di rescoring.

Versione dell'API Tipo di quantizzazione Proprietà di rescoring
2024-07-01 Quantizzazione scalare e binaria, sugli indici vettoriali creati usando grafici HNSW (Hierarchical Navigable Small World) per la ricerca di somiglianza rerankWithOriginalVectors
2024-11-01-preview Quantizzazione scalare e binaria nei grafici HNSW rescoringOptions.enableRescoring e rescoreStorageMethod.preserveOriginals
2025-03-01-preview Quantizzazione binaria nei grafici HNSW Le combinazioni di parametri precedenti sono ancora supportate, ma la quantizzazione binaria può ora essere ripuntata se gli incorporamenti originali vengono eliminati: rescoringOptions.enableRescoring e rescoringOptions.rescoreStorageMethod=discardOriginals

Solo i grafici HNSW consentono la rivalutazione. K Nearest Neighbors esaustivo (eKNN) non supporta il rescoring dei punteggi.

Il processo generalizzato per il ricalcolo dei punteggi è:

  1. La query vettoriale viene eseguita su campi vettoriali compressi.
  2. La query vettoriale restituisce i primi k candidati oversamplati.
  3. I candidati "k" sovracampionati vengono rivalutati usando i vettori originali non compressi o il prodotto dot della quantizzazione binaria. 1. Dopo la rivalutazione, i risultati vengono modificati in modo che le corrispondenze più rilevanti vengano visualizzate per prime.

Aggiungere "compressioni" a un indice di ricerca

In questa sezione viene illustrato come specificare una vectorsSearch.compressions sezione nell'indice. Nell'esempio seguente viene illustrata una definizione di indice parziale con un insieme fields che include un campo vettoriale.

L'esempio di compressione include sia scalarQuantization che 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 che aggiunge altre opzioni per l'ottimizzazione dell'archiviazione, oltre alle modifiche alla sintassi esistente. La compatibilità con le versioni precedenti viene mantenuta tramite il mapping delle API interne, ma è consigliabile adottare le proprietà più recenti nel codice destinato a 2024-11-01-preview e alle versioni future.

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": [ 
      {
          "name": "vector-profile-1",
          "algorithm": "use-hnsw",
          "compression": "use-scalar"
      }
    ],
    "algorithms": [ 
      {
        "name": "use-hnsw",
        "kind": "hnsw",
        "hnswParameters": { },
        "exhaustiveKnnParameters": null
      }
    ],
    "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 su scalarQuantization o binaryQuantization.

  • 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 se stored è false. Questa proprietà è facoltativa. L'impostazione predefinita è 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 un k di 5 e se il sovracampionamento è 20, la query richiede di fatto 100 documenti per l'uso durante la riclassificazione, usando il vettore originale non compresso a tale scopo. Vengono restituiti solo i primi k risultati riclassificati. Questa proprietà è facoltativa. Il valore predefinito è 4.

  • quantizedDataType è facoltativo e si applica solo alla quantizzazione scalare. Se lo si aggiunge, deve essere impostato su int8. 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 o versioni successive. Per la versione stabile, usare solo HNSW. Se si desidera un nuovo punteggio, è necessario scegliere 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.

  1. 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> ] 
    }
    
  2. 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) e Collection(Edm.Half).

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Caricare l'indice usando indicizzatori per l'indicizzazione del modello pull o API per l'indicizzazione del modello push.

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.

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. Inoltre, la quantizzazione binaria risulta molto efficace quando gli incorporamenti sono centrati intorno a 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 di 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 e alla riscoring. È possibile aggiungere un parametro oversampling per richiamare oversampling e rescoring in fase di query.

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.