Een vectorarchief maken

In Azure AI Search heeft een vectorarchief een indexschema dat vectorvelden en niet-vectorvelden definieert, een vectorconfiguratie voor algoritmen die de insluitruimte maken en instellingen voor vectorvelddefinities die worden gebruikt in queryaanvragen. De Create Index-API maakt het vectorarchief.

Volg deze stappen om vectorgegevens te indexeren:

  • Een schema definiëren met een of meer vectorconfiguraties waarmee algoritmen voor indexering en zoekopdrachten worden opgegeven
  • Een of meer vectorvelden toevoegen
  • Laad vooraf geplaatste gegevens als een afzonderlijke stap of gebruik geïntegreerde vectorisatie (preview) voor gegevenssegmentering en codering tijdens het indexeren.

Dit artikel is van toepassing op de algemeen beschikbare niet-preview-versie van vectorzoekopdrachten. Hierbij wordt ervan uitgegaan dat uw toepassingscode externe resources aanroept voor segmentering en codering.

Notitie

Op zoek naar migratierichtlijnen van 2023-07-01-preview? Zie REST API's voor upgraden.

Vereisten

  • Azure AI Search, in elke regio en op elke laag. De meeste bestaande services ondersteunen vectorzoekopdrachten. Voor services die vóór januari 2019 zijn gemaakt, is er een kleine subset die vectorzoekopdrachten niet kan ondersteunen. Als een index met vectorvelden niet kan worden gemaakt of bijgewerkt, is dit een indicator. In dit geval moet er een nieuwe service worden gemaakt.

  • Bestaande vector insluitingen in uw brondocumenten. Azure AI Search genereert geen vectoren in de algemeen beschikbare versie van de Azure SDK's en REST API's. We raden Azure OpenAI aan modellen in te sluiten, maar u kunt elk model gebruiken voor vectorisatie. Zie Insluitingen genereren voor meer informatie.

  • U moet weten wat de dimensielimiet is van het model dat wordt gebruikt om de insluitingen te maken en hoe overeenkomsten worden berekend. In Azure OpenAI is voor tekst-insluiten-ada-002 de lengte van de numerieke vector 1536. Gelijkenis wordt berekend met behulp van cosine. Geldige waarden zijn 2 tot en met 3072 dimensies.

  • U moet bekend zijn met het maken van een index. Het schema moet een veld bevatten voor de documentsleutel, andere velden die u wilt doorzoeken of filteren, en andere configuraties voor gedrag dat nodig is tijdens het indexeren en query's.

Documenten voorbereiden voor indexering

Voordat u indexeert, stelt u een nettolading van een document samen met velden van vector- en niet-vectorgegevens. De documentstructuur moet voldoen aan het indexschema.

Zorg ervoor dat uw documenten:

  1. Geef een veld of een metagegevenseigenschap op waarmee elk document uniek wordt geïdentificeerd. Voor alle zoekindexen is een documentsleutel vereist. Als u wilt voldoen aan de vereisten voor documentsleutels, moet een brondocument één veld of eigenschap hebben die het uniek kan identificeren in de index. Dit bronveld moet worden toegewezen aan een indexveld van het type Edm.String en key=true in de zoekindex.

  2. Geef vectorgegevens (een matrix van drijvendekommanummers met één precisie) op in bronvelden.

    Vectorvelden bevatten numerieke gegevens die worden gegenereerd door het insluiten van modellen, één insluiting per veld. U wordt aangeraden modellen in te sluiten in Azure OpenAI, zoals tekst-embedding-ada-002 voor tekstdocumenten of de REST API voor het ophalen van afbeeldingen voor afbeeldingen. Alleen index vectorvelden op het hoogste niveau worden ondersteund: Subvelden vector worden momenteel niet ondersteund.

  3. Geef andere velden met door mensen leesbare alfanumerieke inhoud voor het queryantwoord en voor hybride queryscenario's die zoeken in volledige tekst of semantische rangschikking in dezelfde aanvraag bevatten.

De zoekindex moet velden en inhoud bevatten voor alle queryscenario's die u wilt ondersteunen. Stel dat u wilt zoeken of filteren op productnamen, versies, metagegevens of adressen. In dit geval is zoeken naar overeenkomsten niet erg nuttig. Trefwoorden zoeken, geo-zoekopdrachten of filters zijn een betere keuze. Een zoekindex die een uitgebreide veldverzameling van vector- en nietvectorgegevens bevat, biedt maximale flexibiliteit voor het bouwen en samenstellen van query's.

