Freigeben über


Tutorial: Verbalisieren von Bildern aus einem strukturierten Dokumentlayout

Azure AI Search kann Sowohl Text als auch Bilder aus PDF-Dokumenten extrahieren und indizieren, die in Azure Blob Storage gespeichert sind. In diesem Lernprogramm erfahren Sie, wie Sie eine multimodale Indizierungspipeline erstellen, die Daten auf der Grundlage der Dokumentstruktur segmentiert und Bildverbalisierung verwendet, um Bilder zu beschreiben. Zugeschnittene Bilder werden in einem Wissensspeicher gespeichert, und visuelle Inhalte werden in natürlicher Sprache beschrieben und zusammen mit Text in einem durchsuchbaren Index aufgenommen. Das Chunking basiert auf dem Layoutmodell der Azure Document Intelligence in Foundry Tools, das die Dokumentstruktur erkennt.

Um Bild-Verbalisierungen zu erhalten, wird jedes extrahierte Bild an die GenAI Prompt Skill (Vorschau) übergeben, die ein Chat-Abschlussmodell aufruft, um eine präzise Textbeschreibung zu generieren. Diese Beschreibungen werden dann zusammen mit dem Originaltext des Dokuments in Vektordarstellungen eingebettet, wobei das Azure OpenAI text-embedding-3-large-Modell verwendet wird. Das Ergebnis ist ein einzelner Index, der durchsuchbare Inhalte aus beiden Modalitäten enthält: Text und verbalisierte Bilder.

In dieser Anleitung verwenden Sie Folgendes:

  • Ein 36-seitiges PDF-Dokument, das umfangreiche visuelle Inhalte wie Diagramme, Infografiken und gescannte Seiten mit herkömmlichem Text kombiniert.

  • Ein Indexer und Skillset zum Erstellen einer Indizierungspipeline, die KI-Anreicherung durch Skills umfasst.

  • Die Dokumentlayoutfähigkeit zum Extrahieren von Text und normalisierten Bildern mit seinen locationMetadata aus verschiedenen Dokumenten, z. B. Seitenzahlen oder Begrenzungsbereichen.

  • Die GenAI Prompt Skill (Vorschau), die ein Chat-Abschlussmodell aufruft, um Beschreibungen visueller Inhalte zu erstellen.

  • Ein Suchindex, der zum Speichern extrahierter Text- und Bildverbalisierungen konfiguriert ist. Einige Inhalte werden für die vektorbasierte Ähnlichkeitssuche vektorisiert.

Prerequisites

  • Microsoft Foundry-Ressource. Diese Ressource bietet Zugriff auf das Azure Document Intelligence-Layoutmodell, das in diesem Lernprogramm verwendet wird. Sie müssen auf ein Foundry-Ressourcen-Fähigkeits-Set zugreifen, um diese Ressource zu nutzen.

  • Azure AI Search. Konfigurieren Sie Ihren Suchdienst für die rollenbasierte Zugriffssteuerung und eine verwaltete Identität. Ihr Dienst muss sich auf der Stufe "Einfach" oder höher befinden. Dieses Lernprogramm wird auf der Stufe "Kostenlos" nicht unterstützt.

  • Azure Storage, verwendet zum Speichern von Beispieldaten und zum Erstellen eines Wissensspeichers.

  • Azure OpenAI mit einer Bereitstellung von

    • Ein in Foundry oder einer anderen Quelle gehostetes Chatabschlussmodell. Das Modell wird verwendet, um Bildinhalte zu verbalisieren. Sie stellen den URI für das gehostete Modell in der GenAI Prompt-Qualifikationsdefinition bereit. Sie können ein beliebiges Chat-Vervollständigungsmodell verwenden.

    • Ein in Foundry bereitgestelltes Texteinbettungsmodell. Das Modell wird verwendet, um Textinhalte aus Quelldokumenten und die Bildbeschreibungen zu vektorisieren, die vom Chatvervollständigungsmodell generiert werden. Bei der integrierten Vektorisierung muss sich das Einbettungsmodell in Foundry befinden und entweder text-embedding-ada-002, text-embedding-3-large oder text-embedding-3-small sein. Wenn Sie ein externes Einbettungsmodell verwenden möchten, verwenden Sie anstelle der Azure OpenAI-Einbettungskompetenz eine benutzerdefinierte Fähigkeit.

  • Visual Studio Code mit einem REST-Client

