Segmentera och vektorisera efter dokumentlayout eller struktur
Kommentar
Den här funktionen är för närvarande i allmänt tillgänglig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.
Strategier för segmentering av textdata spelar en viktig roll för att optimera RAG-svar och prestanda. Genom att använda den nya dokumentlayoutfärdigheten som för närvarande är i förhandsversion kan du segmentera innehåll baserat på dokumentstruktur, samla in rubriker och segmentera innehållstexten baserat på semantisk sammanhållning, till exempel stycken och meningar. Segment bearbetas oberoende av varandra. Eftersom LLM:er fungerar med flera segment, när dessa segment är av högre kvalitet och semantiskt sammanhängande, förbättras frågans övergripande relevans.
Färdigheten Dokumentlayout anropar layoutmodellen i Dokumentinformation. Modellen artikulerar innehållsstrukturen i JSON med markdown-syntax (rubriker och innehåll), med fält för rubriker och innehåll som lagras i ett sökindex i Azure AI Search. Det sökbara innehållet som skapas från skickligheten Dokumentlayout är oformaterad text, men du kan använda integrerad vektorisering för att generera inbäddningar för alla fält i källdokumenten, inklusive bilder.
I den här artikeln lär du dig att:
- Använd kunskaper i dokumentlayout för att identifiera dokumentstrukturen
- Använd färdigheten Textdelning för att begränsa segmentstorleken till varje markdown-avsnitt
- Generera inbäddningar för varje segment
- Använda indexprojektioner för att mappa inbäddningar till fält i ett sökindex
I illustrationssyfte använder den här artikeln exempel på hälsoplans-PDF:er som laddats upp till Azure Blob Storage och sedan indexerats med hjälp av guiden Importera och vektorisera data.
Förutsättningar
En indexerarbaserad indexeringspipeline med ett index som accepterar utdata. Indexet måste ha fält för att ta emot rubriker och innehåll.
En datakälla som stöds med textinnehåll som du vill segment.
En kompetensuppsättning med kunskaper i dokumentlayout som delar upp dokument baserat på styckegränser.
En Azure OpenAI-inbäddningsfärdighet som genererar vektorinbäddningar.
En indexprognos för en-till-många-indexering.
Förbereda datafiler
Rådataindata måste finnas i en datakälla som stöds och filen måste vara ett format som dokumentlayoutfärdighet stöder.
Filformat som stöds är: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.
Indexerare som stöds kan vara vilken indexerare som helst som kan hantera filformat som stöds. Dessa indexerare inkluderar Blob-indexerare, OneLake-indexerare, Filindexerare.
Regioner som stöds för den här funktionen är: USA, östra, USA, västra 2, Europa, västra, USA, norra centrala. Se till att kontrollera den här listan för uppdateringar om regional tillgänglighet.
Du kan använda Azure Portal, REST API:er eller ett Azure SDK-paket för att skapa en datakälla.
Dricks
Ladda upp PDF-exempelfilerna för hälsoplan till din datakälla som stöds för att testa skickligheten i dokumentlayout och strukturmedveten segmentering i din egen söktjänst. Guiden Importera och vektorisera data är en enkel kodfri metod för att testa den här färdigheten. Se till att välja standardparsningsläget för att använda strukturmedveten segmentering. Annars används Markdown-parsningsläget i stället.
Skapa ett index för en-till-många-indexering
Här är ett exempel på nyttolasten i ett enda sökdokument som är utformat runt segment. När du arbetar med segment behöver du ett segmentfält och ett överordnat fält som identifierar segmentets ursprung. I det här exemplet är överordnade fält text_parent_id. Underordnade fält är vektor- och icke-bevektorsegmenten i markdown-avsnittet.
Färdigheten Dokumentlayout matar ut rubriker och innehåll. I det här exemplet, header_1
genom header_3
lagra dokumentrubriker, som identifierats av färdigheten. Annat innehåll, till exempel stycken, lagras i chunk
. Fältet text_vector
är en vektorrepresentation av segmentfältinnehållet.
Du kan använda guiden Importera och vektorisera data i Azure Portal, REST-API:er eller en Azure SDK för att skapa ett index. Följande index liknar det som guiden skapar som standard. Du kan ha fler fält om du lägger till bildvektorisering.
Om du inte använder guiden måste indexet finnas i söktjänsten innan du skapar kunskapsuppsättningen eller kör indexeraren.
{
"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"
}
]
}
}
Definiera en kompetensuppsättning för strukturmedveten segmentering och vektorisering
Eftersom kunskapen för dokumentlayout är i förhandsversion måste du använda REST API:et Create Skillset 2024-11-01-preview för det här steget. Du kan också använda Azure Portal.
Det här avsnittet visar ett exempel på en kompetensuppsättningsdefinition som projicerar enskilda markdown-avsnitt, segment och deras vektorekvivalenter som fält i sökindexet. Den använder färdigheten Dokumentlayout för att identifiera rubriker och fylla i ett innehållsfält baserat på semantiskt sammanhängande stycken och meningar i källdokumentet. Den använder färdigheten Textdelning för att dela upp Markdown-innehållet i segment. Den använder Azure OpenAI-inbäddningsfärdigheten för att vektorisera segment och andra fält som du vill ha inbäddningar för.
Förutom färdigheter innehåller indexProjections
kompetensuppsättningen och cognitiveServices
:
indexProjections
används för index som innehåller segmenterade dokument. Projektionerna anger hur överordnat-underordnat innehåll mappas till fält i ett sökindex för en-till-många-indexering. Mer information finns i Definiera en indexprojektion.cognitiveServices
bifogar ett Azure AI-konto för flera tjänster i faktureringssyfte (dokumentlayout-färdigheten är tillgänglig via betala per användning-priser).
POST {endpoint}/skillsets?api-version=2024-11-01-preview
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with a 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"
}
}
}
Konfigurera och köra indexeraren
När du har skapat en datakälla, ett index och en kunskapsuppsättning är du redo att skapa och köra indexeraren. Det här steget placerar pipelinen i körning.
När du använder färdigheten Dokumentlayout måste du ange följande parametrar för indexerarens definition:
- Parametern
allowSkillsetToReadFileData
ska vara inställd påtrue
. - parametern
parsingMode
ska vara inställd pådefault
.
outputFieldMappings
behöver inte anges i det här scenariot eftersom indexProjections
hantera källfältet för att söka efter fältassociationer. Indexprojektioner hanterar fältassociationer för kunskaper i dokumentlayout och även regelbunden segmentering med delningsfärdighet för importerade och vektoriserade dataarbetsbelastningar. Utdatafältmappningar är fortfarande nödvändiga för transformeringar eller komplexa datamappningar med funktioner som gäller i andra fall. Men för n-segment per dokument hanterar indexprojektioner den här funktionen internt.
Här är ett exempel på en begäran om att skapa indexerare.
POST {endpoint}/indexers?api-version=2024-11-01-preview
{
"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": []
}
När du skickar begäran till söktjänsten körs indexeraren.
Verifiera resultat
Du kan köra frågor mot ditt sökindex när bearbetningen har slutförts för att testa lösningen.
Kontrollera resultatet genom att köra en fråga mot indexet. Använd Search Explorer som en sökklient eller något verktyg som skickar HTTP-begäranden. Följande fråga väljer fält som innehåller utdata från markdown-avsnittets icke-bevektorinnehåll och dess vektor.
För Sökutforskaren kan du kopiera bara JSON och klistra in den i JSON-vyn för frågekörning.
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"
}
Om du använde pdf-filer för hälsoplan för att testa den här färdigheten bör sökresultaten i Sökutforskaren för exempelfrågan se ut ungefär som resultaten i följande skärmbild.
Frågan är en hybridfråga över text och vektorer, så du ser en
@search.rerankerScore
och resultaten rangordnas efter den poängen.searchMode=all
innebär att alla frågetermer måste beaktas för en matchning (standardvärdet är alla).Frågan använder semantisk rangordning, så du ser
captions
(den haranswers
också , men de visas inte på skärmbilden). Resultaten är de mest semantiskt relevanta för frågeindata, enligt semantisk rankning.-instruktionen
select
(visas inte på skärmbilden) anger de rubrikfält som dokumentlayouten identifierar och fyller i. Du kan lägga till fler fält i select-satsen för att granska innehållet i segment, rubrik eller något annat läsbart fält.