Een kort voorbeeld van een nettolading van documenten die vector- en nietvectorvelden bevat, bevindt zich in de sectie gegevens van de belastingvector van dit artikel.

Een vectorzoekconfiguratie toevoegen

Een vectorconfiguratie geeft het algoritme voor vectorzoekopdrachten en parameters op die tijdens het indexeren worden gebruikt om informatie over dichtstbijzijnde buren te maken tussen de vectorknooppunten:

  • Hiërarchische navigable Small World (HNSW)
  • Uitgebreide KNN

Als u HNSW voor een veld kiest, kunt u ervoor kiezen om een uitgebreide KNN op het moment van de query uit te voeren. Maar de andere richting werkt niet: als u uitputtend kiest, kunt u later geen HNSW-zoekopdracht aanvragen omdat de extra gegevensstructuren die bij benadering zoeken mogelijk maken, niet bestaan.

Bent u op zoek naar richtlijnen voor migratie van preview-naar-stabiele versies? Zie REST API's upgraden voor stappen.

REST API-versie 2023-11-01 ondersteunt een vectorconfiguratie met:

  • vectorSearch algoritmen, hnsw en exhaustiveKnn dichtstbijzijnde buren, met parameters voor indexering en scoren.
  • vectorProfiles voor meerdere combinaties van algoritmeconfiguraties.

Zorg ervoor dat u een strategie hebt voor het vectoriseren van uw inhoud. De stabiele versie biedt geen vectorizers voor ingebouwde insluiting.

  1. Gebruik de INDEX-API maken of bijwerken om de index te maken.

  2. Voeg een vectorSearch sectie toe in de index waarmee de zoekalgoritmen worden opgegeven die worden gebruikt om de insluitingsruimte te maken.

     "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"
           }
         ]
     }
    

    Belangrijkste punten:

    • Naam van de configuratie. De naam moet uniek zijn binnen de index.
    • profiles voeg een abstractielaag toe voor het aanbrengen van uitgebreidere definities. Er wordt een profiel gedefinieerd in vectorSearchen vervolgens verwezen op naam op elk vectorveld.
    • "hnsw" en "exhaustiveKnn" zijn de algoritmen Bij benadering dichtstbijzijnde buren (ANN) die worden gebruikt om vectorinhoud tijdens het indexeren te ordenen.
    • "m" (aantal bidirectionele koppelingen) is standaard 4. Het bereik is 4 tot 10. Lagere waarden retourneren minder ruis in de resultaten.
    • "efConstruction" de standaardwaarde is 400. Het bereik is 100 tot 1.000. Dit is het aantal dichtstbijzijnde buren dat tijdens het indexeren wordt gebruikt.
    • "efSearch" de standaardwaarde is 500. Het bereik is 100 tot 1.000. Dit is het aantal dichtstbijzijnde buren dat tijdens de zoekopdracht wordt gebruikt.
    • "metric" moet 'cosinus' zijn als u Azure OpenAI gebruikt, anders gebruikt u de metrische overeenkomst die is gekoppeld aan het insluitmodel dat u gebruikt. Ondersteunde waarden zijn cosine, dotProduct, euclidean.

Een vectorveld toevoegen aan de verzameling velden

De verzameling velden moet een veld bevatten voor de documentsleutel, vectorvelden en eventuele andere velden die u nodig hebt voor hybride zoekscenario's.

Vectorvelden zijn van het type Collection(Edm.Single) en drijvendekommawaarden met één precisie. Een veld van dit type heeft ook een dimensions eigenschap en geeft een vectorconfiguratie op.

Gebruik deze versie als u alleen algemeen beschikbare functies wilt.

  1. Gebruik de index maken of bijwerken om de index te maken.

  2. Definieer een vectorveld met de volgende kenmerken. U kunt één gegenereerde insluiting per veld opslaan. Voor elk vectorveld:

    • type moet zijn: Collection(Edm.Single).
    • dimensions is het aantal dimensies dat wordt gegenereerd door het insluitmodel. Voor tekst-insluiten-ada-002 is het 1536.
    • vectorSearchProfile is de naam van een profiel dat elders in de index is gedefinieerd.
    • searchable moet waar zijn.
    • retrievable kan waar of onwaar zijn. True retourneert de onbewerkte vectoren (1536) als tekst zonder opmaak en verbruikt opslagruimte. Ingesteld op waar als u een vectorresultaat doorgeeft aan een downstream-app.
    • filterablesortable, facetablemoet onwaar zijn.
  3. Voeg filterbare nietvectorvelden toe aan de verzameling, zoals 'titel' met filterable de waarde True, als u prefiltering of postfiltering wilt aanroepen voor de vectorquery.

  4. Voeg andere velden toe die de inhoud en structuur van de tekstuele inhoud definiëren die u indexeert. U hebt minimaal een documentsleutel nodig.

    U moet ook velden toevoegen die handig zijn in de query of in het antwoord. In het volgende voorbeeld ziet u vectorvelden voor titel en inhoud ('titleVector', 'contentVector') die gelijk zijn aan vectoren. Het bevat ook velden voor gelijkwaardige tekstuele inhoud ('titel', 'inhoud') die handig is voor het sorteren, filteren en lezen in een zoekresultaat.

    In het volgende voorbeeld ziet u de verzameling velden:

    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"
                }
            ]
        }
    }
    

