Partager via


Segmenter et vectoriser selon la mise en page ou la structure du document

Remarque

Cette fonctionnalité est actuellement disponible en préversion publique. Cette préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail de production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’utilisation supplémentaires pour les préversions de Microsoft Azure.

Les stratégies de segmentation de données texte jouent un rôle clé dans l’optimisation des réponses et des performances RAG. En utilisant la nouvelle compétence Mise en page du document actuellement en préversion, vous pouvez segmenter du contenu en fonction de la structure du document, capturer des titres et segmenter le corps du contenu en fonction de la cohérence sémantique, comme les paragraphes et les phrases. Les segments sont traités séparément. Les modules LLM fonctionnent avec plusieurs segments : lorsque ces segments sont de qualité supérieure et cohérents d’un point de vue sémantique, la pertinence globale de la requête est améliorée.

La compétence Disposition du document appelle le modèle de disposition dans Document Intelligence. Le modèle articule la structure de contenu au format JSON grâce à la syntaxe Markdown (titres et contenu), avec des champs pour les titres et le contenu stockés dans un index de recherche sur Recherche Azure AI. Le contenu recherchable produit par la compétence de mise en page de documents est du texte brut, mais vous pouvez appliquer une vectorisation intégrée pour générer des incorporations pour n'importe quel champ de vos documents source, y compris les images.

Dans cet article, découvrez comment :

  • Utiliser la compétence Mise en page du document pour identifier la structure d’un document
  • Utiliser la compétence Fractionner du texte pour limiter la taille de bloc à chaque section Markdown
  • Génération d’incorporations pour chaque bloc
  • Utiliser des projections d’index pour mapper des incorporations à des champs dans un index de recherche

À des fins d'illustration, cet article utilise les fichiers PDF d'exemple du plan de santé mis en ligne sur Azure Blob Storage, puis indexés à l'aide de l'assistant d'importation et de vectorisation des données.

Prérequis

Préparer des fichiers de données

Les entrées brutes doivent se trouver dans une source de données prise en charge et le fichier doit être un format pris en charge par la compétence Disposition du document .

  • Les formats de fichiers pris en charge sont les suivants : PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.

  • Les indexeurs pris en charge peuvent être n’importe quel indexeur capable de gérer les formats de fichiers pris en charge. Ces indexeurs incluent les indexeurs de blob, les indexeurs OneLake et les indexeurs de fichiers.

  • Les régions prises en charge pour l’expérience du portail de cette fonctionnalité sont les suivantes : USA Est, Europe Ouest, USA Centre Nord. Si vous configurez votre ensemble de compétences par programmation, vous pouvez utiliser n’importe quelle région Document Intelligence qui fournit également la fonctionnalité d’enrichissement par IA d’Azure AI Search. Pour plus d’informations, consultez Disponibilité des produits par région.

Vous pouvez utiliser le portail Azure, les API REST ou un package du Kit de développement logiciel (SDK) Azure pour créer une source de données.

Conseil

Chargez les exemples de fichiers de plan d’intégrité PDF dans votre source de données prise en charge pour tester la compétence disposition du document et le regroupement en blocs prenant en charge la structure sur votre propre service de recherche. L’Assistant Importation et vectorisation des données est une approche facile sans code pour essayer cette compétence. Veillez à sélectionner le mode d’analyse par défaut pour utiliser la segmentation prenant en charge la structure. Sinon, le mode d’analyse Markdown est utilisé.

Créer un index pour l’indexation un-à-plusieurs

Voici un exemple de charge utile d’un document de recherche unique conçu autour de blocs. Chaque fois que vous utilisez des segments, vous avez besoin d’un champ de segment et d’un champ parent qui identifie l’origine du segment. Dans cet exemple, les champs parents sont les text_parent_id. Les champs enfants sont les segments vectoriels et non vecteurs de la section markdown.

La compétence Mise en page du document génère des titres et du contenu. Dans cet exemple,header_1 à header_3 stocke les titres du document détectés par la compétence. Les autres contenus (comme les paragraphes) sont stockés dans chunk. Le champ text_vector est une représentation vectorielle du contenu du champ de segment.

Vous pouvez utiliser l’Assistant Importation et vectorisation des données dans le portail Azure, les API REST ou un Kit de développement logiciel (SDK) Azure pour créer un index. L’index suivant est très similaire à celui que l’assistant crée par défaut. Le nombre de champs peut augmenter si vous ajoutez une vectorisation d’image.

