Partager via


Tutoriel : Extraire, segmenter et incorporer du contenu modal

Dans ce tutoriel, vous allez créer un pipeline d’indexeur modal qui effectue ces tâches :

  • Extraire et segmenter du texte et des images
  • Vectoriser du texte et des images pour la recherche de similarité
  • Envoyer des images rognées à une base de connaissances pour la récupération par votre application

Ce tutoriel présente plusieurs ensembles de compétences côte à côte pour illustrer différentes façons d’extraire, de segmenter et de vectoriser du contenu modal.

Prerequisites

L’indexation multimodale est implémentée par le biais de fonctions qui appellent des modèles d’IA et des API dans un pipeline d’indexeur. Les prérequis du modèle varient en fonction des compétences choisies pour chaque tâche.

Conseil / Astuce

Pour suivre ce tutoriel sur le niveau gratuit, utilisez un document plus petit avec moins d’images. Ce tutoriel utilise uniquement les modèles Foundry, mais vous pouvez créer des compétences personnalisées pour utiliser d’autres modèles.

Configurer l’accès

Avant de commencer, vérifiez que vous disposez des autorisations nécessaires pour accéder au contenu et aux opérations dans Recherche IA Azure. Ce guide de démarrage rapide utilise l’ID Microsoft Entra pour l’authentification et l’accès en fonction du rôle pour l’autorisation. Vous devez être propriétaire ou administrateur de l’accès utilisateur pour attribuer des rôles. Si les rôles ne sont pas réalisables, utilisez plutôt l’authentification basée sur des clés.

Pour configurer l’accès en fonction du rôle recommandé :

  1. Activez l’accès en fonction du rôle pour votre service de recherche.

  2. Attribuez les rôles suivants à votre compte d’utilisateur.

    • Contributeur du service de recherche

    • Contributeur de données d’index de la Recherche

    • Lecteur de données d’index de la Recherche

Obtenir un point de terminaison

Chaque service Recherche Azure AI a un point de terminaison, qui est une URL unique qui identifie et fournit un accès réseau au service. Dans une section ultérieure, vous spécifiez ce point de terminaison pour vous connecter à votre service de recherche par programmation.

Pour obtenir le point de terminaison :

  1. Connectez-vous au portail Azure et sélectionnez votre service de recherche.

  2. Dans le volet gauche, sélectionnez Vue d’ensemble.

  3. Notez le point de terminaison, qui doit ressembler à https://my-service.search.windows.net.

Préparer des données

Les exemples de données sont un document PDF de 36 pages qui combine du contenu visuel enrichi, tel que des graphiques, des infographies et des pages analysées, avec du texte d’origine. Stockage Azure fournit les exemples de données et héberge la base de connaissances. Un service de recherche a besoin d’identité managée :

  • Accès en lecture à Azure Storage pour récupérer les données d'exemple.

  • Accès en écriture pour créer la base de connaissances. Le service de recherche crée le conteneur pour les images rognées pendant le traitement de l’ensemble de compétences, en utilisant le nom que vous fournissez dans une variable d’environnement.

Suivez ces étapes pour configurer les données d'exemple.

  1. Téléchargez l’exemple de pdf suivant : sustainable-ai-pdf

  2. Connectez-vous au portail Azure.

  3. Dans Stockage Azure, créez un conteneur nommé durable-ai-pdf.

  4. Chargez l’exemple de fichier de données.

  5. Attribuez des rôles à l’identité managée du service de recherche :

    • Lecteur de données Blob de stockage pour la récupération des données

    • Contributeur aux données Blob du stockage et Contributeur aux données de table du stockage pour la création de la base de connaissances.

Tant que les pages de stockage Azure sont ouvertes dans le portail Azure, obtenez une chaîne de connexion pour la variable d'environnement.

  1. Sous Paramètres>Points de terminaison, sélectionnez le point de terminaison pour l'ID de ressource. Il doit ressembler à l’exemple suivant : /subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/rg-mydemo/providers/Microsoft.Storage/storageAccounts/mydemostorage/blobServices/default.

  2. Préfixez ResourceId= à cette chaîne de connexion. Utilisez cette version pour votre variable d’environnement.

    ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/rg-mydemo/providers/Microsoft.Storage/storageAccounts/mydemostorage/blobServices/default

  3. Pour les connexions effectuées à l’aide d’une identité managée affectée par l’utilisateur, utilisez la même chaîne de connexion et fournissez une identity propriété définie sur une identité managée affectée par l’utilisateur prédéfinie.

    "credentials" : { 
        "connectionString" : "ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.Storage/storageAccounts/MY-DEMO-STORAGE-ACCOUNT/;" 
    },
    "identity" : { 
        "@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
        "userAssignedIdentity" : "/subscriptions/00000000-0000-0000-0000-00000000/resourcegroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MY-DEMO-USER-MANAGED-IDENTITY" 
    }
    

