Condividi tramite


Blocchi e vettorizzazione in base al layout o alla struttura del documento

Nota

Questa funzionalità è attualmente in anteprima pubblica. Questa anteprima viene messa a disposizione senza contratto di servizio e non è consigliata per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Le strategie di suddivisione in blocchi dei dati di testo svolgono un ruolo fondamentale nell'ottimizzazione delle risposte e delle prestazioni rag. Usando la nuova competenza Layout documento attualmente in anteprima, è possibile suddividere il contenuto in base alla struttura del documento, acquisire intestazioni e suddividere il corpo del contenuto in base alla coerenza semantica, ad esempio paragrafi e frasi. I blocchi vengono elaborati in modo indipendente. Poiché i moduli APM funzionano con più blocchi, quando tali blocchi sono di qualità superiore e semanticamente coerenti, la pertinenza complessiva della query viene migliorata.

La competenza Layout documento chiama il modello di layout in Document Intelligence. Il modello descrive la struttura del contenuto in JSON usando la sintassi Markdown (intestazioni e contenuto), con campi per intestazioni e contenuto archiviati in un indice di ricerca in Ricerca di intelligenza artificiale di Azure. Il contenuto ricercabile prodotto dalla competenza Layout documento è testo normale, ma è possibile applicare la vettorizzazione integrata per generare incorporamenti per qualsiasi campo nei documenti di origine, incluse le immagini.

In questo articolo viene spiegato come:

  • Usare la competenza Layout documento per riconoscere la struttura del documento
  • Usare la competenza Divisione testo per vincolare le dimensioni dei blocchi a ogni sezione markdown
  • Generare incorporamenti per ogni blocco
  • Usare le proiezioni di indice per eseguire il mapping degli incorporamenti ai campi in un indice di ricerca

A scopo illustrativo, questo articolo usa i PDF del piano di integrità di esempio caricati in Archiviazione BLOB di Azure e quindi indicizzati usando la procedura guidata Importa e vettorizza dati.

Prerequisiti

Preparare i file di dati

Gli input non elaborati devono trovarsi in un'origine dati supportata e il file deve essere un formato supportato dalla competenza Layout documento.

  • I formati di file supportati includono: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.

  • Gli indicizzatori supportati possono essere qualsiasi indicizzatore in grado di gestire i formati di file supportati. Questi indicizzatori includono indicizzatori BLOB, indicizzatori OneLake, indicizzatori file.

  • Le aree supportate per questa funzionalità includono: Stati Uniti orientali, Stati Uniti occidentali2, Europa occidentale, Stati Uniti centro-settentrionali. Assicurarsi di controllare questo elenco per gli aggiornamenti sulla disponibilità a livello di area.

È possibile usare la portale di Azure, le API REST o un pacchetto di Azure SDK per creare un'origine dati.

Suggerimento

Caricare i file di esempio PDF del piano di integrità nell'origine dati supportata per provare la competenza Layout documento e la suddivisione in blocchi con riconoscimento della struttura nel proprio servizio di ricerca. La procedura guidata Importa e vettorizza dati è un approccio semplice senza codice per provare questa competenza. Assicurarsi di selezionare la modalità di analisi predefinita per usare la suddivisione in blocchi con riconoscimento della struttura. In caso contrario, viene usata la modalità di analisi Markdown.

Creare un indice per l'indicizzazione uno-a-molti

Di seguito è riportato un esempio di payload di un singolo documento di ricerca progettato intorno ai blocchi. Ogni volta che si lavora con blocchi, è necessario un campo di blocco e un campo padre che identifica l'origine del blocco. In questo esempio i campi padre sono i text_parent_id. I campi figlio sono i blocchi vettoriali e nonvettori della sezione markdown.

La competenza Layout documento restituisce intestazioni e contenuto. In questo esempio, header_1 tramite header_3 archivia intestazioni di documento, come rilevato dalla competenza. Altri contenuti, ad esempio i paragrafi, vengono archiviati in chunk. Il text_vector campo è una rappresentazione vettoriale del contenuto del campo di blocco.

Per creare un indice, è possibile usare la procedura guidata Importare e vettorizzare i dati nella portale di Azure, nelle API REST o in Azure SDK. L'indice seguente è molto simile a quello creato dalla procedura guidata per impostazione predefinita. Se si aggiunge la vettorizzazione dell'immagine, potrebbero essere presenti altri campi.