Limitations

Vorbereiten von Daten

Die folgenden Anweisungen gelten für Azure Storage, die die Beispieldaten bereitstellt und auch den Wissensspeicher hosten. Eine Suchdienstidentität benötigt Lesezugriff auf Azure Storage, um die Beispieldaten abzurufen, und sie benötigt Schreibzugriff, um den Wissensspeicher zu erstellen. Der Suchdienst erstellt den Container für zugeschnittene Bilder während der Skillset-Verarbeitung, wobei der Name verwendet wird, den Sie in einer Umgebungsvariable angeben.

  1. Laden Sie das folgende Beispiel PDF herunter: sustainable-ai-pdf

  2. Erstellen Sie in Azure Storage einen neuen Container namens sustainable-ai-pdf.

  3. Laden Sie die Beispieldatendatei hoch.

  4. Erstellen Sie Rollenzuweisungen, und geben Sie eine verwaltete Identität in einer Verbindungszeichenfolge an:

    1. Weisen Sie die Rolle Storage Blob Data Reader für den Datenabruf durch den Indexer zu. Weisen Sie den Mitwirkenden von Speicher-Blob-Daten und den Mitwirkenden von Speichertabellendaten zu, um den Wissensspeicher zu erstellen und zu laden. Sie können entweder eine vom System zugewiesene verwaltete Identität oder eine vom Benutzer zugewiesene verwaltete Identität für Ihre Rollenzuweisung des Suchdiensts verwenden.

    2. Für Verbindungen, die mit einer vom System zugewiesenen verwalteten Identität hergestellt werden, rufen Sie eine Verbindungszeichenfolge ab, die eine ResourceId ohne Kontoschlüssel oder Kennwort enthält. Die ResourceId muss die Abonnement-ID des Speicherkontos, die Ressourcengruppe des Speicherkontos und den Namen des Speicherkontos enthalten. Die Verbindungszeichenfolge ist eine URL, die in etwa wie folgt aussieht:

      "credentials" : { 
          "connectionString" : "ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.Storage/storageAccounts/MY-DEMO-STORAGE-ACCOUNT/;" 
      }
      
    3. Für Verbindungen, die mit einer vom Benutzer zugewiesenen verwalteten Identität hergestellt werden, rufen Sie eine Verbindungszeichenfolge ab, die eine ResourceId ohne Kontoschlüssel oder Kennwort enthält. Die ResourceId muss die Abonnement-ID des Speicherkontos, die Ressourcengruppe des Speicherkontos und den Namen des Speicherkontos enthalten. Stellen Sie eine Identität mithilfe der im folgenden Beispiel gezeigten Syntax bereit. Legen Sie userAssignedIdentity auf die vom Benutzer zugewiesene verwaltete Identität fest. Die Verbindungszeichenfolge ähnelt dem folgenden Beispiel:

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

Vorbereiten von Modellen

In diesem Lernprogramm wird vorausgesetzt, dass Sie über eine vorhandene Azure OpenAI-Ressource verfügen, über die das Chat-Abschlussmodell für GenAI-Prompts und das Texteinbettungsmodell zur Vektorisierung genutzt werden können. Der Suchdienst stellt während der Verarbeitung des Skillsets und während der Ausführung von Abfragen mithilfe seiner verwalteten Identität eine Verbindung zu den Modellen her. In diesem Abschnitt finden Sie Anleitungen und Links zum Zuweisen von Rollen für autorisierten Zugriff.

Außerdem benötigen Sie eine Rollenzuweisung für den Zugriff auf das Azure Document Intelligence-Layoutmodell über eine Foundry-Ressource.