Choisir des compétences pour l’indexation multimodale

Les définitions d’index, de source de données et d’indexeur sont principalement les mêmes pour tous les scénarios, mais l’ensemble de compétences peut inclure une combinaison de compétences différente en fonction de la façon dont vous souhaitez extraire, segmenter et vectoriser du texte et des images.

  1. Choisissez des compétences pour l’extraction et la segmentation :

    • Extraction de documents, fractionnement de texte
    • Disposition du document
  2. Choisissez des compétences pour la vectorisation :

    • Invite GenAI, incorporation Azure OpenAI
    • Incorporation multimodale d'Azure AI Vision

La plupart de ces compétences dépendent d’un modèle déployé ou d’une ressource Microsoft Foundry. Le tableau suivant identifie le modèle qui sauvegarde chaque compétence, ainsi que la ressource et les autorisations qui fournissent l’accès au modèle.

Compétence Usage Modèle Resource Permissions
Compétence Extraction de document, compétence Fractionnement de texte Extrayez et segmentez en fonction de la taille fixe.
L’extraction de texte est gratuite.
L’extraction d’images est facturable.
Aucune (intégré) Recherche d’IA Azure Voir Configurer l’accès
Compétence Mise en page du document Extrayez et segmentez en fonction de la disposition du document. Document Intelligence 4.0 Microsoft Foundry Utilisateur Cognitive Services
Compétence Azure AI Vision Vectoriser le texte et le contenu de l’image. Azure AI Vision multimodal 4.0 Microsoft Foundry Utilisateur Cognitive Services
Compétence Invite GenAI Appelez un LLM pour générer des descriptions textuelles du contenu d’image. GPT-5 ou GPT-4 Microsoft Foundry Utilisateur Cognitive Services
Compétence d’incorporation Azure OpenAI Vectoriser du texte et générer des descriptions d’images textuelles. Text-embedding-3 ou text-embedding-ada-002 Microsoft Foundry Utilisateur Cognitive Services

L’utilisation du modèle est facturable, à l’exception de l’extraction de texte et du fractionnement de texte.

Les déploiements de modèles peuvent se trouver dans n’importe quelle région prise en charge si le service de recherche se connecte à un point de terminaison public, via une connexion privée, ou si la connexion de facturation est sans clé. Sinon, si la connexion est basée sur des clés, attachez une ressource Microsoft Foundry à partir de la même région qu’Azure AI Search.

Configurer votre environnement

Pour ce tutoriel, votre connexion de client REST locale à Azure AI Search nécessite un point de terminaison et une clé API. Vous pouvez obtenir ces valeurs dans le portail Azure. Pour d’autres méthodes de connexion, consultez Se connecter à un service de recherche.

