Dela via


Komprimera vektorer med hjälp av skalär eller binär kvantisering

Azure AI Search stöder skalbar och binär kvantisering för att minska storleken på vektorer i ett sökindex. Kvantisering rekommenderas för att minska vektorstorleken eftersom den sänker både minnes- och disklagringsförbrukningen för float16- och float32-inbäddningar. För att kompensera effekterna av förlust av komprimering kan du lägga till översampling och rescoring över okomprimerade vektorer.

Följ dessa steg om du vill använda inbyggd kvantisering:

  • Börja med vektorfält och en vectorSearch konfiguration för ett index
  • Lägg till vectorSearch.compressions
  • Lägg till en scalarQuantization eller binaryQuantization konfiguration och ge den ett namn
  • Ange valfria egenskaper för att minimera effekterna av förlust av indexering
  • Skapa en ny vektorprofil som använder den namngivna konfigurationen
  • Skapa ett nytt vektorfält med den nya vektorprofilen
  • Läs in indexet med float32- eller float16-data som kvantifieras under indexeringen med den konfiguration som du definierade
  • Du kan också köra frågor mot kvantiserade data med hjälp av parametern översampling om du vill åsidosätta standardvärdet

Förutsättningar

  • Vektorfält i ett sökindex med en vectorSearch konfiguration, med hjälp av HNSW(Hierarchical Navigable Small Worlds) eller fullständiga algoritmer för K-närmaste granne (eKNN) och en ny vektorprofil.

Kvantiseringstekniker som stöds

Kvantisering gäller för vektorfält som tar emot float-type-vektorer. I exemplen i den här artikeln är Collection(Edm.Single) fältets datatyp för inkommande float32-inbäddningar, men float16 stöds också. När vektorerna tas emot på ett fält med komprimering konfigurerad utför motorn automatiskt kvantisering för att minska fotavtrycket för vektordata i minnet och på disken.

Två typer av kvantisering stöds:

  • Scalar-kvantisering komprimerar flyttalvärden till smalare datatyper. AI Search stöder för närvarande int8, vilket är 8 bitar, vilket minskar vektorindexstorleken fyrfaldigt.

  • Binär kvantisering konverterar flyttal till binära bitar, vilket tar upp 1 bit. Detta resulterar i upp till 28 gånger lägre vektorindexstorlek.

Lägga till "komprimeringar" i ett sökindex

I följande exempel visas en partiell indexdefinition med en fältsamling som innehåller ett vektorfält och ett vectorSearch.compressions avsnitt.

Den innehåller både scalarQuantization eller binaryQuantization. Du kan ange så många komprimeringskonfigurationer som du behöver och sedan tilldela de som du vill ha till en vektorprofil.

Syntaxen för vectorSearch.Compressions varierar mellan stabila REST-API:er och förhandsversions-API:er, där förhandsversionen lägger till nya alternativ för lagringsoptimering, plus ändringar i befintlig syntax. Bakåtkompatibilitet bevaras via interna API-mappningar, men du bör använda den nya syntaxen i koden som är avsedd för förhandsversionen 2024-11-01 och framtida versioner.

Använd REST-API:et Skapa index eller Skapa eller Uppdatera index för att konfigurera komprimeringsinställningar.

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

Viktiga punkter:

  • kind måste anges till scalarQuantization eller binaryQuantization.

  • rerankWithOriginalVectors använder de ursprungliga okomprimerade vektorerna för att beräkna om likheten och beräkna om de översta resultaten som returneras av den första sökfrågan. De okomprimerade vektorerna finns i sökindexet även om stored det är falskt. Den här egenskapen är valfri. Standard är sant.

  • defaultOversampling Parlamentet anser att det finns en bredare uppsättning potentiella resultat för att kompensera för minskningen av informationen från kvantiseringen. Formeln för potentiella resultat består av k i frågan, med en översamplingsmultiplikator. Om frågan till exempel anger en k av 5 och översampling är 20, begär frågan effektivt 100 dokument för användning vid omrankning, med den ursprungliga okomprimerade vektorn för det ändamålet. Endast de högst k rankade resultaten returneras. Den här egenskapen är valfri. Standardvärdet är 4.

  • quantizedDataType är valfritt och gäller endast för skalära kvantiseringar. Om du lägger till den måste den vara inställd på int8. Det här är den enda primitiva datatypen som stöds för skalbar kvantisering just nu. Standard är int8.

