Share via


Vektorindex létrehozása

Az Azure AI Searchben a vektortároló indexsémával rendelkezik, amely vektor- és nemvektormezőket határoz meg, vektorkonfigurációt a beágyazási területet létrehozó algoritmusokhoz, valamint a lekérdezési kérelmekben használt vektormező-definíciók beállításait. Az Index létrehozása vagy frissítése API létrehozza a vektortárolót.

A vektoradatok indexeléséhez kövesse az alábbi lépéseket:

  • Séma definiálása vektoralgoritmusokkal indexeléshez és kereséshez
  • Vektormezők hozzáadása
  • Előre elkészített adatok betöltése külön lépésként, vagy integrált vektorizálás (előzetes verzió) használata az adatok adattömbözéséhez és kódolásához az indexelés során

Ez a cikk ismerteti a munkafolyamatot, és rest használatával szemlélteti az egyes lépéseket. A REST API minden újabb verziója új funkciókat ad hozzá. Miután megismerte az alapszintű munkafolyamatot és az egyes API-verziók nyújtotta lehetőségeket, folytassa az Azure SDK-kódmintákkal az azure-search-vector-samples adattárban, hogy útmutatást nyújtsunk ezeknek a funkcióknak a tesztelési és éles kódban való használatához.

Tipp.

Az Azure Portal használatával hozzon létre egy vektorindexet , és próbálja ki az integrált vektorizálást.

Előfeltételek

  • Azure AI Search, bármely régióban és bármilyen szinten. A legtöbb meglévő szolgáltatás támogatja a vektorkeresést. A 2019. január előtt létrehozott szolgáltatások esetében van egy kis részhalmaz, amely nem tud vektorindexet létrehozni. Ebben az esetben létre kell hozni egy új szolgáltatást.

  • Ha az Azure SDK-k és REST API-k általánosan elérhető verzióját használja, a forrásdokumentumokban már meglévő vektorbeágyazások. További információ: Beágyazások létrehozása. Egy másik lehetőség az integrált vektorizálás (előzetes verzió).

  • Ismernie kell a beágyazások létrehozásához használt modell méretkorlátját és a hasonlóság kiszámításának módját. Az Azure OpenAI-ban a text-embedding-ada-002 esetében a numerikus vektor hossza 1536. A hasonlóság kiszámítása a következővel cosinetörténik: . Az érvényes értékek 2–3072 dimenziók.

  • Ismernie kell az indexek létrehozását. A sémának tartalmaznia kell a dokumentumkulcs mezőit, a keresendő vagy szűrni kívánt egyéb mezőket, valamint az indexelés és lekérdezések során szükséges viselkedések egyéb konfigurációit.

Dokumentumok előkészítése indexeléshez

Az indexelés előtt állítson össze egy hasznos dokumentumot, amely vektor- és nem adatmezőket tartalmaz. A dokumentumszerkezetnek meg kell felelnie az indexsémának.

Győződjön meg arról, hogy a dokumentumok:

  1. Adjon meg egy mezőt vagy metaadat-tulajdonságot, amely egyedileg azonosítja az egyes dokumentumokat. Minden keresési indexhez dokumentumkulcs szükséges. A dokumentumkulcs követelményeinek teljesítéséhez a forrásdokumentumnak egy olyan mezővel vagy tulajdonságsal kell rendelkeznie, amely egyedileg azonosíthatja azt az indexben. Ezt a forrásmezőt le kell képezni egy típusú Edm.String indexmezőre és key=true a keresési indexre.

  2. Adjon meg vektoradatokat (egy pontosságú lebegőpontos számok tömbje) a forrásmezőkben.

    A vektormezők modellek beágyazásával generált numerikus adatokat tartalmaznak, amelyek mezőnként egy beágyazással jönnek létre. Javasoljuk, hogy az Azure OpenAI-ban beágyazási modelleket hozzon létre, például szövegbeágyazási-ada-002 szöveges dokumentumokhoz, vagy a képek képlekérési REST API-jának használatát. Csak az index legfelső szintű vektormezői támogatottak: A vektor almezői jelenleg nem támogatottak.

  3. Adjon meg más mezőknek emberileg olvasható alfanumerikus tartalmat a lekérdezési válaszhoz, valamint olyan hibrid lekérdezési forgatókönyvekhez, amelyek teljes szöveges keresést vagy szemantikai rangsorolást tartalmaznak ugyanabban a kérésben.

A keresési indexnek tartalmaznia kell a támogatni kívánt lekérdezési forgatókönyvek mezőit és tartalmát. Tegyük fel, hogy termékneveket, verziókat, metaadatokat vagy címeket szeretne keresni vagy szűrni. Ebben az esetben a hasonlósági keresés nem különösen hasznos. A kulcsszókeresés, a geokeresés vagy a szűrők jobb választás lenne. A vektor- és nemvektoradatok átfogó mezőgyűjteményét tartalmazó keresési index maximális rugalmasságot biztosít a lekérdezések felépítéséhez és a válaszok összetételéhez.

