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 voor het verminderen van vectorgrootte, omdat het zowel geheugen- als schijfopslagverbruik verlaagt voor float16- en float32-insluitingen. Als u de effecten van lossycompressie wilt compenseren, kunt u oversampling en rescoring toevoegen aan niet-gecomprimeerde vectoren.

Volg deze stappen om ingebouwde kwantisatie te gebruiken:

  • Beginnen met vectorvelden en een vectorSearch configuratie voor een index
  • vectorSearch.compressions toevoegen
  • scalarQuantization Een of binaryQuantization configuratie toevoegen en deze 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
  • Desgewenst query's uitvoeren op gekwantiseerde gegevens met behulp van de parameter oversampling als u de standaardwaarde wilt overschrijven

Vereisten

  • Vectorvelden in een zoekindex met een vectorSearch configuratie, met behulp van de HNSW-algoritmen (Hierarchical Navigable Navigable Small Worlds) of uitgebreide K-dichtstbijzijnde buren (eKNN) en een nieuw vectorprofiel.

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 automatisch 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.

Compressies toevoegen aan een zoekindex

In het volgende voorbeeld ziet u een gedeeltelijke indexdefinitie met een verzameling velden die een vectorveld en een vectorSearch.compressions sectie bevat.

Het 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 nieuwe opties voor opslagoptimalisatie toevoegt, plus wijzigingen in bestaande syntaxis. Compatibiliteit met eerdere versies blijft behouden via interne API-toewijzingen, maar u moet de nieuwe syntaxis in code gebruiken die is gericht op 2024-11-01-preview en toekomstige versies.

Gebruik de REST API voor index maken of bijwerken 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": [ ],
        "algorithms": [ ],
        "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 HNSW-algoritme of uitgebreide KNN gebruiken in de REST API 2024-11-01-preview. Gebruik alleen HNSW voor de stabiele versie.

"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 vector insluiten. 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 BQ 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 of rescoring met oorspronkelijke vectoren.

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. Als dit bijvoorbeeld defaultOversampling 10.0 is, kunt u deze wijzigen in iets anders in de queryaanvraag.

U kunt de parameter oversampling instellen, zelfs als de index niet expliciet een rerankWithOriginalVectors of defaultOversampling definitie heeft. Op het moment van oversampling query's worden de indexinstellingen voor die query overschreven en wordt de query uitgevoerd met een effectieve rerankWithOriginalVectors als 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.