Pour les connexions authentifiées qui se produisent pendant le traitement de l’indexeur et de l’ensemble de compétences, le service de recherche utilise les attributions de rôles que vous avez définies précédemment.

  1. Démarrez Visual Studio Code et créez un fichier.

  2. Fournissez des valeurs pour les variables utilisées dans la requête :

     @searchUrl = PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE
     @storageConnection = PUT-YOUR-STORAGE-CONNECTION-STRING-HERE
     @imageProjectionContainer=sustainable-ai-pdf-images
     @token = PUT-YOUR-PERSONAL-IDENTITY-TOKEN HERE
    

    Pour @storageConnection, assurez-vous que votre chaîne de connexion n’a pas de points-virgules ou de guillemets de fin. Consultez Préparer vos données pour la syntaxe de chaîne de connexion.

    Pour @imageProjectionContainer, fournissez un nom de conteneur unique dans le stockage d’objets blob. Azure AI Search crée ce conteneur pendant le traitement des compétences.

    Pour obtenir de l’aide sur l’obtention d’un jeton d’accès, consultez Connexion à Azure AI Search. Si vous ne pouvez pas utiliser de rôles, consultez Se connecter avec des clés.

  3. Ajoutez cette variable si vous utilisez la compétence Disposition du document ou la compétence Azure AI Vision (utilise la version de modèle 2023-04-15) :

    @foundryUrl = PUT-YOUR-MULTISERVICE-AZURE-AI-FOUNDRY-ENDPOINT-HERE
    @azureAiVisionModelVersion = 2023-04-15
    
  4. Ajoutez ces variables si vous utilisez la fonctionnalité de prompt GenAI et la fonctionnalité d'incorporation Azure OpenAI :

     @chatCompletionModelUri = PUT-YOUR-DEPLOYED-MODEL-URI-HERE
     @chatCompletionModelKey = PUT-YOUR-MODEL-KEY-HERE
     @textEmbeddingModelUri = PUT-YOUR-DEPLOYED-MODEL-URI-HERE
     @textEmbeddingModelKey = PUT-YOUR-MODEL-KEY-HERE
    
  5. Enregistrez le fichier en utilisant une extension de fichier .rest ou .http. Pour obtenir de l’aide sur le client REST, consultez Démarrage rapide : Recherche en texte intégral à l’aide de REST.

La même ressource Foundry peut fournir Azure AI Vision, Document Intelligence, un modèle d’achèvement de conversation et un modèle d’incorporation de texte. Vérifiez simplement que la région prend en charge les modèles dont vous avez besoin. Si une région est en capacité, vous devrez peut-être créer une ressource pour déployer les modèles nécessaires.

Configurer un pipeline

Un pipeline d’indexeur se compose de quatre composants : source de données, index, ensemble de compétences et indexeur.

Télécharger des fichiers REST

Le dépôt GitHub azure-search-rest-samples a des fichiers REST qui créent le pipeline et interroge l’index.

Conseil / Astuce

Consultez le référentiel GitHub azure-ai-search-sample pour obtenir un exemple Python.

Créer une source de données

Créer une source de données (REST) permet de créer une connexion à la source de données qui spécifie les données à indexer.

POST {{searchUrl}}/datasources?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}

{
   "name":"demo-multimodal-ds",
   "description":null,
   "type":"azureblob",
   "subtype":null,
   "credentials":{
      "connectionString":"{{storageConnection}}"
   },
   "container":{
      "name":"sustainable-ai-pdf",
      "query":null
   },
   "dataChangeDetectionPolicy":null,
   "dataDeletionDetectionPolicy":null,
   "encryptionKey":null,
   "identity":null
}

Envoyez la demande. La réponse doit ressembler à ce qui suit :

HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Location: https://<YOUR-SEARCH-SERVICE-NAME>.search.windows-int.net:443/datasources('demo-multimodal-ds')?api-version=2025-11-01-preview -Preview
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: 4eb8bcc3-27b5-44af-834e-295ed078e8ed
elapsed-time: 346
Date: Sat, 26 Apr 2026 21:25:24 GMT
Connection: close

{
  "name": "demo-multimodal-ds",
  "description": null,
  "type": "azureblob",
  "subtype": null,
  "indexerPermissionOptions": [],
  "credentials": {
    "connectionString": null
  },
  "container": {
    "name": "sustainable-ai-pdf",
    "query": null
  },
  "dataChangeDetectionPolicy": null,
  "dataDeletionDetectionPolicy": null,
  "encryptionKey": null,
  "identity": null
}

Création d'un index

Créer un index (REST) crée un index sur votre service de recherche. L’index est similaire dans tous les ensembles de compétences, avec les exceptions suivantes :

  • La section définit la façon dont le vectorizers texte de requête est vectorisé au moment de la recherche. Il doit utiliser le même fournisseur d’incorporation et la même famille de modèles que celui utilisé par l’ensemble de compétences (intégration de texte Azure AI Vision ou Azure OpenAI) afin que les vecteurs de requête et les vecteurs indexés soient compatibles.

  • La valeur du champ content_embedding doit correspondre exactement à la taille du vecteur produite par le modèle d’intégration (par exemple, 1024 pour Azure AI Vision multimodale ou 3072 pour text-embedding-3-large). Une incompatibilité peut entraîner des échecs d’indexation ou de requête.

  • Pour les types complexes, les noms de champs imbriqués dans l’index doivent correspondre exactement aux noms de sortie d’enrichissement (y compris la casse). Azure AI Search ne peut pas mapper des sous-champs imbriqués vers des noms différents. Utilisez location_metadata, bounding_polygonset page_number pour les champs qui acceptent des sorties de fractionnement de texte, et locationMetadataboundingPolygonspageNumberpour les champs qui acceptent les sorties de disposition de document.

