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


Vektoros lekérdezés létrehozása az Azure AI Searchben

Az Azure AI Searchben, ha vektorindexe van, ez a cikk a következő lépéseket ismerteti:

Ez a cikk REST-et használ az ábrához. Más nyelvű kódmintákért tekintse meg az azure-search-vector-samples GitHub-adattárat a vektoros lekérdezéseket tartalmazó végpontok közötti megoldásokhoz.

A Search Explorert az Azure Portalon is használhatja.

Előfeltételek

Lekérdezési sztring bemenetének konvertálása vektorsá

Vektormező lekérdezéséhez magának a lekérdezésnek vektornak kell lennie.

A felhasználó szöveges lekérdezési sztringjének vektoros ábrázolássá alakításának egyik módszere egy beágyazási kódtár vagy API meghívása az alkalmazáskódban. Ajánlott eljárásként mindig ugyanazokat a beágyazási modelleket használja, amelyeket beágyazások létrehozásához használ a forrásdokumentumokban. Kódmintákat talál, amelyek bemutatják , hogyan hozhat létre beágyazásokat az azure-search-vector-samples adattárban.

A második módszer az általánosan elérhető integrált vektorizáció használata, hogy az Azure AI Search kezelje a lekérdezésvektorizációs bemeneteket és kimeneteket.

Íme egy REST API-példa egy Azure OpenAI-beágyazási modell üzembe helyezéséhez küldött lekérdezési sztringre:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

A várt válasz 202 lesz az üzembe helyezett modell sikeres hívásához.

A válasz törzsében a "beágyazás" mező a "bemenet" lekérdezési sztring vektoros ábrázolása. Tesztelési célokra a "beágyazás" tömb értékét egy lekérdezési kérelemben a "vectorQueries.vector" fájlba másolná a következő szakaszokban látható szintaxis használatával.

A POST-hívás tényleges válasza az üzembe helyezett modellre 1536 beágyazást tartalmaz, amelyeket itt vágunk le, hogy csak az első néhány vektor legyen olvasható.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

Ebben a megközelítésben az alkalmazáskód felelős a modellhez való csatlakozásért, a beágyazások generálásáért és a válasz kezeléséhez.

Vektoros lekérdezési kérelem

Ez a szakasz a vektoros lekérdezések alapstruktúráját mutatja be. Vektoros lekérdezések létrehozásához használhatja az Azure Portalt, a REST API-kat vagy az Azure SDK-kat. Ha 2023-07-01-preview-ról migrál, akkor kompatibilitástörő változások következnek be. További részletekért lásd : Frissítés a legújabb REST API-ra .

A 2024-07-01 a Search POST stabil REST API-verziója. Ez a verzió a következőket támogatja:

  • vectorQueries a vektorkeresés felépítése.
  • vectorQueries.kindvector vektortömbre, vagy ha text a bemenet sztring, és van vektorizálója.
  • vectorQueries.vector a lekérdezés (szöveg vagy kép vektoros ábrázolása).
  • vectorQueries.weight (nem kötelező) a keresési műveletekben szereplő egyes vektoros lekérdezések relatív súlyát adja meg (lásd a vektorok súlyozását).
  • exhaustive (nem kötelező) teljes KNN-t hív meg lekérdezéskor, még akkor is, ha a mező indexelve van a HNSW-hez.

A következő példában a vektor ennek a sztringnek a megjelenítése: "amit az Azure-szolgáltatások támogatnak a teljes szöveges keresésben". A lekérdezés a contentVector mezőt célozza meg. A lekérdezés eredményeket ad k vissza. A tényleges vektor 1536 beágyazással rendelkezik, ezért ebben a példában az olvashatóság érdekében vágja le.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "weight": 0.5,
            "k": 5
        }
    ]
}

Vektoros lekérdezési válasz

Az Azure AI Searchben a lekérdezési válaszok alapértelmezés szerint az összes retrievable mezőből állnak. Gyakori azonban, hogy a keresési eredményeket a mezők egy részhalmazára retrievable korlátozza, ha egy select utasításban listázzuk őket.