A vektor- és nemvektormezőket tartalmazó dokumentumok hasznos adatainak rövid példája a jelen cikk terhelésvektor-adatszakaszában található.

Vektorkeresési konfiguráció hozzáadása

A vektorkonfiguráció az indexelés során használt vektorkeresési algoritmust és paramétereket határozza meg a "legközelebbi szomszéd" információ létrehozásához a vektorcsomópontok között:

  • Hierarchikus navigálható kisvilág (HNSW)
  • Teljes KNN

Ha egy mezőben a HNSW értéket választja, a lekérdezési időpontban teljes KNN-t választhat. A másik irány azonban nem működik: ha a teljesség igénye mellett dönt, később nem kérhet HNSW-keresést, mert a hozzávetőleges keresést lehetővé tevő további adatstruktúrák nem léteznek.

Előzetes verzióról stabil verzióra történő migrálási útmutatót keres? A lépésekért tekintse meg a REST API-k frissítését.

2023-11-01 általánosan elérhető. Támogatja a következő vektorkonfigurációt:

  • vectorSearch.algorithms indexelési és pontozási paraméterekkel.
  • vectorSearch.profiles algoritmuskonfigurációk több kombinációjához.

Ügyeljen arra, hogy legyen stratégiája a tartalom vektorizálására. A stabil verzió nem biztosít készségeket vagy vektorizálókat a beépített kódoláshoz.

  1. Az index létrehozásához használja az Index létrehozása vagy frissítése API-t.

  2. Adjon hozzá egy szakaszt vectorSearch az indexben, amely meghatározza a beágyazási terület létrehozásához használt keresési algoritmusokat.

     "vectorSearch": {
         "algorithms": [
             {
                 "name": "my-hnsw-config-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-hnsw-config-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-eknn-config",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "cosine"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "my-default-vector-profile",
             "algorithm": "my-hnsw-config-2"
           }
         ]
     }
    

    Főbb pontok:

    • A konfiguráció neve. A névnek egyedinek kell lennie az indexen belül.
    • profiles absztrakciós réteg hozzáadása a gazdagabb definíciókhoz. A rendszer definiál egy vectorSearchprofilt, majd név alapján hivatkozik az egyes vektormezőkre.
    • "hnsw" és "exhaustiveKnn" az indexelés során a vektortartalmak rendszerezésére használt közelítő szomszédok (ANN) algoritmusok.
    • "m" A (kétirányú kapcsolatszám) alapértelmezett értéke 4. A tartomány 4 és 10 között van. Az alacsonyabb értékek kevesebb zajt adnak vissza az eredményekben.
    • "efConstruction" alapértelmezett értéke 400. A tartomány 100 és 1000 között van. Az indexelés során használt legközelebbi szomszédok száma.
    • "efSearch" alapértelmezett értéke 500. A tartomány 100 és 1000 között van. A keresés során használt legközelebbi szomszédok száma.
    • "metric" Az Azure OpenAI használata esetén "koszinusznak" kell lennie, ellenkező esetben használja a használt beágyazási modellhez társított hasonlósági metrikát. A támogatott értékek a következőkcosine: , dotProducteuclidean.

Vektormező hozzáadása a mezők gyűjteményéhez

A mezőgyűjteménynek tartalmaznia kell egy mezőt a dokumentumkulcshoz, a vektormezőkhöz és a hibrid keresési forgatókönyvekhez szükséges egyéb mezőkhöz.

A vektormezőket az adattípusuk, a dimensions vektorok kimenetéhez használt beágyazási modellen alapuló tulajdonság és egy vektorprofil jellemzi.

Ezt a verziót akkor használja, ha csak általánosan elérhető funkciókat szeretne használni.

  1. Az index létrehozásához használja az Index létrehozása vagy frissítése parancsot .

  2. Adjon meg egy vektormezőt az alábbi attribútumokkal. Mezőnként egy generált beágyazást tárolhat. Minden vektormezőhöz:

    • type Ebben az API-verzióban kell lennie Collection(Edm.Single) .
    • dimensions a beágyazási modell által létrehozott dimenziók száma. A text-embedding-ada-002 esetében ez 1536.
    • vectorSearchProfile az index más részén definiált profil neve.
    • searchable igaznak kell lennie.
    • retrievable lehet igaz vagy hamis. A True a nyers vektorokat (1536)egyszerű szövegként adja vissza, és tárhelyet használ fel. Állítsa igaz értékre, ha vektoreredményt ad át egy alsóbb rétegbeli alkalmazásnak.
    • filterable, facetablehamisnak sortable kell lennie.
  3. Ha előszűrést vagy utószűrést szeretne meghívni a vektoros lekérdezésen, szűrhető, nem megadó mezőket adhat hozzá a gyűjteményhez, például a "cím" értéket igaz értékre filterable állítva.

  4. Adjon hozzá más mezőket, amelyek meghatározzák az indexelt szöveges tartalom tartalmát és szerkezetét. Legalább egy dokumentumkulcsra van szüksége.

    Olyan mezőket is hozzá kell adnia, amelyek hasznosak a lekérdezésben vagy a válaszában. Az alábbi példa a cím és a tartalom vektormezőit ("titleVector", "contentVector") mutatja be, amelyek a vektorokkal egyenértékűek. A keresési eredmények rendezéséhez, szűréséhez és olvasásához is hasznos mezőket biztosít az egyenértékű szöveges tartalomhoz ("title", "content").

    Az alábbi példa a mezők gyűjteményét mutatja be:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2023-11-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-config-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "my-default-vector-profile",
                    "algorithm": "my-hnsw-config-1"
                }
            ]
        }
    }
    

