Delen via


Vectoren comprimeren met behulp van scalaire of binaire kwantisatie

Azure AI Search ondersteunt scalaire en binaire kwantisatie voor het verminderen van de grootte van vectoren in een zoekindex. Kwantisatie wordt aanbevolen omdat het zowel geheugen- als schijfopslag voor float16- en float32-insluitingen vermindert. Als u de effecten van lossycompressie wilt compenseren, kunt u oversampling en rescoring toevoegen.

Volg deze stappen om ingebouwde kwantisatie te gebruiken:

  • Beginnen met vectorvelden en een vectorSearch configuratie voor een index
  • vectorSearch.compressions toevoegen
  • Een scalarQuantization- of binaryQuantization-configuratie toevoegen en een naam geven
  • Optionele eigenschappen instellen om de gevolgen van lossy indexering te beperken
  • Een nieuw vectorprofiel maken dat gebruikmaakt van de benoemde configuratie
  • Een nieuw vectorveld maken met het nieuwe vectorprofiel
  • De index laden met float32- of float16-gegevens die worden gekwantiseerd tijdens het indexeren met de configuratie die u hebt gedefinieerd
  • Query's uitvoeren op gekwantiseerde gegevens met behulp van de parameter oversampling. Als in het vectorveld geen oversampling in de definitie wordt opgegeven, kunt u het toevoegen tijdens de query.

Aanbeveling

Azure AI Search: Kosten van vectoren verlagen tot 92,5% met nieuwe compressietechnieken vergelijkt compressiestrategieën en legt besparingen in opslag en kosten uit. Het bevat ook metrische gegevens voor het meten van relevantie op basis van genormaliseerde cumulatieve winst (NDCG), waarmee wordt gedemonstreerd dat u uw gegevens kunt comprimeren zonder de zoekkwaliteit op te offeren.

Vereisten

  • Vectorvelden in een zoekindex, met een vectorSearch configuratie die het HNSW-algoritme (Hierarchical Navigable Small Worlds) of een volledig K-Nearest Neighbor-algoritme (KNN) en een nieuw vectorprofiel aangeeft.

Ondersteunde kwantisatietechnieken

Kwantisatie is van toepassing op vectorvelden die float-type vectoren ontvangen. In de voorbeelden in dit artikel is Collection(Edm.Single) het gegevenstype van het veld bedoeld voor binnenkomende float32-insluitingen, maar float16 wordt ook ondersteund. Wanneer de vectoren worden ontvangen op een veld met compressie geconfigureerd, voert de engine kwantisatie uit om de footprint van de vectorgegevens in het geheugen en op schijf te verminderen.

Er worden twee typen kwantisatie ondersteund:

  • Scalaire kwantisatie comprimeert floatwaarden in smallere gegevenstypen. AI Search ondersteunt momenteel int8, wat 8 bits is, waardoor de vectorindexgrootte viervoudig wordt verkleind.

  • Binaire kwantisatie converteert floats naar binaire bits, wat 1 bits in beslag neemt. Dit resulteert in maximaal 28 keer lagere vectorindexgrootte.

Notitie

Hoewel gratis services kwantisatie ondersteunen, tonen ze niet de volledige opslagbesparingen vanwege het beperkte opslagquotum.

Rescoring is een techniek die wordt gebruikt om informatieverlies te compenseren vanwege vectorcompressie. Er wordt gebruikgemaakt van oversampling om extra vectoren op te halen en aanvullende informatie om de eerste resultaten die door de query zijn gevonden, opnieuw te scoren. Aanvullende informatie bestaat uit ongecomprimeerde oorspronkelijke volledige precisievectoren - of, alleen voor binaire kwantisatie, hebt u de mogelijkheid om opnieuw te scoren met behulp van de binaire gekwantiseerde documentkandidaten tegen de queryvector. Opties voor rescoring worden opgegeven in de index, maar u kunt rescoring op het moment van query aanroepen als de index deze ondersteunt.

API-versies bepalen welk rescoring-gedrag operationeel is voor uw code. De meest recente preview-API ondersteunt een nieuwe rescoring-benadering voor binaire kwantisatie. Indexen die zijn gemaakt met 2025-03-01-preview, kunnen gebruikmaken van het nieuwe herscoringsgedrag.