Voici les définitions d’index pour chaque combinaison de compétences.

Ce modèle utilise :

{
   "name":"demo-multimodal-1-index",
   "fields":[
      {
         "name":"content_id",
         "type":"Edm.String",
         "retrievable":true,
         "key":true,
         "analyzer":"keyword"
      },
      {
         "name":"text_document_id",
         "type":"Edm.String",
         "searchable":false,
         "filterable":true,
         "retrievable":true,
         "stored":true,
         "sortable":false,
         "facetable":false
      },
      {
         "name":"document_title",
         "type":"Edm.String",
         "searchable":true
      },
      {
         "name":"image_document_id",
         "type":"Edm.String",
         "filterable":true,
         "retrievable":true
      },
      {
         "name":"content_text",
         "type":"Edm.String",
         "searchable":true,
         "retrievable":true
      },
      {
         "name":"content_embedding",
         "type":"Collection(Edm.Single)",
         "dimensions":1024,
         "searchable":true,
         "retrievable":true,
         "vectorSearchProfile":"hnsw"
      },
      {
         "name":"content_path",
         "type":"Edm.String",
         "searchable":false,
         "retrievable":true
      },
      {
         "name":"location_metadata",
         "type":"Edm.ComplexType",
         "fields":[
            {
               "name":"page_number",
               "type":"Edm.Int32",
               "searchable":false,
               "retrievable":true
            },
            {
               "name":"bounding_polygons",
               "type":"Edm.String",
               "searchable":false,
               "retrievable":true,
               "filterable":false,
               "sortable":false,
               "facetable":false
            }
         ]
      }
   ],
   "vectorSearch":{
      "profiles":[
         {
            "name":"hnsw",
            "algorithm":"defaulthnsw",
            "vectorizer":"demo-vectorizer"
         }
      ],
      "algorithms":[
         {
            "name":"defaulthnsw",
            "kind":"hnsw",
            "hnswParameters":{
               "m":4,
               "efConstruction":400,
               "metric":"cosine"
            }
         }
      ],
      "vectorizers":[
         {
            "name":"demo-vectorizer",
            "kind":"aiServicesVision",
            "aiServicesVisionParameters":{
               "resourceUri":"{{foundryUrl}}",
               "authIdentity":null,
               "modelVersion":"{{azureAiVisionModelVersion}}"
            }
         }
      ]
   },
   "semantic":{
      "defaultConfiguration":"semanticconfig",
      "configurations":[
         {
            "name":"semanticconfig",
            "prioritizedFields":{
               "titleField":{
                  "fieldName":"document_title"
               },
               "prioritizedContentFields":[
                  
               ],
               "prioritizedKeywordsFields":[
                  
               ]
            }
         }
      ]
   }
}

Points clés :

  • content_embedding est le seul champ vectoriel et stocke les vecteurs pour le contenu du texte et de l’image. Il doit être configuré avec des dimensions appropriées pour le modèle d'incorporation, comme 3072 pour texte-incorporation-3-large et un profil de recherche vectorielle.

  • content_path est le chemin d’accès de chaque image dans la base de connaissances.

  • location_metadata ou locationMetadata capturent les métadonnées du polygone de délimitation et du numéro de page pour chaque image normalisée, ce qui permet une recherche spatiale précise ou des superpositions d'interfaces utilisateur. Les noms de champs varient en fonction de la façon dont les informations sont extraites.

  • Pour l’extraction de contenu basée sur la compétence Fractionnement de texte : les métadonnées d’emplacement sont prises en charge uniquement pour les fichiers PDF. En outre, pour la compétence Fractionnement de texte, vous devez inclure une compétence Shaper pour capturer les métadonnées d’emplacement en mémoire et la représenter dans l’arborescence de documents. La compétence Shaper est également chargée d’ajouter le nom du conteneur du magasin de connaissances au content_path.

