Partager via


Segmentation et vectorisation prenant en charge la structure dans Recherche Azure AI

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 relatives aux Évaluations 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. À l’aide de la nouvelle compétence Mise en page de document actuellement en préversion, vous pouvez segmenter du contenu en fonction de paragraphes ou de fragments cohérents sémantiquement d’une représentation de phrase. Ces fragments peuvent ensuite être traités indépendamment et recombinés en tant que représentations sémantiques sans aucune perte d’informations, erreur d’interprétation ou absence de pertinence sémantique. La signification inhérente du texte sert de guide au processus de segmentation.

La compétence Disposition du document utilise la syntaxe Markdown (titres et contenu) pour articuler la structure de document dans le document de recherche. Le contenu pouvant faire l’objet d’une recherche provenant de votre document source est du texte brut, mais vous pouvez ajouter une vectorisation intégrée pour générer des incorporations pour n’importe quel champ.

Dans cet article, découvrez comment :

  • Utiliser la compétence Disposition du document pour détecter les sections et le contenu Markdown de sortie
  • 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

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 qui compétence Disposition de document prise en charge.

  • 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. Il s’agit notamment indexeurs d’objets blob, indexeurs OneLake, indexeurs de fichiers.

  • Les régions prises en charge pour cette fonctionnalité sont les suivantes : USA Est, USA Ouest2, Europe Ouest, USA Centre Nord. Veillez à vérifier cette liste des mises à jour sur la disponibilité régionale.

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 le fichier PDF plan d’intégrité PDF des exemples de fichiers dans votre source de données prise en charge pour tester la compétence disposition du document et la segmentation prenant en charge la structure sur votre propre service de recherche. L’Assistant Importer et vectoriser des données est une approche simple 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é à la place.

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

Vous pouvez utiliser le Portail Azure, les API REST ou un Kit de développement logiciel (SDK) Azure pour créer un index.

Un index doit exister sur le service de recherche avant de créer le jeu 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 jeu de compétences pour la segmentation et la vectorisation prenant en charge la structure

Étant donné que la compétence Disposition du document est en préversion, vous devez utiliser Créer un ensemble de compétences 2024-11-01-preview API REST pour cette étape.

Voici un exemple de charge utile de définition de jeu de compétences pour projeter des blocs de sections Markdown individuels et leurs sorties vectorielles en tant que documents dans l’index de recherche à l’aide de la compétence de disposition de document et compétence d’incorporation Azure OpenAI

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

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

Voici un exemple de charge utile

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

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 en tant que 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": "*",
    "select": "metadata_storage_path, markdown_section, vector"
}

Voir aussi