Vektoradatok betöltése indexeléshez

Az indexeléshez megadott tartalomnak meg kell felelnie az indexsémának, és tartalmaznia kell egy egyedi sztringértéket a dokumentumkulcshoz. Az előre elkészített adatok egy vagy több vektormezőbe vannak betöltve, amelyek együtt létezhetnek más alfanumerikus tartalmakat tartalmazó mezőkkel.

Az adatbetöltéshez leküldéses vagy lekéréses módszereket is használhat.

Dokumentumok – Index használata vektor- és nem adatmegjelenítési adatok indexbe való betöltéséhez. Az indexelés leküldéses API-i minden stabil és előzetes verzióban azonosak. A dokumentumok betöltéséhez használja az alábbi API-k bármelyikét:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Vektortartalom ellenőrzése az indexben

Érvényesítési célokból lekérdezheti az indexet a Search Explorer használatával az Azure Portalon vagy egy REST API-hívással. Mivel az Azure AI Search nem tud vektorokat emberi olvasásra alkalmas szöveggé alakítani, próbáljon meg ugyanabból a dokumentumból olyan mezőket visszaadni, amelyek bizonyítják az egyezést. Ha például a vektoros lekérdezés a "titleVector" mezőt célozza meg, a keresési eredményekhez kiválaszthatja a "cím" lehetőséget.

A mezőket "lekérdezhetőként" kell hozzárendelni az eredményekhez.

A Keresőböngészővel lekérdezhet egy indexet. A Keresőböngészőnek két nézete van: Lekérdezés nézet (alapértelmezett) és JSON-nézet.

  • Használja a JSON nézetet vektoros lekérdezésekhez, és illesztse be a végrehajtani kívánt vektoros lekérdezés JSON-definíciójában.

  • Használja az alapértelmezett Lekérdezés nézetet annak gyors megerősítéséhez, hogy az index vektorokat tartalmaz. A lekérdezési nézet teljes szöveges keresésre használható. Bár nem használhatja vektoros lekérdezésekhez, üres keresést (search=*) küldhet a tartalom kereséséhez. A program az összes mező tartalmát, beleértve a vektormezőket is, egyszerű szövegként adja vissza.

Vektortároló frissítése

Vektortároló frissítéséhez módosítsa a sémát, és szükség esetén töltse be újra a dokumentumokat az új mezők feltöltéséhez. A sémafrissítésekhez használható API-k közé tartozik a Create or Update Index (REST), a CreateOrUpdateIndex az Azure SDK for .NET-ben, create_or_update_index az Azure SDK for Pythonban, és hasonló módszerek más Azure SDK-kban.

Az indexek frissítésére vonatkozó általános útmutatót a Drop és az index újraépítése ismerteti.

A legfontosabb pontok a következők:

  • A meglévő mezők frissítéséhez és törléséhez gyakran szükség van az elvetésére és újraépítésére.

  • A meglévő sémákat azonban az alábbi módosításokkal frissítheti, és nincs szükség újraépítésre:

    • Új mezők hozzáadása egy mezőcsoporthoz.
    • Adjon hozzá új vektorkonfigurációkat, amelyek új mezőkhöz vannak rendelve, de a már vektorizált mezőket nem.
    • Módosítsa a "beolvasható" értéket (az értékek igaz vagy hamisak) egy meglévő mezőben. A vektormezőknek kereshetőnek és lekérdezhetőnek kell lenniük, de ha olyan helyzetekben szeretné letiltani a vektormezőkhöz való hozzáférést, ahol az elvetés és az újraépítés nem lehetséges, akkor a beolvasható értéket hamis értékre állíthatja.

Következő lépések

Következő lépésként javasoljuk, hogy lekérdezési vektoradatokat adjon meg egy keresési indexben.

Az azure-search-vector adattárban található kódminták a sémadefiníciót, vektorizálást, indexelést és lekérdezéseket tartalmazó, végpontok közötti munkafolyamatokat mutatják be.

A Python, a C# és a JavaScript demókódja is létezik.