Lägg till algoritmen för vektorsökning

Du kan använda HNSW-algoritmen eller uttömmande KNN i REST API:et 2024-11-01-preview. Använd endast HNSW för den stabila versionen.

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

Skapa och tilldela en ny vektorprofil

Om du vill använda en ny kvantiseringskonfiguration måste du skapa en ny vektorprofil. Det är nödvändigt att skapa en ny vektorprofil för att skapa komprimerade index i minnet. Den nya profilen använder HNSW.

  1. I samma indexdefinition skapar du en ny vektorprofil och lägger till en komprimeringsegenskap och en algoritm. Här är två profiler, en för varje kvantiseringsmetod.

    "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. Tilldela en vektorprofil till ett nytt vektorfält. Datatypen för fältet är antingen float32 eller float16.

    I Azure AI Search är Collection(Edm.Single) EDM-motsvarigheterna (Entity Data Model) för typerna float32 respektive float16 och Collection(Edm.Half).

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Läs in indexet med indexerare för pull-modellindexering eller API:er för push-modellindexering.

Scalar-kvantisering minskar upplösningen för varje tal inom varje vektorbäddning. I stället för att beskriva varje tal som ett 16-bitars eller 32-bitars flyttalsnummer använder det ett 8-bitars heltal. Den identifierar ett intervall med tal (vanligtvis 99:e percentilens lägsta och högsta) och delar upp dem i ett begränsat antal nivåer eller lagerplatser och tilldelar varje lagerplats en identifierare. I 8-bitars scalar-kvantisering finns det 2^8 eller 256 möjliga intervall.

Varje komponent i vektorn mappas till närmaste representativa värde inom den här uppsättningen kvantiseringsnivåer i en process som liknar avrundning av ett verkligt tal till närmaste heltal. I den kvantiserade 8-bitarsvektorn står identifierarnumret i stället för det ursprungliga värdet. Efter kvantiseringen representeras varje vektor av en matris med identifierare för de lagerplatser som dess komponenter tillhör. Dessa kvantiserade vektorer kräver mycket färre bitar att lagra jämfört med den ursprungliga vektorn, vilket minskar lagringskraven och minnesfotavtrycket.

Binär kvantisering komprimerar högdimensionella vektorer genom att representera varje komponent som en enda bit, antingen 0 eller 1. Den här metoden minskar drastiskt minnesfotavtrycket och påskyndar vektorjämförelseåtgärder, vilket är avgörande för sök- och hämtningsuppgifter. Benchmark-tester visar upp till 96 % minskning av vektorindexstorleken.

Det är särskilt effektivt för inbäddningar med dimensioner större än 1024. För mindre dimensioner rekommenderar vi att du testar kvaliteten på binär kvantisering eller provar skalär i stället. Dessutom har vi upptäckt att BQ fungerar mycket bra när inbäddningar centreras runt noll. De flesta populära inbäddningsmodeller som OpenAI, Cohere och Mistral är centrerade runt noll.

Fråga ett kvantiserat vektorfält med hjälp av översampling

Frågesyntaxen för ett komprimerat eller kvantiserat vektorfält är samma som för icke-komprimerade vektorfält, såvida du inte vill åsidosätta parametrar som är associerade med översampling eller omsampling med ursprungliga vektorer.

Kom ihåg att vektorkomprimeringsdefinitionen i indexet har inställningar för och defaultOversampling för rerankWithOriginalVectors att minimera effekterna av förlust av komprimering. Du kan åsidosätta standardvärdena för att variera beteendet vid frågetillfället. Om defaultOversampling det till exempel är 10.0 kan du ändra det till något annat i frågebegäran.

Du kan ange översamplingsparametern även om indexet inte uttryckligen har en rerankWithOriginalVectors definition eller defaultOversampling definition. Om du oversampling anger vid frågetillfället åsidosätter indexinställningarna för den frågan och kör frågan med en effektiv rerankWithOriginalVectors som 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   
        }
  ]    
}

Viktiga punkter:

  • Gäller för vektorfält som genomgår vektorkomprimering per tilldelning av vektorprofil.

  • Åsidosätter defaultOversampling värdet eller introducerar översampling vid frågetillfället, även om indexets komprimeringskonfiguration inte angav alternativ för översampling eller omrankning.