Créer un ensemble de compétences pour l’extraction, la segmentation et la vectorisation

Créer un ensemble de compétences (REST) crée un ensemble de compétences sur votre service de recherche. Un ensemble de compétences définit les opérations qui extraient, segmentent et vectorisent le contenu avant l’indexation.

Il existe quatre modèles d’ensemble de compétences. Chacun illustre une stratégie d’extraction et de segmentation, associée à une stratégie de vectorisation. Il existe deux différences clés dans chaque modèle : composition de l’ensemble de compétences et indexProjections. Les projections varient en fonction des sorties de chaque compétence d’incorporation.

Les quatre modèles incluent la compétence Shaper. La sortie de la compétence Modélisateur crée le chemin normalisé des images dans la base de connaissances et les métadonnées d’emplacement (numéro de page et polygones englobants).

Ce modèle utilise :

{
   "name":"demo-multimodal-skillset",
   "description":"A test skillset",
   "skills":[
      {
         "@odata.type":"#Microsoft.Skills.Util.DocumentExtractionSkill",
         "name":"document-extraction-skill",
         "description":"Document extraction skill to extract text and images from documents",
         "parsingMode":"default",
         "dataToExtract":"contentAndMetadata",
         "configuration":{
            "imageAction":"generateNormalizedImages",
            "normalizedImageMaxWidth":2000,
            "normalizedImageMaxHeight":2000
         },
         "context":"/document",
         "inputs":[
            {
               "name":"file_data",
               "source":"/document/file_data"
            }
         ],
         "outputs":[
            {
               "name":"content",
               "targetName":"extracted_content"
            },
            {
               "name":"normalized_images",
               "targetName":"normalized_images"
            }
         ]
      },
      {
         "@odata.type":"#Microsoft.Skills.Text.SplitSkill",
         "name":"split-skill",
         "description":"Split skill to chunk documents",
         "context":"/document",
         "defaultLanguageCode":"en",
         "textSplitMode":"pages",
         "maximumPageLength":2000,
         "pageOverlapLength":200,
         "unit":"characters",
         "inputs":[
            {
               "name":"text",
               "source":"/document/extracted_content",
               "inputs":[
                  
               ]
            }
         ],
         "outputs":[
            {
               "name":"textItems",
               "targetName":"pages"
            }
         ]
      },
      {
         "@odata.type":"#Microsoft.Skills.Vision.VectorizeSkill",
         "name":"text-embedding-skill",
         "description":"Vision Vectorization skill for text",
         "context":"/document/pages/*",
         "modelVersion":"{{azureAiVisionModelVersion}}",
         "inputs":[
            {
               "name":"text",
               "source":"/document/pages/*"
            }
         ],
         "outputs":[
            {
               "name":"vector",
               "targetName":"text_vector"
            }
         ]
      },
      {
         "@odata.type":"#Microsoft.Skills.Vision.VectorizeSkill",
         "name":"image-embedding-skill",
         "description":"Vision Vectorization skill for images",
         "context":"/document/normalized_images/*",
         "modelVersion":"{{azureAiVisionModelVersion}}",
         "inputs":[
            {
               "name":"image",
               "source":"/document/normalized_images/*"
            }
         ],
         "outputs":[
            {
               "name":"vector",
               "targetName":"image_vector"
            }
         ]
      },
      {
         "@odata.type":"#Microsoft.Skills.Util.ShaperSkill",
         "name":"shaper-skill",
         "description":"Shaper skill to reshape the data to fit the index schema",
         "context":"/document/normalized_images/*",
         "inputs":[
            {
               "name":"normalized_images",
               "source":"/document/normalized_images/*",
               "inputs":[
                  
               ]
            },
            {
               "name":"imagePath",
               "source":"='{{imageProjectionContainer}}/'+$(/document/normalized_images/*/imagePath)",
               "inputs":[
                  
               ]
            },
            {
               "name":"dataUri",
               "source":"='data:image/jpeg;base64,'+$(/document/normalized_images/*/data)",
               "inputs":[
                  
               ]
            },
            {
               "name":"location_metadata",
               "sourceContext":"/document/normalized_images/*",
               "inputs":[
                  {
                     "name":"page_number",
                     "source":"/document/normalized_images/*/page_number"
                  },
                  {
                     "name":"bounding_polygons",
                     "source":"/document/normalized_images/*/bounding_polygon"
                  }
               ]
            }
         ],
         "outputs":[
            {
               "name":"output",
               "targetName":"new_normalized_images"
            }
         ]
      }
   ],
   "cognitiveServices":{
      "@odata.type":"#Microsoft.Azure.Search.AIServicesByIdentity",
      "subdomainUrl":"{{foundryUrl}}",
      "identity":null
   },
   "indexProjections":{
      "selectors":[
         {
            "targetIndexName":"demo-multimodal-index",
            "parentKeyFieldName":"text_document_id",
            "sourceContext":"/document/pages/*",
            "mappings":[
               {
                  "name":"content_embedding",
                  "source":"/document/pages/*/text_vector"
               },
               {
                  "name":"content_text",
                  "source":"/document/pages/*"
               },
               {
                  "name":"document_title",
                  "source":"/document/document_title"
               }
            ]
         },
         {
            "targetIndexName":"demo-multimodal-index",
            "parentKeyFieldName":"image_document_id",
            "sourceContext":"/document/normalized_images/*",
            "mappings":[
               {
                  "name":"content_embedding",
                  "source":"/document/normalized_images/*/image_vector"
               },
               {
                  "name":"content_path",
                  "source":"/document/normalized_images/*/new_normalized_images/imagePath"
               },
               {
                  "name":"location_metadata",
                  "source":"/document/normalized_images/*/new_normalized_images/location_metadata"
               },
               {
                  "name":"document_title",
                  "source":"/document/document_title"
               }
            ]
         }
      ],
      "parameters":{
         "projectionMode":"skipIndexingParentDocuments"
      }
   },
   "knowledgeStore":{
      "storageConnectionString":"{{storageConnection}}",
      "identity":null,
      "projections":[
         {
            "files":[
               {
                  "storageContainer":"{{imageProjectionContainer}}",
                  "source":"/document/normalized_images/*"
               }
            ]
         }
      ]
   }
}