API-versie Type kwantisatie eigenschappen van herscoren
2024-07-01 Scalaire en binaire kwantisatie, op vectorindexen gebouwd met behulp van HNSW-grafieken (Hierarchical Navigable Small World) voor overeenkomsten zoeken rerankWithOriginalVectors
2024-11-01-voorbeschouwing Scalaire en binaire kwantisatie in HNSW-grafieken rescoringOptions.enableRescoring en rescoreStorageMethod.preserveOriginals
2025-03-01-voorbeeld Binaire kwantisatie in HNSW-grafieken Eerdere parametercombinaties worden nog steeds ondersteund, maar binaire kwantisatie kan nu opnieuw worden gescored als oorspronkelijke insluitingen worden verwijderd: rescoringOptions.enableRescoring en rescoringOptions.rescoreStorageMethod=discardOriginals

Alleen HNSW-grafieken staan herbeoordeling (rescoring) toe. Uitputtende KNN biedt geen ondersteuning voor rescoring.

Het gegeneraliseerde proces voor het herscoren is:

  1. De vectorquery wordt uitgevoerd op gecomprimeerde vectorvelden.
  2. De vector query retourneert de top k oversampled kandidaten.
  3. Oversampled k kandidaten worden hergescoord met behulp van de niet-gecomprimeerde oorspronkelijke vectoren of het puntproduct van de binaire kwantisatie. 1. Na het herwaarderen worden de resultaten aangepast, zodat relevantere overeenkomsten als eerste verschijnen.

Compressies toevoegen aan een zoekindex

In deze sectie wordt uitgelegd hoe u een vectorsSearch.compressions sectie in de index opgeeft. In het volgende voorbeeld ziet u een gedeeltelijke indexdefinitie met een veldenverzameling die een vectorveld bevat.

Het compressievoorbeeld bevat beide scalarQuantization of binaryQuantization. U kunt zo veel compressieconfiguraties opgeven als u nodig hebt en vervolgens de configuraties toewijzen die u aan een vectorprofiel wilt toewijzen.

De syntaxis voor vectorSearch.Compressions varieert tussen stabiele en preview-REST API's, waarbij de preview meer opties voor opslagoptimalisatie toevoegt, plus wijzigingen in bestaande syntaxis. Compatibiliteit met eerdere versies blijft behouden via interne API-toewijzingen, maar we raden u aan de nieuwere eigenschappen in code te gebruiken die gericht zijn op 2024-11-01-preview en toekomstige versies.

Gebruik de Index maken of Index maken of bijwerken REST API om compressie-instellingen te configureren.

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
      }
    ]
  }
}

Belangrijkste punten:

  • kind moet zijn ingesteld op scalarQuantization of binaryQuantization.

  • rerankWithOriginalVectors gebruikt de oorspronkelijke niet-gecomprimeerde vectoren om overeenkomsten opnieuw te berekenen en de belangrijkste resultaten die door de eerste zoekquery worden geretourneerd, opnieuw te rangschikken. De niet-gecomprimeerde vectoren bestaan in de zoekindex, zelfs als stored deze onwaar is. Deze eigenschap is optioneel. De standaardwaarde is waar.

  • defaultOversampling beschouwt een bredere set potentiële resultaten om de vermindering van de informatie van kwantisatie te compenseren. De formule voor mogelijke resultaten bestaat uit de k in de query, met een vermenigvuldiger voor oversampling. Als de query bijvoorbeeld een k van 5 opgeeft en oversampling 20 is, vraagt de query in feite 100 documenten aan voor gebruik bij het opnieuw rangschikken, waarbij de oorspronkelijke niet-gecomprimeerde vector voor dat doel wordt gebruikt. Alleen de meest k gererankeerde resultaten worden geretourneerd. Deze eigenschap is optioneel. De standaardwaarde is 4.

  • quantizedDataType is optioneel en is alleen van toepassing op scalaire kwantisatie. Als u deze toevoegt, moet deze zijn ingesteld op int8. Dit is het enige primitieve gegevenstype dat momenteel wordt ondersteund voor scalaire kwantisatie. Standaard is int8.

Het algoritme voor vectorzoekopdrachten toevoegen

U kunt het HNSW- of eKNN-algoritme gebruiken in de REST API voor 2024-11-01-preview of hoger. Gebruik alleen HNSW voor de stabiele versie. Als u opnieuw wilt scoren, moet u HNSW kiezen.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Een nieuw vectorprofiel maken en toewijzen