A vektoros lekérdezésekben gondosan gondolja át, hogy a válaszban vektormezőkre van-e szükség. A vektormezők nem olvashatók az emberek számára, ezért ha választ küld egy weblapra, akkor az eredményre jellemző nem adatmegjelenítő mezőket kell választania. Ha például a lekérdezés a következőre contentVectorfut, akkor vissza is térhet content .

Ha vektormezőket szeretne az eredményben, íme egy példa a válaszstruktúrára. contentVector a beágyazások sztringtömbje, amelyet itt vágunk le a rövidítéshez. A keresési pontszám relevanciát jelez. A környezet más nem adatvetítő mezőket is tartalmaz.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Főbb pontok:

  • k meghatározza, hogy hány legközelebbi szomszéd eredményt ad vissza, ebben az esetben három. A vektoros lekérdezések mindig eredményeket adnak vissza k , feltéve, hogy legalább k dokumentumok léteznek, még akkor is, ha vannak rossz hasonlóságú dokumentumok, mivel az algoritmus megkeresi k a lekérdezésvektor legközelebbi szomszédjait.

  • Ezt @search.score a vektorkeresési algoritmus határozza meg.

  • A keresési eredmények mezői vagy az összes retrievable mező, vagy egy select záradék mezői. A vektoros lekérdezés végrehajtása során az egyezés csak vektoradatokon történik. A válaszok azonban az index bármely retrievable mezőjét tartalmazhatják. Mivel a vektormezők eredményének dekódolására nincs lehetőség, a nem adatfeltáró szövegmezők felvétele hasznos lehet az emberi olvasható értékekhez.

Több vektormező

A "vectorQueries.fields" tulajdonságot több vektormezőre is beállíthatja. A vektoros lekérdezés a listában megadott fields összes vektormezőn fut. Több vektormező lekérdezésekor győződjön meg arról, hogy mindegyik ugyanabból a beágyazási modellből tartalmaz beágyazást, és hogy a lekérdezés is ugyanabból a beágyazási modellből jön létre.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Több vektoros lekérdezés

A több lekérdezéses vektoros keresés több lekérdezést küld a keresési index több vektormezőjében. Erre a lekérdezési kérelemre gyakori példa, ha olyan modelleket használ, mint például a CLIP egy többmodális vektoros kereséshez, ahol ugyanaz a modell képes vektorizálni a kép- és szövegtartalmat.

Az alábbi lekérdezési példa a hasonlóságot keresi mind a kettőben myImageVector myTextVector, mind pedig a két különböző lekérdezésbe ágyazott, párhuzamosan futtatott lekérdezési beágyazást. Ez a lekérdezés olyan eredményt hoz létre, amelyet a Kölcsönös rangsor fúzió (RRF) használatával pontozott.

  • vectorQueries vektoros lekérdezések tömbje.
  • vector A keresési index képvektorait és szövegvektorait tartalmazza. Minden példány külön lekérdezés.
  • fields megadja, hogy melyik vektormezőt célozza meg.
  • k az eredményekbe belefoglalandó legközelebbi szomszéd egyezések száma.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

A keresési eredmények szöveg és képek kombinációját is tartalmazhatják, feltéve, hogy a keresési index tartalmaz egy mezőt a képfájlhoz (a keresési index nem tárolja a képeket).

Lekérdezés integrált vektorizálással

Ez a szakasz egy vektoros lekérdezést mutat be, amely meghívja az integrált vektorizációt , amely egy szöveg- vagy kép lekérdezést vektorsá alakít át. A szolgáltatáshoz a stabil 2024-07-01-es REST API-t, a Search Explorert vagy az újabb Azure SDK-csomagokat javasoljuk.

Az előfeltétel egy olyan keresési index, amely konfigurálva van egy vektormezőhöz, és hozzá van rendelve egy vektormezőhöz . A vektorizáló kapcsolati adatokat biztosít a lekérdezési időpontban használt beágyazási modellhez.