Exécuter l’indexeur

Créer un indexeur permet de créer un indexeur sur votre service de recherche. Un indexeur se connecte à la source de données, charge des données, exécute un ensemble de compétences et indexe le contenu enrichi.

### Create and run an indexer
POST {{searchUrl}}/indexers?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}

{
  "name": "demo-multimodal-indexer",
  "dataSourceName": "demo-multimodal-ds",
  "targetIndexName": "demo-multimodal-index",
  "skillsetName": "demo-multimodal-skillset",
  "parameters": {
    "maxFailedItems": -1,
    "maxFailedItemsPerBatch": 0,
    "batchSize": 1,
    "configuration": {
      "allowSkillsetToReadFileData": true
    }
  },
  "fieldMappings": [
    {
      "sourceFieldName": "metadata_storage_name",
      "targetFieldName": "document_title"
    }
  ],
  "outputFieldMappings": []
}

Exécuter des requêtes

Vous pouvez démarrer la recherche dès que le premier document est chargé. Il s’agit d’une requête de recherche en texte intégral non spécifiée qui retourne tous les champs marqués comme récupérables dans l’index, ainsi qu’un nombre de documents.

Conseil / Astuce

Le content_embedding champ contient plus d’un millier de dimensions. Utilisez une select instruction pour exclure ce champ de la réponse en choisissant explicitement tous les autres champs. Ajustez l’instruction select pour qu’elle corresponde aux champs (location_metadata vs locationMetadata) dans votre index. Prenons un exemple : "select": "content_id, text_document_id, document_title, image_document_id, content_text,

### Query the index
POST {{searchUrl}}/indexes/demo-multimodal-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}
  
  {
    "search": "*",
    "count": true
  }

Envoyez la demande. La réponse doit ressembler à ce qui suit :

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: 712ca003-9493-40f8-a15e-cf719734a805
elapsed-time: 198
Date: Wed, 30 Apr 2025 23:20:53 GMT
Connection: close

{
  "@odata.count": 100,
  "@search.nextPageParameters": {
    "search": "*",
    "count": true,
    "skip": 50
  },
  "value": [
  ],
  "@odata.nextLink": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes/demo-multimodal-index/docs/search?api-version=2025-11-01-preview "
}

