Een vectorindex maken
In Azure AI Search heeft een vectorarchief een indexschema dat vectorvelden en niet-vectorvelden definieert, een vectorconfiguratie voor algoritmen die de ingesloten ruimte maken en comprimeren, en instellingen voor vectorvelddefinities die worden gebruikt in queryaanvragen.
Met de INDEX-API maken of bijwerken wordt het vectorarchief gemaakt. Volg deze stappen om vectorgegevens te indexeren:
- Een schema definiëren met vectoralgoritmen en optionele compressie
- Vectorvelddefinities toevoegen
- Vooraf geprevectoriseerde gegevens laden als een afzonderlijke stap of geïntegreerde vectorisatie gebruiken voor het segmenteren en coderen van gegevens tijdens het indexeren
In dit artikel wordt de werkstroom uitgelegd en wordt REST gebruikt voor illustratie. Zodra u de basiswerkstroom begrijpt, gaat u verder met de Azure SDK-codevoorbeelden in de opslagplaats azure-search-vector-samples voor hulp bij het gebruik van deze functies in test- en productiecode.
Tip
Gebruik Azure Portal om een vectorindex te maken en geïntegreerde gegevenssegmentering en vectorisatie uit te proberen.
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 geen vectorindex kan maken. In dit geval moet er een nieuwe service worden gemaakt. Als u geïntegreerde vectorisatie gebruikt (vaardighedensets die Azure AI aanroepen), moet Azure AI Search zich in dezelfde regio bevinden als Azure OpenAI- of Azure AI-services.
Bestaande vector insluitingen of geïntegreerde vectorisering gebruiken, waarbij insluitingsmodellen worden aangeroepen vanuit de indexeringspijplijn.
U moet weten wat de dimensielimiet is van het model dat wordt gebruikt om de insluitingen te maken. Geldige waarden zijn 2 tot en met 3072 dimensies. In Azure OpenAI is voor tekst-insluiten-ada-002 de lengte van de numerieke vector 1536. Voor tekst-insluiten-3-kleine of tekst-insluiten-3-groot is de vectorlengte 3072.
U moet ook weten wat de ondersteunde overeenkomsten metrische gegevens zijn. Voor Azure OpenAI wordt overeenkomsten berekend met behulp van
cosine
.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:
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
enkey=true
in de zoekindex.Geef vectorgegevens (een matrix van drijvendekommanummers met één precisie) op in bronvelden.
Vectorvelden bevatten een matrix die wordt gegenereerd door het insluiten van modellen, één insluiting per veld, waarbij het veld een veld op het hoogste niveau is (geen deel van een genest of complex type). Voor de eenvoudigste integratie raden we de insluitmodellen in Azure OpenAI aan, zoals tekst-embedding-ada-002 voor tekstdocumenten of de REST API voor het ophalen van afbeeldingen voor afbeeldingen.
Als u afhankelijk kunt zijn van indexeerfuncties en vaardighedensets, kunt u overwegen geïntegreerde vectorisatie te gebruiken waarmee afbeeldingen en alfanumerieke inhoud tijdens het indexeren worden gecodeerd. Uw velddefinities zijn voor vectorvelden, maar brongegevens kunnen tekst of afbeeldingen zijn, waarbij vectormatrices worden gemaakt tijdens het indexeren.
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 de 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.
Een vectorconfiguratie geeft ook kwantisatiemethoden op voor het verminderen van de vectorgrootte:
- Scalar
- Binair (alleen beschikbaar in 2024-07-01 en in nieuwere Azure SDK-pakketten)
Zie Rest API upgraden voor instructies over het migreren naar de nieuwste versie.
2024-07-01 is algemeen beschikbaar. Het ondersteunt een vectorconfiguratie met:
vectorSearch.algorithms
ondersteuning voor HNSW en volledige KNN.vectorSearch.compressions
ondersteunt scalaire en binaire kwantisatie, oversampling en rerankering met oorspronkelijke vectoren.vectorSearch.profiles
bieden voor meerdere combinaties van algoritme- en compressieconfiguraties.
Zorg ervoor dat u een strategie hebt voor het vectoriseren van uw inhoud. We raden geïntegreerde vectorisatie en querytijdvectorizers aan voor ingebouwde codering.
Gebruik de INDEX-API maken of bijwerken om de index te maken.
Voeg een
vectorSearch
sectie toe in de index waarmee de zoekalgoritmen worden opgegeven die worden gebruikt om de insluitingsruimte te maken."vectorSearch": { "compressions": [ { "name": "scalar-quantization", "kind": "scalarQuantization", "rerankWithOriginalVectors": true, "defaultOversampling": 10.0, "scalarQuantizationParameters": { "quantizedDataType": "int8" } }, { "name": "binary-quantization", "kind": "binaryQuantization", "rerankWithOriginalVectors": true, "defaultOversampling": 10.0, } ], "algorithms": [ { "name": "hnsw-1", "kind": "hnsw", "hnswParameters": { "m": 4, "efConstruction": 400, "efSearch": 500, "metric": "cosine" } }, { "name": "hnsw-2", "kind": "hnsw", "hnswParameters": { "m": 8, "efConstruction": 800, "efSearch": 800, "metric": "hamming" } }, { "name": "eknn", "kind": "exhaustiveKnn", "exhaustiveKnnParameters": { "metric": "euclidean" } } ], "profiles": [ { "name": "vector-profile-hnsw-scalar", "compression": "scalar-quantization", "algorithm": "hnsw-1" } ] }
Belangrijkste punten:
Namen voor elke configuratie van compressie, algoritme en profiel moeten uniek zijn voor het type in de index.
vectorSearch.compressions.kind
kan ofscalarQuantization
binaryQuantization
.vectorSearch.compressions.rerankWithOriginalVectors
gebruikt de oorspronkelijke, niet-gecomprimeerde vectoren om overeenkomsten opnieuw te berekenen en de belangrijkste resultaten die door de eerste zoekquery worden geretourneerd, opnieuw te rangschikken. De niet-gecomprimeerde vectoren bestaan in de zoekindex, zelfs alsstored
deze onwaar is. Deze eigenschap is optioneel. De standaardwaarde is waar.vectorSearch.compressions.defaultOversampling
beschouwt een bredere set potentiële resultaten om de vermindering van de informatie van kwantisatie te compenseren. De formule voor mogelijke resultaten bestaat uit dek
in de query, met een vermenigvuldiger voor oversampling. Als de query bijvoorbeeld eenk
van 5 opgeeft en oversampling 20 is, vraagt de query in feite 100 documenten aan voor gebruik bij het opnieuw rangschikken, waarbij de oorspronkelijke niet-gecomprimeerde vector voor dat doel wordt gebruikt. Alleen de meestk
gererankeerde resultaten worden geretourneerd. Deze eigenschap is optioneel. De standaardwaarde is 4.vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType
moet zijn ingesteld opint8
. Dit is het enige primitieve gegevenstype dat op dit moment wordt ondersteund. Deze eigenschap is optioneel. Standaard isint8
.vectorSearch.algorithms.kind
"hnsw"
zijn of"exhaustiveKnn"
. Dit zijn de algoritmen bij benadering dichtstbijzijnde buren (ANN) die worden gebruikt om vectorinhoud tijdens het indexeren te ordenen.vectorSearch.algorithms.m
is het aantal bidirectionele koppelingen. De standaardwaarde is 4. Het bereik is 4 tot 10. Lagere waarden retourneren minder ruis in de resultaten.vectorSearch.algorithms.efConstruction
is het aantal dichtstbijzijnde buren dat wordt gebruikt tijdens het indexeren. De standaardwaarde is 400. Het bereik is 100 tot 1.000."vectorSearch.algorithms.fSearch
is het aantal dichtstbijzijnde buren dat tijdens de zoekopdracht wordt gebruikt. De standaardwaarde is 500. Het bereik is 100 tot 1.000.vectorSearch.algorithms.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 zijncosine
,dotProduct
, ,hamming
euclidean
(gebruikt voor het indexeren van binaire gegevens).vectorSearch.profiles
voeg een abstractielaag toe voor het aanbrengen van uitgebreidere definities. Er wordt een profiel gedefinieerd invectorSearch
en vervolgens verwezen op naam op elk vectorveld. Het is een combinatie van compressie- en algoritmeconfiguraties. Dit is de eigenschap die u toewijst aan een vectorveld en bepaalt het algoritme en de compressie van de velden.
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 worden gekenmerkt door hun gegevenstype, een dimensions
eigenschap op basis van het insluitmodel dat wordt gebruikt om de vectoren uit te voeren en een vectorprofiel.
2024-07-01 is algemeen beschikbaar.
Gebruik de index maken of bijwerken om de index te maken.
Definieer een vectorveld met de volgende kenmerken. U kunt één gegenereerde insluiting per veld opslaan. Voor elk vectorveld:
type
moet een vectorgegevenstypen zijn.Collection(Edm.Single)
is de meest voorkomende voor het insluiten van modellen.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.stored
kan waar of onwaar zijn. Het bepaalt of een extra kopie van vectoren wordt opgeslagen voor het ophalen. Zie Vectorgrootte verkleinen voor meer informatie.filterable
sortable
,facetable
moet onwaar zijn.
Voeg filterbare nietvectorvelden toe aan de verzameling, zoals 'titel' met
filterable
de waarde True, als u prefiltering of postfiltering wilt aanroepen voor de vectorquery.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=2024-07-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, "stored": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-1" }, { "name": "content", "type": "Edm.String", "searchable": true, "retrievable": true }, { "name": "contentVector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": false, "stored": false, "dimensions": 1536, "vectorSearchProfile": "vector-profile-1" } ], "vectorSearch": { "algorithms": [ { "name": "hnsw-1", "kind": "hnsw", "hnswParameters": { "m": 4, "efConstruction": 400, "efSearch": 500, "metric": "cosine" } } ], "profiles": [ { "name": "vector-profile-1", "algorithm": "hnsw-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 Documenten - Index om vector- en niet-vectorgegevens in een index te laden. De push-API's voor indexering zijn identiek in alle stabiele en preview-versies. Gebruik een van de volgende API's om documenten te laden:
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01
{
"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.
Controleer de indexen in zoekbeheerindexen> om de indexgrootte all-up en vectorindexgrootte weer te geven. Een positieve vectorindexgrootte geeft aan dat vectoren aanwezig zijn.
Gebruik Search Explorer om een query uit te voeren op een index. Search Explorer heeft twee weergaven: queryweergave (standaard) en JSON-weergave.
Stel queryopties>Vectorwaarden verbergen in zoekresultaten in voor beter leesbare resultaten.
Gebruik de JSON-weergave voor vectorquery's. U kunt een JSON-definitie van de vectorquery plakken die u wilt uitvoeren, of de ingebouwde conversie van tekst-naar-vector of image-to-vector-conversie gebruiken als uw index een vectorizer-toewijzing heeft. Zie quickstart: Afbeeldingen zoeken in Search Explorer voor meer informatie over zoeken naar afbeeldingen.
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.Zie Een vectorquery maken voor meer informatie.
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 Update of herbouwen van een 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.