Share via


Vektorkvantálás konfigurálása és kisebb tárolók használata kisebb vektorokhoz az Azure AI Searchben

Fontos

Ezek a funkciók nyilvános előzetes verzióban érhetők el a kiegészítő használati feltételek alatt. A 2024-03-01-preview REST API új adattípusokat, vektortömörítési tulajdonságokat és tulajdonságot stored biztosít.

Ez a cikk a vektorkvantálást és az Azure AI Search vektorindexeinek tömörítésére szolgáló egyéb technikákat ismerteti.

A beállítások kiértékelése

Első lépésként tekintse át a vektormezők által használt tárterület csökkentésének három lehetőségét. Ezek a lehetőségek nem zárják ki egymást.

A skaláris kvantálást azért javasoljuk, mert minimális erőfeszítéssel tömöríti a vektorméretet a memóriában és a lemezen, és ez a legtöbb forgatókönyvben a legnagyobb előnyt nyújtja. Ezzel szemben a keskeny típusok (kivéve Float16) speciális erőfeszítést igényelnek a használatukhoz, és stored a lemezterületen is megtakaríthatók, ami nem olyan költséges, mint a memória.

Módszer Miért érdemes ezt a lehetőséget használni?
Kisebb primitív adattípusok hozzárendelése vektormezőkhöz A keskeny adattípusok, például Float16a , Int16, és kevesebb helyet foglalnak el a memóriában és Int8a lemezen, de olyan beágyazási modellel kell rendelkeznie, amely a vektorokat keskeny adatformátumban adja ki. Vagy egyéni kvantálási logikával kell rendelkeznie, amely kis adatokat ad ki. A harmadik olyan használati eset, amely kevesebb erőfeszítést igényel, a legtöbb modell Float16által előállított natív Float32 beágyazások átdolgozása.
A beolvasható vektorok nem kötelező tárolásának megszüntetése A lekérdezési válaszban visszaadott vektorok tárolása külön történik a lekérdezés végrehajtása során használt vektoroktól. Ha nem kell vektorokat visszaadnia, kikapcsolhatja a lekérhető tárolást, így akár 50%-kal csökkentheti a teljes mezőnkénti lemeztárolást.
Skaláris kvantálás hozzáadása Használja a beépített skaláris kvantálást a natív Float32 beágyazások tömörítéséhez Int8. Ez a beállítás csökkenti a memória és a lemez tárhelyét a lekérdezési teljesítmény romlása nélkül. Kisebb adattípusok, például Int8 olyan vektorindexek létrehozása, amelyek kevésbé tartalomban gazdagok, mint a beágyazással rendelkezők Float32 . Az információvesztés eltolásához a beépített tömörítés a lekérdezés utáni feldolgozásra vonatkozó beállításokat tartalmaz tömörítetlen beágyazások használatával, valamint a túlbélyegzést a relevánsabb eredmények visszaadásához. Az újraméretezés és a túlméretezés a mezők vagy Float16 mezők beépített skaláris kvantálásának Float32 speciális jellemzői, és nem használhatók egyéni kvantáláson átesett beágyazásokhoz.

Ezek a beállítások egy üres indexen vannak definiálva. Bármelyikük implementálásához használja az Azure Portalt, a 2024-03-01-preview REST API-kat vagy egy bétaverziós Azure SDK-csomagot.

Az index definiálása után külön lépésként töltheti be és indexelheti a dokumentumokat.

1. lehetőség: Keskeny adattípusok hozzárendelése vektormezőkhöz

A vektormezők számtömbként ábrázolt vektorbeágyazást tárolnak. Mezőtípus megadásakor meg kell adnia az alapul szolgáló primitív adattípust, amellyel az egyes számokat a tömbökben tárolhatja. Az adattípus befolyásolja, hogy az egyes számok mennyi helyet foglalnak el.