Si vous n’utilisez pas l’assistant, un index doit exister sur le service de recherche avant de créer l’ensemble de compétences ou d’exécuter l’indexeur.

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

Définir un ensemble de compétences pour la segmentation et la vectorisation basées sur la structure

Étant donné que la compétence Disposition du document est en préversion, vous devez utiliser l’API REST Create Skillset 2024-11-01-preview pour cette étape. Vous pouvez également utiliser le portail Azure.

Cette section montre comment définir un ensemble de compétences qui projette des sections Markdown individuelles, des segments et leurs équivalents vectoriels sous la forme de champs dans l’index de recherche. Il utilise la compétence Disposition du document pour détecter les titres et remplir un champ de contenu en fonction de paragraphes et de phrases cohérents sémantiquement dans le document source. Elle utilise la compétence Fractionnement de texte pour fractionner le contenu Markdown en blocs. Elle utilise la compétence d'incorporation Azure OpenAI pour vectoriser les segments et tout autre champ pour lequel vous souhaitez des incorporations.

Outre les compétences, l’ensemble de compétences comprend indexProjections et cognitiveServices :

POST {endpoint}/skillsets?api-version=2024-11-01-preview

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

Configurer et exécuter l’indexeur

Une fois que vous avez créé une source de données, un index et un ensemble de compétences, vous êtes prêt à créer et exécuter l’indexeur. Cette étape met le pipeline en exécution.

Lorsque vous utilisez la compétence Disposition du document, veillez à définir les paramètres suivants sur la définition de l’indexeur :

  • Le paramètre allowSkillsetToReadFileData doit être défini sur true.
  • Le paramètre parsingMode doit être défini sur default.

Vous n’avez pas besoin de définir outputFieldMappings dans ce scénario, car indexProjections gère le champ source pour rechercher des associations de champs. Les projections d’index gèrent les associations de champs pour la compétence Mise en page du document, ainsi que la segmentation régulière avec la compétence Fractionnement pour les charges de travail des données importées et vectorisées. Le mappage des champs de sortie reste nécessaire pour les transformations ou les mappages de données complexes avec des fonctions qui s’appliquent aux autres cas. Toutefois, pour n-segments par document, les projections d’index gèrent la fonctionnalité en mode natif.

Voici un exemple de requête de création d’un indexeur.

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

Lorsque vous envoyez la requête au service de recherche, l’indexeur s’exécute.

Vérifier les résultats

Vous pouvez interroger votre index de recherche après la fin du traitement permettant de tester votre solution.

Pour vérifier les résultats, exécutez une requête sur l’index. Utilisez l’Explorateur de recherche comme client de recherche ou tout outil qui envoie des requêtes HTTP. La requête suivante sélectionne les champs qui contiennent la sortie du contenu de section markdown et de son vecteur.

Pour l’Explorateur de recherche, vous pouvez copier uniquement le JSON et le coller dans la vue JSON pour l’exécution de la requête.

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

Si vous avez utilisé les fichiers PDF du plan de santé pour tester cette compétence, les résultats de Search Explorer pour l’exemple de requête doivent être similaires à ceux de la capture d’écran suivante.

  • La requête est une requête hybride sur le texte et les vecteurs. Vous voyez donc une @search.rerankerScore requête et les résultats sont classés par ce score. searchMode=all signifie que tous les termes de requête doivent être pris en compte pour une correspondance (la valeur par défaut est n’importe laquelle).

  • La requête utilise le classement sémantique. Par conséquent, captions s’affiche (elle comporte aussi answers, mais cela n’apparaît pas dans la capture d’écran). Les résultats sont les plus sémantiquement pertinents pour l’entrée de requête, comme déterminé par l’éditeur de classement sémantique.

  • L’instruction select (non affichée dans la capture d’écran) spécifie les champs d’en-tête détectés et renseignés par la compétence Mise en page du document. Vous pouvez ajouter d’autres champs à la clause sélectionnée afin d’inspecter le contenu des segments, le titre ou tout autre champ lisible par l’homme.

Capture d’écran des résultats de requête hybride qui incluent les champs de sortie de la compétence Mise en page du document.

Voir aussi