Delen via


Segmenteren en vectoriseren op documentindeling of -structuur

Notitie

Deze functie is momenteel beschikbaar als openbare preview-versie. Deze preview wordt aangeboden zonder service level agreement en wordt niet aanbevolen voor productieworkloads. Misschien worden bepaalde functies niet ondersteund of zijn de mogelijkheden ervan beperkt. Zie Aanvullende gebruiksvoorwaarden voor Microsoft Azure-previews voor meer informatie.

Segmenteringsstrategieën voor tekstgegevens spelen een belangrijke rol bij het optimaliseren van RAG-antwoorden en -prestaties. Met behulp van de nieuwe vaardigheid Documentindeling die momenteel in preview is, kunt u inhoud segmenteren op basis van documentstructuur, koppen vastleggen en de hoofdtekst opdelen op basis van semantische samenhang, zoals alinea's en zinnen. Segmenten 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 in Document Intelligence. 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 en vectoriseren.

Vereisten

Gegevensbestanden voorbereiden

De onbewerkte invoer moet zich in een ondersteunde gegevensbron bevinden en het bestand moet een indeling zijn die door de vaardigheid Documentindeling 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, OneLake-indexeerfuncties, bestandsindexeerfuncties.

  • Ondersteunde regio's voor deze functie zijn: VS - oost, VS - west2, Europa - west, VS - noord-centraal. Zorg ervoor dat u deze lijst controleert op updates over regionale beschikbaarheid.

U kunt de Azure-portal, REST API's of een Azure SDK-pakket gebruiken om een gegevensbron te maken.

Tip

Upload de PDF-voorbeeldbestanden van het statusplan naar uw ondersteunde gegevensbron om de vaardigheid Documentindeling en structuurbewuste segmentering op uw eigen zoekservice uit te proberen. De wizard Gegevens importeren en vectoriseren 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-parseringsmodus 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 segmenten werkt, hebt u een segmentveld en een bovenliggend veld nodig waarmee de oorsprong van het segment wordt geïdentificeerd. In dit voorbeeld zijn bovenliggende velden 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 header_1 header_3 worden documentkoppen opgeslagen, zoals gedetecteerd door de vaardigheid. 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 en vectoriseren 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

Omdat de vaardigheid Documentindeling in preview is, moet u voor deze stap de REST API Vaardighedenset maken 2024-11-01-preview gebruiken. U kunt ook Azure Portal gebruiken.

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 vaardigheid Azure OpenAI Embedding om segmenten en andere velden waarvoor u insluitingen wilt vectoriseren.

Naast vaardigheden omvat de vaardighedenset het volgendeindexProjections:cognitiveServices

  • indexProjections worden gebruikt voor indexen die gesegmenteerde documenten bevatten. De projecties geven aan hoe bovenliggende en onderliggende inhoud wordt toegewezen aan velden in een zoekindex voor een-op-veel-indexering. Zie Een indexprojectie definiëren voor meer informatie.

  • cognitiveServicesvoegt een Azure AI-account voor meerdere services toe voor factureringsdoeleinden (de vaardigheid Documentindeling is beschikbaar via prijzen voor betalen per gebruik).

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

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.

outputFieldMappings hoeft niet in dit scenario te worden ingesteld omdat indexProjections het bronveld wordt verwerkt in zoekveldkoppelingen. Indexprojecties verwerken veldkoppelingen voor de vaardigheid Documentindeling en ook regelmatig segmenteren met de splitsvaardigheid voor geïmporteerde en vectorized 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=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": []
}

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 van de niet-vectorinhoud van markdown-sectie en de bijbehorende vector bevatten.

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 een).

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

  • Met select de instructie (niet weergegeven in de schermopname) worden de koptekstvelden opgegeven die door de vaardigheid Documentindeling worden gedetecteerd en ingevuld. 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