Megosztás a következőn keresztül:


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

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 vagy binaryQuantization.

  • 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, ha stored 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 a k lekérdezésben található, túlbélyegző szorzóval. Ha például a lekérdezés 5-et ad meg k , é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 legjobban k 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ásnak int8a 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 a int8.

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.

  1. 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> ] 
    }
    
  2. 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 és Collection(Edm.Half)azok.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. 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 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 ú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.