Vektorok tömörítése skaláris vagy bináris kvantálással
Az Azure AI Search támogatja a skaláris és bináris kvantálást a vektorok méretének csökkentéséhez a keresési indexben. A vektorméret csökkentéséhez a kvantálást javasoljuk, mert csökkenti a memória- és lemeztárolás használatát az float16 és az float32 beágyazások esetében. A veszteséges tömörítés hatásainak ellensúlyozásához hozzáadhat túlbélyegzést és újraszerkesztést a tömörítetlen vektorokhoz.
A beépített kvantálás használatához kövesse az alábbi lépéseket:
- Kezdje vektormezőkkel és egy
vectorSearch
index konfigurációjával vectorSearch.compressions
hozzáadása- Adjon hozzá vagy
scalarQuantization
binaryQuantization
konfiguráljon, és adjon neki nevet - Választható tulajdonságok beállítása a veszteséges indexelés hatásainak mérsékléséhez
- Hozzon létre egy új vektorprofilt, amely a nevesített konfigurációt használja
- Új vektormező létrehozása az új vektorprofillal
- Az index betöltése float32 vagy float16 adatokkal, amelyek számszerűsítve lesznek az indexelés során a megadott konfigurációval
- Ha felül szeretné bírálni az alapértelmezett értéket, kvantált adatokat kérdezhet le a túlméretezési paraméterrel
Előfeltételek
- Vektormezők egy konfigurációval rendelkező
vectorSearch
keresési indexben a hierarchikus navigálható kisvilágok (HNSW) vagy a teljes K-legközelebbi szomszéd (eKNN) algoritmusok és egy új vektorprofil használatával.
Támogatott kvantálási technikák
A kvantálás lebegőpontos típusú vektorokat fogadó vektormezőkre vonatkozik. A cikkben szereplő példákban a mező adattípusa a bejövő float32-beágyazásokhoz tartozik Collection(Edm.Single)
, de a float16 is támogatott. Ha a vektorok egy tömörítési konfigurált mezőre érkeznek, a motor automatikusan kvantálást végez a vektoradatok memóriabeli és lemezbeli lábnyomának csökkentése érdekében.
Kétféle kvantálás támogatott:
A skaláris kvantálás szűkebb adattípusokba tömöríti az lebegőpontos értékeket. Az AI Search jelenleg az int8-at támogatja, amely 8 bites, így négyszeresére csökkenti a vektorindex méretét.
A bináris kvantálás bináris bitekká alakítja az úszókat, ami 1 bitet vesz igénybe. Ez akár 28-szor kisebb vektorindex-méretet eredményez.
"Tömörítések" hozzáadása keresési indexhez
Az alábbi példa egy részleges indexdefiníciót mutat be egy vektormezőt és egy szakaszt vectorSearch.compressions
tartalmazó mezőgyűjteménysel.
Mindkettőt vagy scalarQuantization
binaryQuantization
. A szükséges számú tömörítési konfigurációt megadhatja, majd hozzárendelheti a kívánt konfigurációkat egy vektorprofilhoz.
vectorSearch.Compressions
A szintaxis stabil és előzetes REST API-k között változik, az előzetes verzió új tárolási optimalizálási lehetőségeket ad hozzá, valamint a meglévő szintaxis változásait. A visszamenőleges kompatibilitás a belső API-leképezések révén megmarad, de a 2024-11-01-es verziót és a jövőbeli verziókat megcélozó kód új szintaxisát kell alkalmaznia.
A tömörítési beállítások konfigurálásához használja az Index létrehozása vagy az Index létrehozása vagy frissítése REST API-t.
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
}
]
}
}
Főbb pontok:
kind
beállításnak kell lennie a következőre:scalarQuantization
vagybinaryQuantization
.rerankWithOriginalVectors
Az eredeti tömörítetlen vektorokkal újraszámítja a hasonlóságot, és újraszámítja a kezdeti keresési lekérdezés által visszaadott felső eredményeket. A tömörítetlen vektorok akkor is léteznek a keresési indexben, hastored
hamisak. Ez a tulajdonság opcionális. Alapértelmezett érték: true (igaz).defaultOversampling
a lehetséges eredmények szélesebb halmazát veszi figyelembe, hogy ellensúlyozza a kvantálásból származó információk csökkenését. A lehetséges eredmények képlete ak
lekérdezésben található, túlbélyegző szorzóval. Ha például a lekérdezés 5-et ad megk
, és a túlhasználat 20, akkor a lekérdezés 100 dokumentumot kér le az újrabontáshoz, az eredeti tömörítetlen vektor használatával erre a célra. A rendszer csak a legjobbank
rerankedt eredményeket adja vissza. Ez a tulajdonság opcionális. Az alapértelmezett érték 4.quantizedDataType
nem kötelező, és csak a skaláris kvantálásra vonatkozik. Ha hozzáadja, a beállításnakint8
a következőre kell lennie: . Jelenleg ez az egyetlen primitív adattípus, amelyet a skaláris kvantálás támogat. Az alapértelmezett szint aint8
.
A vektorkeresési algoritmus hozzáadása
A HNSW algoritmust vagy a teljes KNN-t a 2024-11-01-preview REST API-ban használhatja. A stabil verzióhoz csak a HNSW-t használja.
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
Új vektorprofil létrehozása és hozzárendelése
Új kvantálási konfiguráció használatához létre kell hoznia egy új vektorprofilt. A tömörített indexek memóriabeli létrehozásához új vektorprofil létrehozása szükséges. Az új profil a HNSW-t használja.
Ugyanebben az indexdefinícióban hozzon létre egy új vektorprofilt, és adjon hozzá egy tömörítési tulajdonságot és egy algoritmust. Íme két profil, egy minden kvantálási megközelítéshez.
"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> ] }
Vektorprofil hozzárendelése új vektormezőhöz. A mező adattípusa float32 vagy float16.
Az Azure AI Searchben a float32 és a float16 típusú
Collection(Edm.Single)
entitásadat-modell (EDM) megfelelői ésCollection(Edm.Half)
azok.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Töltse be az indexet indexelőkkel a lekéréses modellek indexeléséhez, vagy API-k használatával a leküldéses modellek indexelését.
A skaláris kvantálás működése az Azure AI Searchben
A skaláris kvantálás csökkenti az egyes számok felbontását az egyes vektorok beágyazásán belül. Az egyes számokat nem 16 bites vagy 32 bites lebegőpontos számként írja le, hanem egy 8 bites egész számot használ. Azonosítja a számtartományt (általában a 99. percentilis minimumot és a maximumot), és véges számú szintre vagy tárolóra osztja őket, és mindegyik tárolóhoz azonosítót rendel. A 8 bites skaláris kvantálásban 2^8 vagy 256 lehetséges tároló található.
A vektor minden összetevője a legközelebbi reprezentatív értékre van leképezve ebben a kvantálási szintek készletében egy folyamat során, amely egy valós számot a legközelebbi egész számra kerekít. A kvantált 8 bites vektorban az azonosítószám az eredeti érték helyett áll. A kvantálás után az egyes vektorokat az összetevőket tartalmazó tárolók azonosítóinak tömbje jelöli. Ezek a kvantált vektorok sokkal kevesebb bit tárolását igénylik az eredeti vektorhoz képest, ami csökkenti a tárolási követelményeket és a memóriaigényt.
A bináris kvantálás működése az Azure AI Searchben
A bináris kvantálás úgy tömöríti a nagy dimenziójú vektorokat, hogy minden összetevőt egyetlen bitként jelöl, akár 0, akár 1. Ez a módszer jelentősen csökkenti a memóriaigényt, és felgyorsítja a vektor-összehasonlító műveleteket, amelyek kulcsfontosságúak a keresési és lekérési feladatokhoz. A teljesítménytesztek akár 96%-os csökkenést is mutatnak a vektorindex méretében.
Különösen hatékony az 1024-nél nagyobb méretű beágyazásokhoz. Kisebb méretek esetén javasoljuk, hogy tesztelje a bináris kvantálás minőségét, vagy próbálja inkább a skalárt. Azt is megállapítottuk, hogy a BQ nagyon jól működik, ha a beágyazások nulla körül vannak. A legnépszerűbb beágyazási modellek, például az OpenAI, a Cohere és a Mistral nulla körül vannak.
Kvantált vektormező lekérdezése túlméretezés használatával
A tömörített vagy kvantált vektormezők lekérdezési szintaxisa megegyezik a nem tömörített vektormezőkkel, kivéve, ha felül szeretné bírálni a túlméretezéshez vagy az eredeti vektorokkal való újraszerkesztéshez társított paramétereket.
Ne feledje, hogy az index vektortömörítési definíciója rendelkezik a veszteséges tömörítés hatásainak rerankWithOriginalVectors
beállításával és defaultOversampling
enyhítésével. Az alapértelmezett értékeket felülbírálhatja, hogy a lekérdezési időpontban eltérő legyen a viselkedés. Ha például defaultOversampling
10.0, a lekérdezési kérelemben másra is módosíthatja.
A túlmintavételi paramétert akkor is beállíthatja, ha az index nem rendelkezik rerankWithOriginalVectors
explicit módon vagy defaultOversampling
definícióval. A lekérdezési időpont megadása oversampling
felülbírálja a lekérdezés indexbeállításait, és a lekérdezést az igaz értékekkel rerankWithOriginalVectors
hajtja végre.
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
}
]
}
Főbb pontok:
A vektorprofil-hozzárendelésen átesett vektormezőkre vonatkozik.
Felülbírálja az
defaultOversampling
értéket, vagy a lekérdezési időpontban túlmintavételt vezet be, még akkor is, ha az index tömörítési konfigurációja nem adott meg túlbélyegzési vagy újraszámítási beállításokat.