Delen via


Segmenteren en vectoriseren op basis van documentindeling of structuur

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

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

  • indexProjections worden 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.

  • cognitiveServices voegt 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 allowSkillsetToReadFileData parameter moet worden ingesteld op true.
  • de parsingMode parameter moet worden ingesteld op default.

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.rerankerScore en 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 heeft answersook , 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 select verklaring (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.

Schermopname van resultaten van hybride query's met uitvoervelden voor documentindelingen.

Zie ook