A Search Explorer támogatja az integrált vektorizálást a lekérdezési időpontban. Ha az index vektormezőket tartalmaz, és vektorizálóval rendelkezik, használhatja a beépített szöveg-vektor konverziót.

  1. Jelentkezzen be az Azure Portalra az Azure-fiókjával, és lépjen az Azure AI-Search szolgáltatás.

  2. A bal oldali menüben bontsa ki a Kereséskezelési>indexek elemet, és válassza ki az indexet. A Keresőböngésző az indexlap első lapja.

  3. Ellenőrizze a vektorprofilokat , hogy rendelkezik-e vektorizálóval.

    Képernyőkép egy vektorizáló beállításról a keresési indexben.

  4. A Kereséskezelőben a lekérdezés nézetben beírhat egy szöveges sztringet az alapértelmezett keresősávba. A beépített vektorizáló vektorsá alakítja a sztringet, végrehajtja a keresést, és visszaadja az eredményeket.

    A lekérdezés megtekintéséhez vagy módosításához a JSON nézet megtekintése>lehetőséget is választhatja. Ha vektorok vannak jelen, a Keresőböngésző automatikusan beállít egy vektoros lekérdezést. A JSON-nézettel kiválaszthatja a keresésben és a válaszban használt mezőket, szűrőket adhat hozzá, vagy összetettebb lekérdezéseket hozhat létre, például hibrid lekérdezéseket. A szakasz REST API lapján JSON-példa látható.

A rangsorolt eredmények száma vektoros lekérdezési válaszban

A vektoros lekérdezés megadja a k paramétert, amely meghatározza, hogy hány találatot ad vissza az eredmény. A keresőmotor mindig a találatok k számát adja vissza. Ha k nagyobb, mint az indexben lévő dokumentumok száma, akkor a dokumentumok száma határozza meg a visszaadható dokumentumok felső korlátját.

Ha ismeri a teljes szöveges keresést, akkor nulla eredményt vár, ha az index nem tartalmaz kifejezést vagy kifejezést. A vektoros keresésben azonban a keresési művelet a legközelebbi szomszédokat azonosítja, és mindig eredményeket ad vissza k , még akkor is, ha a legközelebbi szomszédok nem hasonlóak. Így előfordulhat, hogy nem etikátlan vagy nem témakörön kívüli lekérdezések eredményei jelennek meg, különösen akkor, ha nem használ utasításokat a határok megadásához. A kevésbé releváns eredmények rosszabb hasonlósági pontszámmal rendelkeznek, de még mindig ezek a "legközelebbi" vektorok, ha nincs közelebb semmi. Így a nem értelmezhető eredményekkel rendelkező válaszok továbbra is eredményeket adhatnak vissza k , de az egyes eredmények hasonlósági pontszáma alacsony lenne.

A teljes szöveges keresést tartalmazó hibrid megközelítés enyhítheti ezt a problémát. Egy másik kockázatcsökkentés a keresési pontszám minimális küszöbértékének beállítása, de csak akkor, ha a lekérdezés egy tiszta egyvektoros lekérdezés. A hibrid lekérdezések nem kedveznek a minimális küszöbértékeknek, mert az RRF-tartományok sokkal kisebbek és változékonyak.

Az eredményszámot befolyásoló lekérdezési paraméterek a következők:

  • "k": n csak vektoros lekérdezések eredményei
  • "top": n keresési paramétert tartalmazó hibrid lekérdezések eredményei

A "k" és a "top" is választható. Meghatározatlan, a válaszban szereplő eredmények alapértelmezett száma 50. A "top" és a "skip" beállítással több találatot is megadhat, vagy módosíthatja az alapértelmezett értéket .

Vektoros lekérdezésekben használt rangsorolási algoritmusok

Az eredmények rangsorolása az alábbiak szerint történik:

  • Hasonlóság metrika
  • Reciprok Rank Fusion (RRF), ha több keresési találat van.

Hasonlóság metrika

A csak vektoros lekérdezés indexszakaszában vectorSearch megadott hasonlósági metrika. Az érvényes értékek a következők cosine: , euclideanés dotProduct.

Az Azure OpenAI-beágyazási modellek koszinuszos hasonlóságot használnak, ezért ha Azure OpenAI-beágyazási modelleket használ, cosine az ajánlott metrika. Egyéb támogatott rangsorolási metrikák a következők: euclidean és dotProduct.