Az előzetes verziójú API-k használatával keskeny primitív adattípusokat rendelhet hozzá a vektormezők tárolási követelményeinek csökkentése érdekében.

  1. Tekintse át a vektormezők adattípusát:

    • Collection(Edm.Single) 32 bites lebegőpontos (alapértelmezett)
    • Collection(Edm.Half) 16 bites lebegőpontos
    • Collection(Edm.Int16) 16 bites aláírt egész szám
    • Collection(Edm.SByte) 8 bites aláírt egész szám

    Feljegyzés

    A bináris adattípusok jelenleg nem támogatottak.

  2. Válasszon egy adattípust, amely érvényes a beágyazási modell kimenetére, vagy az egyéni kvantáláson átesett vektorokra.

    A legtöbb beágyazási modell 32 bites lebegőpontos számokat ad ki, de egyéni kvantálás alkalmazása esetén a kimenet lehet Int16 vagy Int8. Most már definiálhat olyan vektormezőket, amelyek elfogadják a kisebb formátumot.

    A szövegbeágyazási modellek natív kimeneti formátummal Float32rendelkeznek, amelyek az Azure AI Searchben vannak leképezve Collection(Edm.Single) . A kimenet Int8 nem képezhető le, mert az átadás floatint tiltott. Azonban átadhatja Float32Float16 az adatokat a (vagy Collection(Edm.Half)) felé, és ez egy egyszerű módja annak, hogy a keskeny adattípusokat extra munka nélkül használhassa.

    Az alábbi táblázat a szűk adattípusokat használó több beágyazási modellre mutató hivatkozásokat tartalmaz.

    Beágyazási modell Natív kimenet Érvényes típusok az Azure AI Searchben
    text-embedding-ada-002 Float32 Collection(Edm.Single) vagy Collection(Edm.Half)
    text-embedding-3-small Float32 Collection(Edm.Single) vagy Collection(Edm.Half)
    text-embedding-3-large Float32 Collection(Edm.Single) vagy Collection(Edm.Half)
    V3-beágyazási modellek csatlakoztatása int8 embedding_type Int8 Collection(Edm.SByte)
  3. Győződjön meg arról, hogy tisztában van egy szűk adattípus kompromisszumoivel. Collection(Edm.Half) kevesebb információval rendelkezik, ami alacsonyabb felbontást eredményez. Ha az adatok homogének vagy sűrűk, a további részletek vagy árnyalatok elvesztése a lekérdezési időben elfogadhatatlan eredményekhez vezethet, mivel a közeli vektorok megkülönböztetésére kevesebb részlet áll rendelkezésre.

  4. Határozza meg és hozza létre az indexet. Ehhez a lépéshez használhatja az Azure Portal 2024-03-01 előzetes verzióját vagy egy bétaverziós Azure SDK-csomagot.

  5. Ellenőrizze az eredményeket. Feltéve, hogy a vektormező lekérdezhetőként van megjelölve, használja a Kereséskezelőt vagy a REST API-t annak ellenőrzéséhez, hogy a mező tartalma megegyezik-e az adattípussal. Ügyeljen arra, hogy a lekérdezéshez a megfelelő 2024-03-01-preview API-verziót használja, ellenkező esetben az új tulajdonságok nem jelennek meg.

A vektorindex méretének ellenőrzéséhez használja az Azure Portalt vagy a 2024-03-01 előzetes verziót.

Feljegyzés

A mező adattípusa a fizikai adatstruktúra létrehozásához használható. Ha később módosítani szeretne egy adattípust, vagy elveti és újraépíti az indexet, vagy létrehoz egy második mezőt az új definícióval.

2. lehetőség: A tulajdonság beállítása a stored lekért tárterület eltávolítására

A stored tulajdonság egy új logikai érték egy vektormező-definícióban, amely meghatározza, hogy a rendszer lefoglalja-e a tárolót a beolvasható vektormező tartalmának. Ha nincs szüksége vektortartalomra a lekérdezési válaszban, mezőnként akár 50 százalékos tárterületet is menthet a hamis értékre állítással stored .

Mivel a vektorok nem olvashatók emberileg, általában nem jelennek meg egy keresési oldalon megjelenített lekérdezési válaszban. Ha azonban vektorokat használ az alsóbb rétegbeli feldolgozásban, például lekérdezési eredményeket ad át egy olyan modellnek vagy folyamatnak, amely vektortartalmat használ, igaz stored értékre kell állítania, és válasszon egy másik technikát a vektorméret minimalizálásához.

Az alábbi példa egy keresési index mezőgyűjteményét mutatja be. Állítsa stored hamis értékre a vektormező beolvasható tárolójának végleges eltávolításához.

PUT https://[service-name].search.windows.net/indexes/[index-name]?api-version=2024-03-01-preview  
   Content-Type: application/json  
   api-key: [admin key]  
 
     { 
       "name": "myindex", 
       "fields": [ 
         { 
           "name": "myvector", 
           "type": "Collection(Edm.Single)", 
           "retrievable": false, 
           "stored": false, 
           "dimensions": 1536, 
           "vectorSearchProfile": "vectorProfile" 
         } 
       ] 
     } 