Zuweisen von Rollen in Gießerei

  1. Melden Sie sich beim Azure-Portal (nicht beim Foundry-Portal) an, und suchen Sie die Foundry-Ressource. Stellen Sie sicher, dass es sich in einer Region befindet, die das Azure Document Intelligence-Layoutmodell bereitstellt.

  2. Wählen Sie Zugriffssteuerung (IAM) aus.

  3. Wählen Sie "Hinzufügen" und dann " Rollenzuweisung hinzufügen" aus.

  4. Suchen Sie nach Cognitive Services User , und wählen Sie ihn aus.

  5. Wählen Sie verwaltete Identität aus, und weisen Sie dann Ihre verwaltete Identität des Suchdiensts zu.

Zuweisen von Rollen in Azure OpenAI

  1. Melden Sie sich beim Azure-Portal (nicht beim Foundry-Portal) an, und suchen Sie die Azure OpenAI-Ressource.

  2. Wählen Sie Zugriffssteuerung (IAM) aus.

  3. Wählen Sie "Hinzufügen" und dann " Rollenzuweisung hinzufügen" aus.

  4. Suchen Sie nach Cognitive Services OpenAI User , und wählen Sie ihn aus.

  5. Wählen Sie verwaltete Identität aus, und weisen Sie dann Ihre verwaltete Identität des Suchdiensts zu.

Weitere Informationen finden Sie unter Rollenbasierte Zugriffssteuerung für Azure OpenAI in Foundry Models.

Einrichten der REST-Datei

Für dieses Lernprogramm erfordert Ihre lokale REST-Clientverbindung mit Azure AI Search einen Endpunkt und einen API-Schlüssel. Diese Werte erhalten Sie im Azure-Portal. Alternative Verbindungsmethoden finden Sie unter Herstellen einer Verbindung mit einem Suchdienst.

Bei authentifizierten Verbindungen, die während der Indexer- und Skillset-Verarbeitung auftreten, verwendet der Suchdienst die zuvor definierten Rollenzuweisungen.

  1. Starten Sie Visual Studio Code und erstellen Sie eine neue Datei.

  2. Geben Sie Werte für Variablen an, die in der Anforderung verwendet werden. Stellen Sie sicher @storageConnection, dass die Verbindungszeichenfolge nicht über ein nachfolgendes Semikolon oder Anführungszeichen verfügt. Geben Sie für @imageProjectionContainereinen Containernamen an, der im BLOB-Speicher eindeutig ist. Azure AI Search erstellt diesen Container für Sie während der Verarbeitung von Fähigkeiten.

    @searchUrl = PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE
    @searchApiKey = PUT-YOUR-ADMIN-API-KEY-HERE
    @storageConnection = PUT-YOUR-STORAGE-CONNECTION-STRING-HERE
    @cognitiveServicesUrl = PUT-YOUR-AZURE-AI-FOUNDRY-ENDPOINT-HERE
    @openAIResourceUri = PUT-YOUR-OPENAI-URI-HERE
    @openAIKey = PUT-YOUR-OPENAI-KEY-HERE
    @chatCompletionResourceUri = PUT-YOUR-CHAT-COMPLETION-URI-HERE
    @chatCompletionKey = PUT-YOUR-CHAT-COMPLETION-KEY-HERE
    @imageProjectionContainer=sustainable-ai-pdf-images
    
  3. Speichern Sie die Datei mit der Dateierweiterung .rest oder .http. Hilfe zum REST-Client finden Sie in der Schnellstartanleitung: Volltextsuche mit REST.

Um den Azure AI Search-Endpunkt und API-Schlüssel abzurufen:

  1. Melden Sie sich beim Azure-Portalan, navigieren Sie zur Seite Übersicht des Suchdiensts, und kopieren Sie die URL. Ein Beispiel für einen Endpunkt ist https://mydemo.search.windows.net.

  2. Kopieren Sie unter Einstellungensschlüssel> einen Administratorschlüssel. Administratorschlüssel werden verwendet, um Objekte hinzuzufügen, zu ändern und zu löschen. Es gibt zwei austauschbare Adminschlüssel. Kopieren Sie einen der beiden Schlüssel.

    Screenshot der URL und API-Schlüssel im Azure-Portal

Erstellen einer Datenquelle