Az RRF használata

Több halmaz akkor jön létre, ha a lekérdezés több vektormezőt céloz meg, több vektoros lekérdezést futtat párhuzamosan, vagy ha a lekérdezés vektoros és teljes szöveges keresés hibridje, szemantikai rangsorolással vagy anélkül.

A lekérdezés végrehajtása során a vektoros lekérdezések csak egy belső vektorindexet célozhatnak meg. Így több vektormező és több vektoros lekérdezés esetén a keresőmotor több lekérdezést hoz létre, amelyek az egyes mezők megfelelő vektorindexeit célják. A kimenet az egyes lekérdezések rangsorolt eredményeinek halmaza, amelyek az RRF használatával vannak egyesítve. További információ: Relevanciapontozás a Kölcsönös rangsor fúzió (RRF) használatával.

Vektorok súlyozása

Adjon hozzá egy lekérdezési paramétert weight a keresési műveletekben szereplő vektoros lekérdezések relatív súlyának megadásához. Ez az érték két vagy több vektoros lekérdezés által ugyanabban a kérelemben vagy egy hibrid lekérdezés vektorrészéből előállított több rangsorlista eredményeinek kombinálásakor használatos.

Az alapértelmezett érték 1,0, az értéknek nullánál nagyobb pozitív számnak kell lennie.

Az egyes dokumentumok kölcsönös rangsorolvasási pontszámainak kiszámításakor súlyozást használunk. A számítás az érték szorzója a weight dokumentum rangpontszámával szemben a megfelelő eredményhalmazon belül.

Az alábbi példa egy hibrid lekérdezés két vektoros lekérdezési sztringgel és egy szöveges sztringgel. A vektoros lekérdezésekhez súlyok vannak rendelve. Az első lekérdezés a súly 0,5 vagy fele, ami csökkenti annak fontosságát a kérelemben. A második vektoros lekérdezés kétszer olyan fontos.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-07-01

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

A vektorok súlyozása csak vektorokra vonatkozik. A példában szereplő szöveges lekérdezés ("hello world") implicit súlya 1,0 vagy semleges. Hibrid lekérdezésekben azonban a maxTextRecallSize beállításával növelheti vagy csökkentheti a szövegmezők fontosságát.

Küszöbértékek beállítása az alacsony pontszámú eredmények kizárásához (előzetes verzió)

Mivel a legközelebbi szomszédkeresés mindig a kért k szomszédokat adja vissza, több alacsony pontszámú találat is lekérhető a k keresési eredmények számkövetelményének teljesítése során. Az alacsony pontszámú keresési eredmények kizárásához hozzáadhat egy lekérdezési paramétert threshold , amely minimális pontszám alapján szűri az eredményeket. A szűrés a különböző visszahívási csoportok eredményeinek összeolvadása előtt történik.

Ez a paraméter még előzetes verzióban érhető el. Javasoljuk, hogy a REST API 2024-05-01-preview verzióját tekintse meg.

Ebben a példában a 0,8 alatti pontszámot tartalmazó összes találat ki lesz zárva a vektorkeresési eredményekből, még akkor is, ha a találatok száma az alá kcsökken.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall hibrid kereséshez (előzetes verzió)

A vektoros lekérdezéseket gyakran használják olyan hibrid szerkezetekben, amelyek nem aktormezőket tartalmaznak. Ha azt tapasztalja, hogy a BM25-rangsorolt eredmények egy hibrid lekérdezési eredményben felül vagy alul vannak jelölve, beállíthatja maxTextRecallSize , hogy növelje vagy csökkentse a hibrid rangsoroláshoz megadott BM25-rangsorolt eredményeket.

Ezt a tulajdonságot csak a "search" és a "vectorQueries" összetevőket tartalmazó hibrid kérelmekben állíthatja be.

Ez a paraméter még előzetes verzióban érhető el. Javasoljuk, hogy a REST API 2024-05-01-preview verzióját tekintse meg.

További információ: Set maxTextRecallSize – Create a hybrid query.

Következő lépések

Következő lépésként tekintse át a vektoros lekérdezési kód példáit Pythonban, C# vagy JavaScriptben.