Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Segmenteringsstrategieën voor tekstgegevens spelen een belangrijke rol bij het optimaliseren van RAG-antwoorden en -prestaties. Met behulp van de vaardigheid Documentindeling kunt u inhoud segmenteren op basis van documentstructuur, koppen vastleggen en de hoofdtekst van de inhoud segmenteren op basis van semantische samenhang, zoals alinea's en zinnen. Brokken worden onafhankelijk verwerkt. Omdat LLM's met meerdere segmenten werken, wordt de algehele relevantie van de query verbeterd wanneer deze segmenten van hogere kwaliteit en semantisch coherent zijn.
De vaardigheid Documentindeling roept het indelingsmodel aan van Azure Document Intelligence in Foundry Tools. Het model formulet inhoudsstructuur in JSON met behulp van Markdown-syntaxis (koppen en inhoud), met velden voor koppen en inhoud die zijn opgeslagen in een zoekindex in Azure AI Search. De doorzoekbare inhoud die wordt geproduceerd op basis van de vaardigheid Documentindeling is tekst zonder opmaak, maar u kunt geïntegreerde vectorisatie toepassen om insluitingen te genereren voor elk veld in uw brondocumenten, inclusief afbeeldingen.
In dit artikel leert u het volgende:
- De vaardigheid Documentindeling gebruiken om de documentstructuur te herkennen
- De vaardigheid Tekst splitsen gebruiken om de grootte van segmenten te beperken tot elke Markdown-sectie
- Insluitingen genereren voor elk segment
- Indexprojecties gebruiken om insluitingen toe te wijzen aan velden in een zoekindex
Ter illustratie gebruikt dit artikel de PDF-bestanden van het voorbeeldstatusplan die zijn geüpload naar Azure Blob Storage en vervolgens geïndexeerd met behulp van de wizard Gegevens importeren (nieuw).
Vereisten
Een indexeerpijplijn op basis van een indexeerfunctie met een index die de uitvoer accepteert. De index moet velden bevatten voor het ontvangen van koppen en inhoud.
Een indexprojectie voor een-op-veel-indexering.
Een ondersteunde gegevensbron met tekstinhoud die u wilt segmenteren.
Een vaardighedenset met deze twee vaardigheden:
Vaardigheid documentindeling waarmee documenten worden gesplitst op basis van alineagrenzen. Als u facturering op basis van sleutels gebruikt, moet Microsoft Foundry zich in dezelfde regio bevinden als Azure AI Search voor AI-verrijking. Regiovereisten zijn versoepeld voor sleutelloze facturering (preview).
Azure OpenAI Embedding-vaardigheid waarmee vector-insluitingen worden gegenereerd. Deze vaardigheid heeft geen regiovereisten.
Gegevensbestanden voorbereiden
De onbewerkte invoer moet zich in een ondersteunde gegevensbron bevinden en het bestand moet een indeling zijn die door de Documentindeling-vaardigheid wordt ondersteund.
Ondersteunde bestandsindelingen zijn: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.
Ondersteunde indexeerfuncties kunnen elke indexeerfunctie zijn die de ondersteunde bestandsindelingen kan verwerken. Deze indexeerfuncties omvatten Blob-indexeerfuncties, Microsoft OneLake-indexeerfuncties, bestandsindexeerfuncties.
Ondersteunde regio's voor de portalervaring van deze functie zijn: VS - oost, Europa - west, VS - noord-centraal. Als u uw vaardighedenset programmatisch instelt, kunt u elke Azure Document Intelligence-regio gebruiken die ook de AI-verrijkingsfunctie van Azure AI Search biedt. Zie Beschikbaarheid van producten per regio voor meer informatie.
U kunt de Azure-portal, REST API's of een Azure SDK-pakket gebruiken om een gegevensbron te maken.
Aanbeveling
Upload de gezondheidsplan PDF-voorbeeldbestanden naar uw ondersteunde gegevensbron om de vaardigheid voor documentindeling en structuurbewuste segmentering uit te proberen op uw eigen zoekservice. De wizard Gegevens importeren (nieuw) is een eenvoudige codevrije benadering voor het uitproberen van deze vaardigheid. Zorg ervoor dat u de standaardparseermodus selecteert om structuurbewust segmenteren te gebruiken. Anders wordt de Markdown-parseermodus gebruikt.
Een index maken voor een-op-veel-indexering
Hier volgt een voorbeeld van een nettolading van één zoekdocument dat is ontworpen rond segmenten. Wanneer u met stukken werkt, hebt u een stukveld en een ouderveld nodig om de oorsprong van het stuk te identificeren. In dit voorbeeld zijn oudervelden de 'text_parent_id'. Onderliggende velden zijn de vector- en niet-vectorsegmenten van de markdown-sectie.
De vaardigheid Documentindeling voert koppen en inhoud uit. In dit voorbeeld worden documentkoppen header_1 tot header_3 opgeslagen, zoals gedetecteerd door de functie. Andere inhoud, zoals alinea's, wordt opgeslagen in chunk. Het text_vector veld is een vectorweergave van de inhoud van het segmentveld.
U kunt de wizard Gegevens importeren (nieuw) in Azure Portal, REST API's of een Azure SDK gebruiken om een index te maken. De volgende index is vergelijkbaar met wat de wizard standaard maakt. Mogelijk hebt u meer velden als u afbeeldingsvectorisatie toevoegt.
Als u de wizard niet gebruikt, moet de index aanwezig zijn in de zoekservice voordat u de vaardighedenset maakt of de indexeerfunctie uitvoert.
{
"name": "my_consolidated_index",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": true,
"facetable": false,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_parent_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "chunk",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "title",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_1",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_2",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_3",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "profile"
}
],
"vectorSearch": {
"profiles": [
{
"name": "profile",
"algorithm": "algorithm"
}
],
"algorithms": [
{
"name": "algorithm",
"kind": "hnsw"
}
]
}
}
Een vaardighedenset definiëren voor structuurbewust segmenteren en vectoriseren
In deze sectie ziet u een voorbeeld van een definitie van een vaardighedenset die afzonderlijke Markdown-secties, segmenten en hun vectorequivalenten projecteert als velden in de zoekindex. Hierbij wordt de vaardigheid Documentindeling gebruikt om koppen te detecteren en een inhoudsveld te vullen op basis van semantisch samenhangende alinea's en zinnen in het brondocument. Er wordt gebruikgemaakt van de vaardigheid Tekst splitsen om de Markdown-inhoud op te splitsen in segmenten. Het maakt gebruik van de Azure OpenAI Embedding skill om brokken en andere velden waarvoor u embeddings wilt, te vectoriseren.
Naast vaardigheden omvat de vaardighedenset het volgendeindexProjections:cognitiveServices
indexProjectionsworden gebruikt voor indexen die gesegmenteerde documenten bevatten. De projecties geven aan hoe ouder-kind inhoud wordt toegewezen aan velden in een zoekmachine-index voor een-op-veel-indexering. Zie Een indexprojectie definiëren voor meer informatie.cognitiveServicesvoegt een Foundry-resource toe voor factureringsdoeleinden (de Document Layout-vaardigheid is beschikbaar via Standard Pricing).
POST {endpoint}/skillsets?api-version=2025-09-01
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with an index projection around markdown section",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "my_document_intelligence_layout_skill",
"context": "/document",
"outputMode": "oneToMany",
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "markdown_document",
"targetName": "markdownDocument"
}
],
"markdownHeaderDepth": "h3"
},
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "my_markdown_section_split_skill",
"description": "A skill that splits text into chunks",
"context": "/document/markdownDocument/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/content",
"inputs": []
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
],
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"unit": "characters"
},
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "my_azure_openai_embedding_skill",
"context": "/document/markdownDocument/*/pages/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/pages/*",
"inputs": []
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"resourceUri": "https://<subdomain>.openai.azure.com",
"deploymentId": "text-embedding-3-small",
"apiKey": "<Azure OpenAI api key>",
"modelName": "text-embedding-3-small"
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"key": "<Cognitive Services api key>"
},
"indexProjections": {
"selectors": [
{
"targetIndexName": "my_consolidated_index",
"parentKeyFieldName": "text_parent_id",
"sourceContext": "/document/markdownDocument/*/pages/*",
"mappings": [
{
"name": "text_vector",
"source": "/document/markdownDocument/*/pages/*/text_vector"
},
{
"name": "chunk",
"source": "/document/markdownDocument/*/pages/*"
},
{
"name": "title",
"source": "/document/title"
},
{
"name": "header_1",
"source": "/document/markdownDocument/*/sections/h1"
},
{
"name": "header_2",
"source": "/document/markdownDocument/*/sections/h2"
},
{
"name": "header_3",
"source": "/document/markdownDocument/*/sections/h3"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
}
}
De indexeerfunctie configureren en uitvoeren
Zodra u een gegevensbron, index en vaardighedenset hebt gemaakt, kunt u de indexeerfunctie maken en uitvoeren. Met deze stap wordt de pijplijn in uitvoering gebracht.
Wanneer u de vaardigheid Documentindeling gebruikt, moet u de volgende parameters instellen voor de definitie van de indexeerfunctie:
- De
allowSkillsetToReadFileDataparameter moet worden ingesteld optrue. - de
parsingModeparameter moet worden ingesteld opdefault.
In dit scenario hoeft outputFieldMappings niet te worden ingesteld omdat indexProjections de koppelingen tussen bronveld en zoekveld beheert. Indexprojecties behandelen veldassociaties voor de vaardigheid Documentlayout en ook regelmatige segmentering met de splitsvaardigheid voor geïmporteerde en gevectoriseerde gegevensworkloads. Uitvoerveldtoewijzingen zijn nog steeds nodig voor transformaties of complexe gegevenstoewijzingen met functies die in andere gevallen van toepassing zijn. Voor n-segmenten per document verwerken indexprojecties deze functionaliteit echter standaard.
Hier volgt een voorbeeld van een aanvraag voor het maken van een indexeerfunctie.
POST {endpoint}/indexers?api-version=2025-09-01
{
"name": "my_indexer",
"dataSourceName": "my_blob_datasource",
"targetIndexName": "my_consolidated_index",
"skillsetName": "my_skillset",
"parameters": {
"batchSize": 1,
"configuration": {
"dataToExtract": "contentAndMetadata",
"parsingMode": "default",
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_path",
"targetFieldName": "title"
}
],
"outputFieldMappings": []
}
Wanneer u de aanvraag naar de zoekservice verzendt, wordt de indexeerfunctie uitgevoerd.
Resultaten controleren
Nadat de verwerking is voltooid, kunt u een query uitvoeren op uw zoekindex om uw oplossing te testen.
Als u de resultaten wilt controleren, voert u een query uit op de index. Gebruik Search Explorer als zoekclient of een hulpprogramma waarmee HTTP-aanvragen worden verzonden. Met de volgende query worden velden geselecteerd die de uitvoer bevatten van de niet-vectorinhoud van een markdown-sectie en de bijbehorende vector.
Voor Search Explorer kunt u alleen de JSON kopiëren en in de JSON-weergave plakken om query's uit te voeren.
POST /indexes/[index name]/docs/search?api-version=[api-version]
{
"search": "copay for in-network providers",
"count": true,
"searchMode": "all",
"vectorQueries": [
{
"kind": "text",
"text": "*",
"fields": "text_vector,image_vector"
}
],
"queryType": "semantic",
"semanticConfiguration": "healthplan-doc-layout-test-semantic-configuration",
"captions": "extractive",
"answers": "extractive|count-3",
"queryLanguage": "en-us",
"select": "header_1, header_2, header_3"
}
Als u de PDF-bestanden van het statusplan hebt gebruikt om deze vaardigheid te testen, moeten de resultaten van Search Explorer voor de voorbeeldquery er ongeveer uitzien als in de volgende schermopname.
De query is een hybride query voor tekst en vectoren, dus u ziet een
@search.rerankerScoreen resultaten worden gerangschikt op die score.searchMode=allbetekent dat alle querytermen moeten worden overwogen voor een overeenkomst (de standaardwaarde is alle).De query maakt gebruik van semantische classificatie, dus u ziet
captions(deze heeftanswersook , maar die worden niet weergegeven in de schermopname). De resultaten zijn het meest semantisch relevant voor de queryinvoer, zoals wordt bepaald door de semantische ranker.De
selectverklaring (niet weergegeven in de screenshot) specificeert de koptekstvelden die de vaardigheid Documentindeling detecteert en invult. U kunt meer velden toevoegen aan de selectiecomponent om de inhoud van segmenten, titels of andere leesbare velden te controleren.