100 documents sont retournés dans la réponse.

Effectuer une requête pour du contenu visuel uniquement

Utilisez un filtre pour exclure tout le contenu non-image. Le $filter paramètre fonctionne uniquement sur les champs marqués filtrables lors de la création de l’index.

Pour les filtres, vous pouvez également utiliser des opérateurs logiques (et, ou non) et des opérateurs de comparaison (eq, ne, gt, lt, ge, le). Les comparaisons de chaînes sont sensibles à la casse. Pour plus d’informations et d’exemples, consultez Exemples de requêtes de recherche simples.

POST {{searchUrl}}/indexes/demo-multimodal-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}
  
  {
    "search": "*",
    "count": true,
    "filter": "image_document_id ne null"
  }

Les résultats de recherche contenant du contenu image uniquement n’ont pas de contenu texte. Vous pouvez donc exclure des champs de texte.

Le content_embedding champ contient des vecteurs à haute dimension (généralement 1 000 à 3 000 dimensions) pour les descriptions de texte de page et d’image verbale. Excluez ce champ de la requête.

Le content_path champ contient le chemin relatif du fichier image dans le conteneur de projection d’images désigné. Ce champ est généré uniquement pour les images extraites des fichiers PDF lorsque imageAction est défini sur generateNormalizedImages, et peut être mappé depuis le document enrichi à partir du champ source /document/normalized_images/*/imagePath.

Pour le contexte PDF extrait à l’aide de la compétence Fractionnement de texte, la compétence Shaper ajoute le nom du conteneur au chemin d’accès et aux métadonnées d’emplacement.

Recherchez du texte ou des images avec du contenu lié à l’énergie, renvoyant l’ID de contenu, le document parent et le texte (renseignés uniquement pour les blocs de texte) et le chemin d’accès du contenu où l’image est enregistrée dans la base de connaissances (renseignée uniquement pour les images).

Cette requête est une recherche en texte intégral uniquement, mais vous pouvez interroger le champ vectoriel pour la recherche de similarité.

POST {{searchUrl}}/indexes/demo-multimodal-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}
  

  {
    "search": "energy",
    "count": true
  }

Réinitialiser et réexécuter

Les indexeurs peuvent être réinitialisés pour effacer le marqueur de niveau haut, ce qui permet une reconstruction totale. Les requêtes POST suivantes servent à la réinitialisation, suivie d'une nouvelle exécution.

### Reset the indexer
POST {{searchUrl}}/indexers/demo-multimodal-indexer/reset?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}
### Run the indexer
POST {{searchUrl}}/indexers/demo-multimodal-indexer/run?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}
### Check indexer status 
GET {{searchUrl}}/indexers/demo-multimodal-indexer/status?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer {{token}}

Afficher des images dans la base de connaissances

Rappelez-vous que l’ensemble de compétences de ce didacticiel crée une base de connaissances pour le contenu d’image extrait du pdf. Une fois l’indexeur exécuté, le conteneur soutenable-ai-pdf-images doit comporter environ 23 images.

Vous ne pouvez pas retourner ces images dans une requête de recherche. Toutefois, vous pouvez écrire du code d’application qui appelle les API stockage Azure pour récupérer les images si vous en avez besoin pour l’expérience utilisateur. Le content_path champ a le chemin d’accès à chaque image.

Pour afficher les images dans le navigateur de stockage :

  1. Connectez-vous au portail Azure et accédez à votre compte de stockage.

  2. Dans Storage Browser, développez le conteneur durable-ai-pdf-images.

  3. Sélectionnez une image.

  4. Dans le menu d’extrême droite (...), sélectionnez Affichage/Modifier.

Capture d’écran d’une image extraite du document PDF.

Nettoyer les ressources

Lorsque vous travaillez dans votre propre abonnement, il est judicieux de terminer un projet en supprimant les ressources dont vous n’avez plus besoin. Les ressources laissées actives peuvent vous coûter de l'argent.

Dans le portail Azure, sélectionnez Toutes les ressources ou groupes de ressources dans le volet gauche pour rechercher et gérer les ressources. Vous pouvez supprimer des ressources individuellement ou supprimer le groupe de ressources pour supprimer toutes les ressources à la fois.