Főbb pontok:

  • Csak vektormezőkre vonatkozik.

  • A lemezen lévő tárhelyre, nem a memóriára van hatással, és nincs hatással a lekérdezésekre. A lekérdezés végrehajtása egy külön vektorindexet használ, amelyet a stored tulajdonság nem érint.

  • A stored tulajdonság a vektormezők indexlétrehozása során van beállítva, és visszafordíthatatlan. Ha később lekért tartalmat szeretne, el kell helyeznie és újra kell építenie az indexet, vagy létre kell hoznia és be kell töltenie egy új mezőt, amely rendelkezik az új hozzárendeléssel.

  • Az alapértelmezett értékek igaz értékre és retrievable hamis értékre vannak stored állítva. Az alapértelmezett konfigurációban a rendszer egy lekért példányt tárol, de a rendszer nem adja vissza automatikusan az eredményeket. Ha stored igaz, bármikor válthat retrievable az igaz és a hamis között anélkül, hogy újra kellene építenie egy indexet. Ha stored hamis, akkor hamisnak kell lennie, retrievable és nem módosítható.

3. lehetőség: Skaláris kvantálás konfigurálása

A beépített skaláris kvantálás azért ajánlott, mert csökkenti a memória- és lemeztárolási követelményeket, és újraméretezést és túlméretezést ad hozzá a kisebb indexek hatásainak ellensúlyozásához. A beépített skaláris kvantálás alkalmazható az adatokat tartalmazó vagy Float16 tartalmazó Float32 vektormezőkre.

Beépített vektortömörítés használata:

  • Hozzáadás vectorSearch.compressions keresési indexhez. Az előzetes verzióban támogatott tömörítési algoritmus a skaláris kvantálás.
  • Adja meg az opcionális tulajdonságokat a veszteséges indexelés hatásainak mérsékléséhez. Mindkettőt rerankWithOriginalVectors , és defaultOversampling optimalizálást biztosít a lekérdezés végrehajtása során.
  • Hozzáadás vectorSearch.profiles.compression egy új vektorprofilhoz.
  • Rendelje hozzá az új vektorprofilt egy új vektormezőhöz.

Tömörítési beállítások hozzáadása és választható tulajdonságok megadása

A 2024-03-01-preview REST API használatával létrehozott indexdefinícióban adjon hozzá egy szakasztcompressions. Használja a következő JSON-t sablonként.

"compressions": [

      {  
        "name": "my-scalar-quantization",  
        "kind": "scalarQuantization",  
        "rerankWithOriginalVectors": true,  (optional)
        "defaultOversampling": 10.0,  (optional)
        "scalarQuantizationParameters": {  (optional)
             "quantizedDataType": "int8",  (optional)
        }
      }  
   ]

Főbb pontok:

  • kind beállításnak a következőre kell állítania: scalarQuantization. Jelenleg ez az egyetlen támogatott kvantálási módszer.

  • 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 beállításnak a következőre kell állítania: int8. Jelenleg ez az egyetlen primitív adattípus, amely támogatott. Ez a tulajdonság opcionális. Az alapértelmezett szint a int8.

Tömörítési beállítás hozzáadása vektorprofilhoz

A skaláris kvantálás tulajdonságként van megadva egy új vektorprofilban. A tömörített indexek memóriabeli létrehozásához új vektorprofil létrehozása szükséges.

A profilon belül a Hierarchical Navigable Small Worlds (HNSW) algoritmust kell használnia. A beépített kvantálás nem támogatott a teljes KNN-vel.

  1. Hozzon létre egy új vektorprofilt, és adjon hozzá egy tömörítési tulajdonságot.

    "profiles": [
       {
          "name": "my-vector-profile",
          "compression": "my-scalar-quantization", 
          "algorithm": "my-hnsw-vector-config-1",
          "vectorizer": null
       }
     ]
    
  2. Vektorprofil hozzárendelése új vektormezőhöz. A skaláris kvantálás csökkenti a Int8tartalmat, ezért győződjön meg arról, hogy a tartalom vagy Float32Float16a .

    Az Azure AI Searchben az entitásadat-modell (EDM) megfelelői Float32 és Float16 típusai Collection(Edm.Single) , illetve Collection(Edm.Half)azok.

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

Példaindex vektorcompressionnal, adattípusokkal és tárolt tulajdonsággal