Create Data Source (REST) erstellt eine Datenquellenverbindung, die angibt, welche Daten indiziert werden sollen.

### Create a data source using system-assigned managed identities
POST {{searchUrl}}/datasources?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}

  {
    "name": "doc-intelligence-image-verbalization-ds",
    "description": "A data source to store multi-modality documents",
    "type": "azureblob",
    "subtype": null,
    "credentials":{
      "connectionString":"{{storageConnection}}"
    },
    "container": {
      "name": "sustainable-ai-pdf",
      "query": null
    },
    "dataChangeDetectionPolicy": null,
    "dataDeletionDetectionPolicy": null,
    "encryptionKey": null,
    "identity": null
  }

Senden Sie die Anforderung. Die Antwort sollte in etwa wie folgt aussehen:

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('doc-extraction-multimodal-embedding-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 2025 21:25:24 GMT
Connection: close

{
  "name": "doc-extraction-multimodal-embedding-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
}

Erstellen eines Index

Index erstellen (REST) erstellt einen Suchindex für Ihren Suchdienst. Ein Index gibt alle Parameter und die dazugehörigen Attribute an.

Für geschachtelte JSON müssen die Indexfelder mit den Quellfeldern identisch sein. Derzeit unterstützt Azure AI Search keine Feldzuordnungen zu geschachtelten JSON-Daten, sodass Feldnamen und Datentypen vollständig übereinstimmen müssen. Der folgende Index richtet sich an die JSON-Elemente im rohen Inhalt.

### Create an index
POST {{searchUrl}}/indexes?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}

{
    "name": "doc-intelligence-image-verbalization-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": 3072,
            "searchable": true,
            "retrievable": true,
            "vectorSearchProfile": "hnsw"
        },
        {
            "name": "content_path",
            "type": "Edm.String",
            "searchable": false,
            "retrievable": true
        },
        {
            "name": "offset",
            "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": "azureOpenAI",    
              "azureOpenAIParameters": {
                "resourceUri": "{{openAIResourceUri}}",
                "deploymentId": "text-embedding-3-large",
                "apiKey": "{{openAIKey}}",
                "modelName": "text-embedding-3-large"
              }
            }
        ]
    },
    "semantic": {
        "defaultConfiguration": "semanticconfig",
        "configurations": [
            {
                "name": "semanticconfig",
                "prioritizedFields": {
                    "titleField": {
                        "fieldName": "document_title"
                    },
                    "prioritizedContentFields": [
                    ],
                    "prioritizedKeywordsFields": []
                }
            }
        ]
    }
}

Wichtige Punkte:

  • Text- und Bildeinbettungen werden im content_embedding Feld gespeichert und müssen mit entsprechenden Dimensionen wie 3072 und einem Vektorsuchprofil konfiguriert werden.

  • location_metadata erfasst Metadaten zu Begrenzungspolygonen und Seitenzahlen für jedes Textstück und normalisierte Bild und ermöglicht so eine präzise räumliche Suche oder UI-Überlagerungen.

  • Weitere Informationen zur Vektorsuche finden Sie unter Vektoren in Azure AI Search.

  • Weitere Informationen zur semantischen Rangfolge finden Sie unter Semantikbewertung in Azure AI Search

Erstellen eines Skillsets

Create Skillset (REST) erstellt ein Skillset für Ihren Suchdienst. Ein Skillset definiert die Operationen, die Inhalte vor der Indizierung segmentieren und einbetten. Dieses Skillset verwendet die Dokumentlayoutfähigkeit, um Text und Bilder zu extrahieren und Positionsmetadaten beizubehalten, die für Zitate in RAG-Anwendungen nützlich sind. Es verwendet Azure OpenAI Embedding-Fähigkeit zum Vektorisieren von Textinhalten.

Das Skillset führt auch spezifische Aktionen für Bilder aus. Es verwendet die GenAI Prompt-Fähigkeit, um Bildbeschreibungen zu generieren. Außerdem wird ein Wissensspeicher erstellt, der intakte Bilder speichert, sodass Sie sie in einer Abfrage zurückgeben können.