Se non si usa la procedura guidata, l'indice deve esistere nel servizio di ricerca prima di creare il set di competenze o eseguire l'indicizzatore.

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

Definire un set di competenze per la suddivisione in blocchi e la vettorializzazione con riconoscimento della struttura

Poiché la competenza Layout documento è in anteprima, è necessario usare l'API REST Create Skillset 2024-11-01-preview per questo passaggio. È anche possibile usare il portale Azure,

Questa sezione illustra un esempio di definizione del set di competenze che proietta singole sezioni markdown, blocchi e i relativi equivalenti vettoriali come campi nell'indice di ricerca. Usa la competenza Layout documento per rilevare le intestazioni e popolare un campo contenuto basato su paragrafi e frasi semanticamente coerenti nel documento di origine. Usa la competenza Divisione testo per suddividere il contenuto Markdown in blocchi. Usa la competenza incorporamento OpenAI di Azure per vettorizzare blocchi e qualsiasi altro campo per cui si vogliono incorporare.

Oltre alle competenze, il set di competenze include indexProjections e cognitiveServices:

  • indexProjections vengono usati per gli indici contenenti documenti in blocchi. Le proiezioni specificano il mapping del contenuto padre-figlio ai campi in un indice di ricerca per l'indicizzazione uno-a-molti. Per altre informazioni, vedere Definire una proiezione di indice.

  • cognitiveServicesallega un account multiservizio di Azure per intelligenza artificiale per la fatturazione (la competenza Layout documento è disponibile tramite prezzi con pagamento in base al consumo).

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

Configurare ed eseguire l'indicizzatore

Dopo aver creato un'origine dati, un indice e un set di competenze, è possibile creare ed eseguire l'indicizzatore. Questo passaggio inserisce la pipeline in esecuzione.

Quando si usa la competenza Layout documento, assicurarsi di impostare i parametri seguenti nella definizione dell'indicizzatore:

  • Il allowSkillsetToReadFileData parametro deve essere impostato su true.
  • Il parsingMode parametro deve essere impostato su default.

outputFieldMappings non è necessario impostare in questo scenario perché indexProjections gestire il campo di origine per le associazioni di campi di ricerca. Le proiezioni di indici gestiscono le associazioni di campi per la competenza Layout documento e anche la suddivisione in blocchi con la competenza di divisione per i carichi di lavoro di dati importati e vettorializzati. I mapping dei campi di output sono ancora necessari per trasformazioni o mapping di dati complessi con funzioni che si applicano in altri casi. Tuttavia, per i blocchi n per documento, le proiezioni di indici gestiscono questa funzionalità in modo nativo.

Ecco un esempio di richiesta di creazione dell'indicizzatore.

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": []
}

Quando si invia la richiesta al servizio di ricerca, l'indicizzatore viene eseguito.

Verificare i risultati

È possibile eseguire query nell'indice di ricerca dopo la conclusione dell'elaborazione per testare la soluzione.

Per controllare i risultati, eseguire una query sull'indice. Usare Esplora ricerche come client di ricerca, o qualsiasi strumento che invii richieste HTTP. La query seguente seleziona i campi che contengono l'output del contenuto della sezione markdown e il relativo vettore.

Per Esplora ricerche è possibile copiare solo il codice JSON e incollarlo nella visualizzazione JSON per l'esecuzione di query.

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

Se sono stati usati i PDF del piano di integrità per testare questa competenza, i risultati di Esplora ricerche per la query di esempio dovrebbero essere simili ai risultati nello screenshot seguente.

  • La query è una query ibrida su testo e vettori, quindi viene visualizzato un @search.rerankerScore e i risultati vengono classificati in base a tale punteggio. searchMode=all significa che tutti i termini di query devono essere considerati per una corrispondenza (il valore predefinito è qualsiasi).

  • La query usa la classificazione semantica, quindi viene visualizzata captions (contiene anche answers, ma non sono visualizzate nello screenshot). I risultati sono i più rilevanti in modo semantico per l'input della query, come determinato dal ranker semantico.

  • L'istruzione select (non visualizzata nello screenshot) specifica i campi di intestazione rilevati e popolati dalla competenza Layout documento. È possibile aggiungere altri campi alla clausola select per esaminare il contenuto di blocchi, titolo o qualsiasi altro campo leggibile.

Screenshot dei risultati delle query ibride che includono i campi di output della competenza del layout della documentazione.

Vedi anche