Íme egy összetett példa egy keresési indexre, amely szűk adattípusokat, csökkentett tárterületet és vektortömörítést határoz meg.

  • A "HotelNameVector" egy szűk adattípus-példát kínál, amely az eredeti Float32 értékeket a keresési indexben kifejezett Collection(Edm.Half) értékre Float16adhatja át.
  • A "HotelNameVector" értéke szintén stored hamis. A lekérdezési válaszban használt további beágyazások nincsenek tárolva. Ha stored hamis, retrievable akkor is hamisnak kell lennie.
  • A "DescriptionVector" példa a vektortömörítésre. A vektortömörítés az indexben van definiálva, egy profilban hivatkozva, majd egy vektormezőhöz rendelve. A "DescriptionVector" értéke szintén stored hamis.
### Create a new index
POST {{baseUrl}}/indexes?api-version=2024-03-01-preview  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

{
    "name": "hotels-vector-quickstart",
    "fields": [
        {
            "name": "HotelId", 
            "type": "Edm.String",
            "searchable": false, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": false, 
            "facetable": false,
            "key": true
        },
        {
            "name": "HotelName", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": false, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": false
        },
        {
            "name": "HotelNameVector",
            "type": "Collection(Edm.Half)",
            "searchable": true,
            "retrievable": false,
            "dimensions": 1536,
            "stored": false,
            "vectorSearchProfile": "my-vector-profile-no-compression"
        },
        {
            "name": "Description", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": false, 
            "retrievable": false, 
            "sortable": false, 
            "facetable": false
        },
        {
            "name": "DescriptionVector",
            "type": "Collection(Edm.Single)",
            "searchable": true,
            "retrievable": false,
            "dimensions": 1536,
            "stored": false,
            "vectorSearchProfile": "my-vector-profile-with-compression"
        },
        {
            "name": "Category", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": true
        },
        {
            "name": "Tags",
            "type": "Collection(Edm.String)",
            "searchable": true,
            "filterable": true,
            "retrievable": true,
            "sortable": false,
            "facetable": true
        },
        {
            "name": "Address", 
            "type": "Edm.ComplexType",
            "fields": [
                {
                    "name": "City", "type": "Edm.String",
                    "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                },
                {
                    "name": "StateProvince", "type": "Edm.String",
                    "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                }
            ]
        },
        {
            "name": "Location",
            "type": "Edm.GeographyPoint",
            "searchable": false, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": false
        }
    ],
"vectorSearch": {
    "compressions": [
        {
            "name": "my-scalar-quantization",
            "kind": "scalarQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10.0,
                "scalarQuantizationParameters": {
                    "quantizedDataType": "int8"
                }
        }
    ],
    "algorithms": [
        {
            "name": "my-hnsw-vector-config-1",
            "kind": "hnsw",
            "hnswParameters": 
            {
                "m": 4,
                "efConstruction": 400,
                "efSearch": 500,
                "metric": "cosine"
            }
        },
        {
            "name": "my-hnsw-vector-config-2",
            "kind": "hnsw",
            "hnswParameters": 
            {
                "m": 4,
                "metric": "euclidean"
            }
        },
        {
            "name": "my-eknn-vector-config",
            "kind": "exhaustiveKnn",
            "exhaustiveKnnParameters": 
            {
                "metric": "cosine"
            }
        }
    ],
    "profiles": [      
        {
            "name": "my-vector-profile-with-compression",
            "compression": "my-scalar-quantization",
            "algorithm": "my-hnsw-vector-config-1",
            "vectorizer": null
        },
        {
            "name": "my-vector-profile-no-compression",
            "compression": null,
            "algorithm": "my-eknn-vector-config",
            "vectorizer": null
        }
    ]
},
    "semantic": {
        "configurations": [
            {
                "name": "my-semantic-config",
                "prioritizedFields": {
                    "titleField": {
                        "fieldName": "HotelName"
                    },
                    "prioritizedContentFields": [
                        { "fieldName": "Description" }
                    ],
                    "prioritizedKeywordsFields": [
                        { "fieldName": "Tags" }
                    ]
                }
            }
        ]
    }
}

Kvantált vektormező lekérdezése túlméretezés használatával

A példában szereplő lekérdezési szintaxis a beépített skaláris kvantálást használó vektormezőkre vonatkozik. Alapértelmezés szerint a skaláris kvantálást használó vektormezők is használják rerankWithOriginalVectors és defaultOversampling mérsékelik a kisebb vektorindexek hatásait. Ezek a beállítások a keresési indexben vannak megadva.

A lekérdezésben felülbírálhatja a túlmintavétel alapértelmezett értékét. 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/[index-name]/docs/search?api-version=2024-03-01-Preview   
  Content-Type: application/json   
  api-key: [admin key]   

    {    
       "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.

Lásd még