### Create a skillset
POST {{searchUrl}}/skillsets?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}

{
  "name": "doc-intelligence-image-verbalization-skillset",
  "description": "A sample skillset for multi-modality using image verbalization",
  "skills": [
    {
      "@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
      "name": "document-cracking-skill",
      "description": "Document Layout skill for document cracking",
      "context": "/document",
      "outputMode": "oneToMany",
      "outputFormat": "text",
      "extractionOptions": ["images", "locationMetadata"],
      "chunkingProperties": {     
          "unit": "characters",
          "maximumLength": 2000, 
          "overlapLength": 200
      },
      "inputs": [
        {
          "name": "file_data",
          "source": "/document/file_data"
        }
      ],
      "outputs": [
        { 
          "name": "text_sections", 
          "targetName": "text_sections" 
        }, 
        { 
          "name": "normalized_images", 
          "targetName": "normalized_images" 
        } 
      ]
    },
    {
    "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
    "name": "text-embedding-skill",
    "description": "Azure Open AI Embedding skill for text",
    "context": "/document/text_sections/*",
    "inputs": [
        {
        "name": "text",
        "source": "/document/text_sections/*/content"
        }
    ],
    "outputs": [
        {
        "name": "embedding",
        "targetName": "text_vector"
        }
    ],
    "resourceUri": "{{openAIResourceUri}}",
    "deploymentId": "text-embedding-3-large",
    "apiKey": "{{openAIKey}}",
    "dimensions": 3072,
    "modelName": "text-embedding-3-large"
    },
    {
    "@odata.type": "#Microsoft.Skills.Custom.ChatCompletionSkill",
    "uri": "{{chatCompletionResourceUri}}",
    "timeout": "PT1M",
    "apiKey": "{{chatCompletionKey}}",
    "name": "genAI-prompt-skill",
    "description": "GenAI Prompt skill for image verbalization",
    "context": "/document/normalized_images/*",
    "inputs": [
        {
        "name": "systemMessage",
        "source": "='You are tasked with generating concise, accurate descriptions of images, figures, diagrams, or charts in documents. The goal is to capture the key information and meaning conveyed by the image without including extraneous details like style, colors, visual aesthetics, or size.\n\nInstructions:\nContent Focus: Describe the core content and relationships depicted in the image.\n\nFor diagrams, specify the main elements and how they are connected or interact.\nFor charts, highlight key data points, trends, comparisons, or conclusions.\nFor figures or technical illustrations, identify the components and their significance.\nClarity & Precision: Use concise language to ensure clarity and technical accuracy. Avoid subjective or interpretive statements.\n\nAvoid Visual Descriptors: Exclude details about:\n\nColors, shading, and visual styles.\nImage size, layout, or decorative elements.\nFonts, borders, and stylistic embellishments.\nContext: If relevant, relate the image to the broader content of the technical document or the topic it supports.\n\nExample Descriptions:\nDiagram: \"A flowchart showing the four stages of a machine learning pipeline: data collection, preprocessing, model training, and evaluation, with arrows indicating the sequential flow of tasks.\"\n\nChart: \"A bar chart comparing the performance of four algorithms on three datasets, showing that Algorithm A consistently outperforms the others on Dataset 1.\"\n\nFigure: \"A labeled diagram illustrating the components of a transformer model, including the encoder, decoder, self-attention mechanism, and feedforward layers.\"'"
        },
        {
        "name": "userMessage",
        "source": "='Please describe this image.'"
        },
        {
        "name": "image",
        "source": "/document/normalized_images/*/data"
        }
        ],
        "outputs": [
            {
            "name": "response",
            "targetName": "verbalizedImage"
            }
        ]
    },    
    {
    "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
    "name": "verbalizedImage-embedding-skill",
    "description": "Azure Open AI Embedding skill for verbalized image embedding",
    "context": "/document/normalized_images/*",
    "inputs": [
        {
        "name": "text",
        "source": "/document/normalized_images/*/verbalizedImage",
        "inputs": []
        }
    ],
    "outputs": [
        {
        "name": "embedding",
        "targetName": "verbalizedImage_vector"
        }
    ],
    "resourceUri": "{{openAIResourceUri}}",
    "deploymentId": "text-embedding-3-large",
    "apiKey": "{{openAIKey}}",
    "dimensions": 3072,
    "modelName": "text-embedding-3-large"
    },
    {
      "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
      "name": "#5",
      "context": "/document/normalized_images/*",
      "inputs": [
        {
          "name": "normalized_images",
          "source": "/document/normalized_images/*",
          "inputs": []
        },
        {
          "name": "imagePath",
          "source": "='my_container_name/'+$(/document/normalized_images/*/imagePath)",
          "inputs": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "targetName": "new_normalized_images"
        }
      ]
    }      
  ], 
   "indexProjections": {
      "selectors": [
        {
          "targetIndexName": "doc-intelligence-image-verbalization-index",
          "parentKeyFieldName": "text_document_id",
          "sourceContext": "/document/text_sections/*",
          "mappings": [    
            {
            "name": "content_embedding",
            "source": "/document/text_sections/*/text_vector"
            },                      
            {
              "name": "content_text",
              "source": "/document/text_sections/*/content"
            },
            {
              "name": "location_metadata",
              "source": "/document/text_sections/*/locationMetadata"
            },                
            {
              "name": "document_title",
              "source": "/document/document_title"
            }   
          ]
        },        
        {
          "targetIndexName": "doc-intelligence-image-verbalization-index",
          "parentKeyFieldName": "image_document_id",
          "sourceContext": "/document/normalized_images/*",
          "mappings": [    
            {
            "name": "content_text",
            "source": "/document/normalized_images/*/verbalizedImage"
            },  
            {
            "name": "content_embedding",
            "source": "/document/normalized_images/*/verbalizedImage_vector"
            },                                           
            {
              "name": "content_path",
              "source": "/document/normalized_images/*/new_normalized_images/imagePath"
            },                    
            {
              "name": "document_title",
              "source": "/document/document_title"
            },
            {
              "name": "location_metadata",
              "source": "/document/normalized_images/*/locationMetadata"
            }             
          ]
        }
      ],
      "parameters": {
        "projectionMode": "skipIndexingParentDocuments"
      }
  },  
  "knowledgeStore": {
    "storageConnectionString": "{{storageConnection}}",
    "identity": null,
    "projections": [
      {
        "files": [
          {
            "storageContainer": "{{imageProjectionContainer}}",
            "source": "/document/normalized_images/*"
          }
        ]
      }
    ]
  }
}