Vectorgegevens laden voor indexering

Inhoud die u opgeeft voor indexering, moet voldoen aan het indexschema en een unieke tekenreekswaarde voor de documentsleutel bevatten. Vooraf geplaatste gegevens worden geladen in een of meer vectorvelden, die naast andere velden kunnen bestaan die alfanumerieke inhoud bevatten.

U kunt push- of pull-methodologieën gebruiken voor gegevensopname.

Gebruik Indexdocumenten (2023-11-01), Indexdocumenten (2023-10-01-Preview) of documenten toevoegen, bijwerken of verwijderen (2023-07-01-Preview) om documenten met vectorgegevens te pushen.

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"
        }
        . . .
    ]
}

Controleer uw index op vectorinhoud

Voor validatiedoeleinden kunt u een query uitvoeren op de index met behulp van Search Explorer in Azure Portal of een REST API-aanroep. Omdat Azure AI Search een vector niet kan converteren naar door mensen leesbare tekst, probeert u velden te retourneren uit hetzelfde document dat bewijs van de overeenkomst levert. Als de vectorquery bijvoorbeeld is gericht op het veld titleVector, kunt u 'titel' selecteren voor de zoekresultaten.

Velden moeten worden toegeschreven aan 'ophaalbaar' om in de resultaten te worden opgenomen.

U kunt Search Explorer gebruiken om een query uit te voeren op een index. Search Explorer heeft twee weergaven: queryweergave (standaard) en JSON-weergave.

  • Gebruik de JSON-weergave voor vectorquery's en plak deze in een JSON-definitie van de vectorquery die u wilt uitvoeren.

  • Gebruik de standaardqueryweergave voor een snelle bevestiging dat de index vectoren bevat. De queryweergave is bedoeld voor zoeken in volledige tekst. Hoewel u deze niet kunt gebruiken voor vectorquery's, kunt u een lege zoekopdracht (search=*) verzenden om te controleren op inhoud. De inhoud van alle velden, inclusief vectorvelden, wordt geretourneerd als tekst zonder opmaak.

Een vectorarchief bijwerken

Als u een vectorarchief wilt bijwerken, wijzigt u het schema en laadt u documenten zo nodig opnieuw om nieuwe velden in te vullen. API's voor schema-updates zijn Onder andere Create or Update Index (REST), CreateOrUpdateIndex in de Azure SDK voor .NET, create_or_update_index in de Azure SDK voor Python en vergelijkbare methoden in andere Azure SDK's.

De standaardrichtlijnen voor het bijwerken van een index worden behandeld in Drop en rebuild an index.

Belangrijke punten zijn onder andere:

  • Verwijderen en herbouwen is vaak vereist voor updates en verwijdering van bestaande velden.

  • U kunt echter een bestaand schema bijwerken met de volgende wijzigingen, zonder dat u opnieuw hoeft te worden opgebouwd:

    • Voeg nieuwe velden toe aan een verzameling velden.
    • Voeg nieuwe vectorconfiguraties toe, toegewezen aan nieuwe velden, maar niet aan bestaande velden die al zijn gevectoriseerd.
    • Wijzig 'ophalen mogelijk' (waarden zijn waar of onwaar) in een bestaand veld. Vectorvelden moeten doorzoekbaar en opgehaald kunnen worden, maar als u de toegang tot een vectorveld wilt uitschakelen in situaties waarin neerzetten en opnieuw opbouwen niet haalbaar is, kunt u ophalen op onwaar instellen.

Volgende stappen

Als volgende stap raden we queryvectorgegevens aan in een zoekindex.

Codevoorbeelden in de opslagplaats azure-search-vector demonstreren end-to-end-werkstromen met schemadefinitie, vectorisatie, indexering en query's.

Er is democode voor Python, C# en JavaScript.