Als u een nieuwe kwantisatieconfiguratie wilt gebruiken, moet u een nieuw vectorprofiel maken. Het maken van een nieuw vectorprofiel is nodig voor het bouwen van gecomprimeerde indexen in het geheugen. Uw nieuwe profiel maakt gebruik van HNSW.

  1. Maak in dezelfde indexdefinitie een nieuw vectorprofiel en voeg een compressie-eigenschap en een algoritme toe. Hier volgen twee profielen, één voor elke kwantisatiebenadering.

    "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. Wijs een vectorprofiel toe aan een nieuw vectorveld. Het gegevenstype van het veld is float32 of float16.

    In Azure AI Search zijn Collection(Edm.Single)Collection(Edm.Half)respectievelijk de EDM-equivalenten (Entity Data Model) van float32- en float16-typen.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Laad de index met indexeerfuncties voor het indexeren van pull-modellen of API's voor pushmodelindexering.

Scalaire kwantisatie vermindert de resolutie van elk getal binnen elke vectorembedding. In plaats van elk getal te beschrijven als een 16-bits of 32-bits drijvendekommagetal, wordt een 8-bits geheel getal gebruikt. Het identificeert een bereik van getallen (meestal 99e percentiel minimum en maximum) en verdeelt ze in een eindig aantal niveaus of bin, waarbij elke bin een id wordt toegewezen. In 8-bits scalaire kwantisatie zijn er 2^8 of 256 mogelijke bins.

Elk onderdeel van de vector wordt toegewezen aan de dichtstbijzijnde representatieve waarde binnen deze set kwantisatieniveaus in een proces dat lijkt op het afronden van een reëel getal op het dichtstbijzijnde gehele getal. In de gekwantiseerde 8-bits vector staat het id-getal in plaats van de oorspronkelijke waarde. Na kwantisatie wordt elke vector vertegenwoordigd door een matrix met id's voor de bins waartoe de onderdelen behoren. Deze gekwantiseerde vectoren vereisen veel minder bits om op te slaan in vergelijking met de oorspronkelijke vector, waardoor de opslagvereisten en geheugenvoetafdruk worden verminderd.

Binaire kwantisatie comprimeert hoogdimensionale vectoren door elk onderdeel weer te geven als één bit, ofwel 0 of 1. Deze methode vermindert de geheugenvoetafdruk drastisch en versnelt vectorvergelijkingsbewerkingen, die cruciaal zijn voor het zoeken en ophalen van taken. Benchmarktests tonen een vermindering van de grootte van de vectorindex tot 96%.

Het is met name effectief voor insluitingen met dimensies die groter zijn dan 1024. Voor kleinere dimensies raden we u aan om de kwaliteit van binaire kwantisatie te testen of in plaats daarvan scalaire waarden te proberen. Daarnaast hebben we vastgesteld dat binaire kwantisatie zeer goed presteert wanneer insluitingen rond nul zijn gecentreerd. De populairste insluitingsmodellen, zoals OpenAI, Cohere en Mistral, zijn gecentreerd rond nul.

Een query uitvoeren op een gekwantiseerd vectorveld met behulp van oversampling

De querysyntaxis voor een gecomprimeerd of gekwantiseerd vectorveld is hetzelfde als voor niet-gecomprimeerde vectorvelden, tenzij u parameters wilt overschrijven die zijn gekoppeld aan oversampling en rescoring. U kunt een o-parameterversampling toevoegen om oversampling en rescoring aan te roepen tijdens het uitvoeren van query's.

Zoals u weet, heeft de definitie van vectorcompressie in de index instellingen voor rerankWithOriginalVectors en defaultOversampling om de effecten van lossycompressie te beperken. U kunt de standaardwaarden overschrijven om het gedrag op het moment van de query te variëren. Bijvoorbeeld, als defaultOversampling 10,0 is, kunt u het wijzigen naar iets anders in de query.

U kunt de parameter oversampling instellen, zelfs als de index niet expliciet een rerankWithOriginalVectors of defaultOversampling definitie heeft. Bij het uitvoeren van oversampling wordt de indexinstellingen voor die query overschreven en wordt de query uitgevoerd met een effectieve rerankWithOriginalVectors, ingesteld op waar.

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   
        }
  ]    
}

Belangrijkste punten:

  • Is van toepassing op vectorvelden die vectorcompressie ondergaan, volgens de toewijzing van het vectorprofiel.

  • Overschrijft de defaultOversampling waarde of introduceert oversampling tijdens query's, zelfs als de compressieconfiguratie van de index geen opties voor oversampling of herrankering heeft opgegeven.