Mit diesem Skillset werden Text und Bilder extrahiert, Bilder verbalisiert und die Bildmetadaten für die Projektion in den Index gestaltet.

Wichtige Punkte:

  • Das content_text Feld wird auf zwei Arten aufgefüllt:

    • Aus Dokumenttext extrahiert und mithilfe der Dokumentlayoutfähigkeit unterteilt.

    • Aus Bildinhalten mit Hilfe der Fähigkeit GenAI Prompt, die beschreibende Beschriftungen für jedes normalisierte Bild erzeugt

  • Das content_embedding Feld enthält 3072-dimensionale Einbettungen für Seitentext und verbalisierte Bildbeschreibungen. Diese werden mit dem Modell text-embedding-3-large von Azure OpenAI erzeugt.

  • content_path enthält den relativen Pfad zur Bilddatei innerhalb des vorgesehenen Bildprojektionscontainers. Dieses Feld wird nur für Bilder generiert, die aus Dokumenten extrahiert werden, wenn extractOption auf ["images", "locationMetadata"] oder ["images"] gesetzt ist, und kann aus dem erweiterten Dokument dem Quellfeld /document/normalized_images/*/imagePath zugeordnet werden.

  • Die Azure OpenAI-Einbettungskompetenz ermöglicht das Einbetten von Textdaten. Weitere Informationen finden Sie unter Azure OpenAI Embedding Skills.

Erstellen und Ausführen eines Indexers

"Indexer erstellen" erstellt einen Indexer für Ihren Suchdienst. Ein Indexer stellt eine Verbindung mit der Datenquelle, lädt Daten, führt ein Skillset aus und indiziert die erweiterten Daten.

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

{
  "dataSourceName": "doc-intelligence-image-verbalization-ds",
  "targetIndexName": "doc-intelligence-image-verbalization-index",
  "skillsetName": "doc-intelligence-image-verbalization-skillset",
  "parameters": {
    "maxFailedItems": -1,
    "maxFailedItemsPerBatch": 0,
    "batchSize": 1,
    "configuration": {
      "allowSkillsetToReadFileData": true
    }
  },
  "fieldMappings": [
    {
      "sourceFieldName": "metadata_storage_name",
      "targetFieldName": "document_title"
    }
  ],
  "outputFieldMappings": []
}

Abfragen ausführen

Sie können mit der Suche beginnen, sobald das erste Dokument geladen wurde.

### Query the index
POST {{searchUrl}}/indexes/doc-intelligence-image-verbalization-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}
  
  {
    "search": "*",
    "count": true
  }

Senden Sie die Anforderung. Dies ist eine nicht angegebene Volltext-Suchabfrage, die alle felder zurückgibt, die im Index als abrufbar gekennzeichnet sind, zusammen mit einer Dokumentanzahl. Die Antwort sollte in etwa wie folgt aussehen:

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

In der Antwort werden 100 Dokumente zurückgegeben.

Sie können für Filter auch logische Operatoren (and, or, not) und Vergleichsoperatoren (eq, ne, gt, lt, ge, le) nutzen. Bei Zeichenfolgenvergleichen wird die Groß-/Kleinschreibung beachtet. Weitere Informationen und Beispiele finden Sie unter Beispiele für einfache Suchabfragen.

Note

Der $filter Parameter funktioniert nur für Felder, die während der Indexerstellung gefiltert wurden.

### Query for only images
POST {{searchUrl}}/indexes/doc-intelligence-image-verbalization-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}
  
  {
    "search": "*",
    "count": true,
    "filter": "image_document_id ne null"
  }
### Query for text or images with content related to energy, returning the id, parent document, and text (only populated for text chunks), and the content path where the image is saved in the knowledge store (only populated for images)
POST {{searchUrl}}/indexes/doc-intelligence-image-verbalization-index/docs/search?api-version=2025-11-01-preview   HTTP/1.1
  Content-Type: application/json
  api-key: {{searchApiKey}}
  
  {
    "search": "energy",
    "count": true,
    "select": "content_id, document_title, content_text, content_path"
  }

Zurücksetzen und erneut ausführen

Indexer können zurückgesetzt werden, um den Ausführungsverlauf zu löschen, wodurch eine vollständige Erneute Ausführung möglich ist. Die folgenden POST-Anforderungen werden zurückgesetzt, gefolgt von einer erneuten Ausführung.

### Reset the indexer
POST {{searchUrl}}/indexers/doc-intelligence-image-verbalization-indexer/reset?api-version=2025-11-01-preview   HTTP/1.1
  api-key: {{searchApiKey}}
### Run the indexer
POST {{searchUrl}}/indexers/doc-intelligence-image-verbalization-indexer/run?api-version=2025-11-01-preview   HTTP/1.1
  api-key: {{searchApiKey}}
### Check indexer status 
GET {{searchUrl}}/indexers/doc-intelligence-image-verbalization-indexer/status?api-version=2025-11-01-preview   HTTP/1.1
  api-key: {{searchApiKey}}

Bereinigen von Ressourcen

Wenn Sie in Ihrem eigenen Abonnement arbeiten, ist es ratsam, nach Abschluss eines Projekts die nicht mehr benötigten Ressourcen zu entfernen. Ressourcen, die weiterhin ausgeführt werden, können Sie Geld kosten. Sie können Ressourcen einzeln löschen oder die Ressourcengruppe löschen, um den gesamten Satz von Ressourcen zu löschen.

Sie können das Azure-Portal verwenden, um Indizes, Indexer und Datenquellen zu löschen.

Siehe auch

Nachdem Sie nun mit einer Beispielimplementierung eines multimodalen Indizierungsszenarios vertraut sind, sehen Sie sich Folgendes an: