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
ellerbinaryQuantization
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 tillscalarQuantization
ellerbinaryQuantization
.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 omstored
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 avk
i frågan, med en översamplingsmultiplikator. Om frågan till exempel anger enk
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ögstk
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 ärint8
.
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.
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> ] }
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 ochCollection(Edm.Half)
.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Läs in indexet med indexerare för pull-modellindexering eller API:er för push-modellindexering.
Så här fungerar skalbar kvantisering i Azure AI Search
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.
Så här fungerar binär kvantisering i Azure AI Search
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.