Bagikan melalui


Tutorial: Memverbalisasi gambar dari tata letak dokumen terstruktur

Azure AI Search dapat mengekstrak dan mengindeks teks dan gambar dari dokumen PDF yang disimpan di Azure Blob Storage. Tutorial ini menunjukkan kepada Anda cara membangun alur pengindeksan multimodal yang memotong data berdasarkan struktur dokumen dan menggunakan verbalisasi gambar untuk menggambarkan gambar. Gambar yang dipotong disimpan di penyimpanan pengetahuan, dan konten visual dijelaskan dalam bahasa alami dan diserap bersama teks dalam indeks yang dapat dicari. Pemotongan didasarkan pada model tata letak Azure Document Intelligence di Foundry Tools yang mengenali struktur dokumen.

Untuk mendapatkan verbalisasi gambar, setiap gambar yang diekstrak diteruskan ke kemampuan GenAI Prompt (pratinjau) yang memanggil model penyelesaian percakapan untuk menghasilkan deskripsi tekstual yang ringkas. Deskripsi ini, bersama dengan teks dokumen asli, kemudian dimasukkan ke dalam representasi vektor menggunakan model teks-embedding-3-large Azure OpenAI. Hasilnya adalah indeks tunggal yang berisi konten yang dapat dicari dari kedua modalitas: teks dan gambar verbal.

Dalam tutorial ini, Anda menggunakan:

  • Dokumen PDF 36 halaman yang menggabungkan konten visual kaya, seperti bagan, infografis, dan halaman yang dipindai, dengan teks tradisional.

  • Pengindeks dan set keterampilan untuk membuat alur pengindeksan yang mencakup pengayaan AI melalui keterampilan.

  • Keterampilan Tata Letak Dokumen untuk mengekstrak teks dan gambar yang dinormalisasi dengannya locationMetadata dari berbagai dokumen, seperti nomor halaman atau wilayah pembatas.

  • Keterampilan GenAI Prompt (pratinjau) yang memanggil model penyelesaian obrolan untuk membuat deskripsi konten visual.

  • Indeks pencarian dikonfigurasi untuk menyimpan teks dan verbalisasi gambar yang diekstrak. Beberapa konten di-vektorisasi untuk pencarian kesamaan berbasis vektor.

Prerequisites

  • Sumber daya Microsoft Foundry. Sumber daya ini menyediakan akses ke model Tata Letak Kecerdasan Dokumen Azure yang digunakan dalam tutorial ini. Anda harus menggunakan sumber daya Foundry untuk mengakses keterampilan yang diperlukan agar dapat menggunakan sumber daya ini.

  • Pencarian Azure AI. Konfigurasikan layanan pencarian Anda untuk kontrol akses berbasis peran dan identitas terkelola. Layanan Anda harus berada di tingkat Dasar atau lebih tinggi. Tutorial ini tidak didukung pada tingkat Gratis.

  • Azure Storage, digunakan untuk menyimpan data sampel dan untuk membuat penyimpanan pengetahuan.

  • Azure OpenAI dengan implementasi

    • Model penyelesaian obrolan yang dihosting di Foundry atau di sumber lainnya. Model ini digunakan untuk menyuarakan konten gambar. Anda memberikan URI ke model yang dihosting dalam definisi skill GenAI Prompt. Anda dapat menggunakan model penyelesaian obrolan apa pun.

    • Model penyematan teks yang diimplementasikan di Foundry. Model ini digunakan untuk mem-vektorisasi penarikan konten teks dari dokumen sumber dan deskripsi gambar yang dihasilkan oleh model penyelesaian obrolan. Untuk vektorisasi terintegrasi, model penyematan harus terletak di Foundry, dan harus berupa text-embedding-ada-002, text-embedding-3-large, atau text-embedding-3-small. Jika Anda ingin menggunakan model penyematan eksternal, gunakan keterampilan kustom alih-alih keterampilan penyematan Azure OpenAI.

  • Visual Studio Code dengan klien REST.

Limitations

Siapkan data

Instruksi berikut berlaku untuk Azure Storage yang menyediakan data sampel dan juga menghosting penyimpanan pengetahuan. Identitas layanan pencarian memerlukan akses baca ke Azure Storage untuk mengambil data sampel, dan perlu akses tulis untuk membuat penyimpanan pengetahuan. Layanan pencarian membuat kontainer untuk gambar yang dipotong selama pemrosesan skillset, menggunakan nama yang Anda berikan dalam variabel lingkungan.

  1. Unduh sampel PDF berikut: sustainable-ai-pdf

  2. Di Azure Storage, buat kontainer baru bernama sustainable-ai-pdf.

  3. Unggah file data sampel.

  4. Buat penetapan peran dan tentukan identitas terkelola dalam string koneksi:

    1. Tetapkan Storage Blob Data Reader untuk pengindeks mengambil data. Tetapkan Kontributor Data Blob Penyimpanan dan Kontributor Data Tabel Penyimpanan untuk membuat dan memuat penyimpanan pengetahuan. Anda dapat menggunakan identitas terkelola yang ditetapkan sistem atau identitas terkelola yang ditetapkan pengguna untuk penetapan peran layanan pencarian Anda.

    2. Untuk koneksi yang dibuat menggunakan identitas terkelola yang ditetapkan sistem, dapatkan string koneksi yang berisi ResourceId, tanpa kunci akun atau kata sandi. ResourceId harus menyertakan ID langganan akun penyimpanan, grup sumber daya akun penyimpanan, dan nama akun penyimpanan. string koneksi mirip dengan contoh berikut:

      "credentials" : { 
          "connectionString" : "ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.Storage/storageAccounts/MY-DEMO-STORAGE-ACCOUNT/;" 
      }
      
    3. Untuk koneksi yang dibuat menggunakan identitas terkelola yang ditetapkan pengguna, dapatkan string koneksi yang berisi ResourceId, tanpa kunci akun atau kata sandi. ResourceId harus menyertakan ID langganan akun penyimpanan, grup sumber daya akun penyimpanan, dan nama akun penyimpanan. Berikan identitas menggunakan sintaks yang diperlihatkan dalam contoh berikut. Atur userAssignedIdentity ke identitas terkelola yang ditetapkan pengguna String koneksi mirip dengan contoh berikut:

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

Menyiapkan model

Tutorial ini mengasumsikan Anda memiliki sumber daya Azure OpenAI yang sudah ada, yang mencakup keterampilan model penyelesaian percakapan untuk GenAI Prompt, serta model penyematan teks untuk tujuan vektorisasi. Layanan pencarian terhubung ke model yang relevan selama pemrosesan kumpulan keterampilan dan selama eksekusi kueri menggunakan identitas terkelola. Bagian ini memberi Anda panduan dan tautan untuk menetapkan peran untuk akses resmi.

Anda juga memerlukan penetapan peran untuk mengakses model tata letak Kecerdasan Dokumen Azure melalui sumber daya Foundry.

Menetapkan peran di Foundry

  1. Masuk ke portal Microsoft Azure (bukan portal Foundry) dan temukan sumber daya Foundry. Pastikan berada di wilayah yang menyediakan model tata letak Kecerdasan Dokumen Azure.

  2. Pilih Kontrol akses (IAM).

  3. Pilih Tambahkan lalu Tambahkan penetapan peran.

  4. Cari Pengguna Cognitive Services lalu pilih.

  5. Pilih Identitas terkelola lalu tetapkan identitas terkelola layanan pencarian Anda.

Menetapkan peran di Azure OpenAI

  1. Masuk ke portal Microsoft Azure (bukan portal Foundry) dan temukan sumber daya Azure OpenAI.

  2. Pilih Kontrol akses (IAM).

  3. Pilih Tambahkan lalu Tambahkan penetapan peran.

  4. Cari Pengguna Layanan Kognitif OpenAI dan kemudian pilih.

  5. Pilih Identitas terkelola lalu tetapkan identitas terkelola layanan pencarian Anda.

Untuk informasi selengkapnya, lihat Kontrol akses berbasis peran untuk Azure OpenAI di Model Foundry.

Menyiapkan file REST Anda

Untuk tutorial ini, koneksi klien REST lokal Anda ke Azure AI Search memerlukan titik akhir dan kunci API. Anda bisa mendapatkan nilai-nilai ini dari portal Azure. Untuk metode koneksi alternatif, lihat Menyambungkan ke layanan pencarian.

Untuk koneksi terautentikasi yang terjadi selama pengindeksan dan pemrosesan fungsi keahlian, layanan pencarian menggunakan penetapan peran yang telah Anda tentukan sebelumnya.

  1. Mulai Visual Studio Code dan buat file baru.

  2. Berikan nilai untuk variabel yang digunakan dalam permintaan. Untuk @storageConnection, pastikan string koneksi Anda tidak memiliki tanda titik koma atau tanda kutip di akhir. Untuk @imageProjectionContainer, berikan nama kontainer yang unik dalam penyimpanan blob. Azure AI Search membuat kontainer ini untuk Anda selama proses pemrosesan kemampuan.

    @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. Simpan file menggunakan .rest ekstensi file atau .http . Untuk bantuan dengan klien REST, lihat Mulai Cepat: Pencarian teks lengkap menggunakan REST.

Untuk mendapatkan titik akhir Azure AI Search dan kunci API:

  1. Masuk ke portal Azure, navigasikan ke halaman Gambaran Umum layanan pencarian, dan salin URL. Contoh titik akhir mungkin terlihat sepertihttps://mydemo.search.windows.net.

  2. Di bawah Kunci Pengaturan>, salin kunci admin. Kunci admin digunakan untuk menambahkan, memodifikasi, dan menghapus objek. Ada dua kunci admin yang dapat dipertukarkan. Salin salah satu.

    Cuplikan layar kunci URL dan API di portal Azure.

Membuat sumber data

Buat Sumber Data (REST) membuat koneksi sumber data yang menentukan data apa yang akan diindeks.

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

Kirim permintaan. Respons akan terlihat seperti ini:

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
}

Buat indeks

Buat Indeks (REST) membuat indeks pencarian di layanan pencarian Anda. Indeks menentukan semua parameter dan atributnya.

Untuk JSON berlapis, bidang indeks harus identik dengan bidang sumber. Saat ini, Azure AI Search tidak mendukung pemetaan bidang ke JSON berlapis, sehingga nama bidang dan jenis data harus sama sekali. Indeks berikut selaras dengan elemen JSON dalam konten mentah.

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

Poin utama:

  • Penyematan teks dan gambar disimpan di bidang content_embedding dan harus dikonfigurasi dengan dimensi yang sesuai, seperti 3072, serta profil pencarian vektor.

  • location_metadata menangkap metadata batas poligon dan nomor halaman untuk setiap potongan teks dan gambar yang telah dinormalisasi, memungkinkan pencarian spasial atau overlay antarmuka pengguna (UI) yang tepat.

  • Untuk informasi selengkapnya tentang pencarian vektor, lihat Vektor di Pencarian Azure AI.

  • Untuk informasi selengkapnya tentang peringkat semantik, lihat Peringkat semantik di Azure AI Search

Mengembangkan rangkaian keterampilan

Buat Skillset (REST) membuat set keterampilan di layanan pencarian Anda. Kumpulan keterampilan mendefinisikan operasi yang mengelompokkan dan menyematkan konten sebelum pengindeksan. Set keterampilan ini menggunakan keterampilan Tata Letak Dokumen untuk mengekstrak teks dan gambar, mempertahankan metadata lokasi yang berguna untuk kutipan dalam aplikasi RAG. Ini menggunakan keterampilan Azure OpenAI Embedding untuk mem-vektorisasi konten teks.

Keterampilan juga melakukan tindakan khusus untuk gambar. Ini menggunakan keterampilan GenAI Prompt untuk menghasilkan deskripsi gambar. Ini juga membuat penyimpanan pengetahuan yang menyimpan citra utuh sehingga Anda dapat mengaksesnya kembali saat melakukan kueri.

### 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/*"
          }
        ]
      }
    ]
  }
}

Skillset ini mengekstrak teks dan gambar, mendeskripsikan gambar, dan membentuk metadata gambar untuk proyeksi ke dalam indeks.

Poin utama:

  • Bidang content_text diisi dengan dua cara:

    • Dari teks dokumen yang diekstrak dan dipotong menggunakan keterampilan Tata Letak Dokumen.

    • Dari konten gambar menggunakan keterampilan GenAI Prompt, yang menghasilkan keterangan deskriptif untuk setiap gambar yang dinormalisasi

  • Bidang content_embedding berisi penyematan berdimensi 3072 untuk teks halaman dan deskripsi gambar yang dinyatakan secara verbal. Ini dihasilkan dengan menggunakan model penyematan teks 3 besar dari Azure OpenAI.

  • content_path berisi jalur relatif ke file gambar dalam kontainer proyeksi gambar yang ditunjuk. Bidang ini dihasilkan hanya untuk gambar yang diekstrak dari dokumen ketika extractOption diatur ke ["images", "locationMetadata"] atau ["images"], dan dapat dipetakan dari bidang sumber /document/normalized_images/*/imagePath pada dokumen yang diperkaya.

  • Fitur penyematan Azure OpenAI memungkinkan penyematan data tekstual. Untuk informasi selengkapnya, lihat Keterampilan Penyematan Azure OpenAI.

Membuat dan menjalankan pengindeks

Buat Pengindeks membuat pengindeks di layanan pencarian Anda. Pengindeks tersambung ke sumber data, memuat data, menjalankan rangkaian keterampilan, dan mengindeks data yang diperkaya.

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

Jalankan kueri

Anda dapat mulai mencari segera setelah dokumen pertama dimuat.

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

Kirim permintaan. Ini adalah kueri pencarian teks lengkap yang tidak ditentukan yang mengembalikan semua bidang yang ditandai sebagai dapat diambil dalam indeks, bersama dengan jumlah dokumen. Respons akan terlihat seperti ini:

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

100 dokumen dikembalikan dalam respons.

Untuk filter, Anda juga dapat menggunakan operator Logis (dan, atau, tidak) dan operator perbandingan (eq, ne, gt, lt, ge, le). Perbandingan string bersifat sensitif terhadap huruf besar dan kecil. Untuk informasi dan contoh selengkapnya, lihat Contoh kueri pencarian sederhana.

Note

Parameter $filter hanya berfungsi pada bidang yang ditandai dapat difilter selama pembuatan indeks.

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

Atur ulang dan jalankan ulang

Pengindeks dapat diatur ulang untuk menghapus riwayat eksekusi, yang memungkinkan pengoperasian ulang penuh. Permintaan POST berikut adalah untuk reset, diikuti dengan jalankan ulang.

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

Membersihkan sumber daya

Saat Anda bekerja di langganan milik Anda sendiri, di akhir proyek, sebaiknya hapus sumber daya yang tidak lagi Anda butuhkan. Sumber daya yang dibiarkan tetap aktif dapat merugikan Anda secara finansial. Anda dapat menghapus sumber daya satu per satu atau menghapus grup sumber daya untuk menghapus seluruh kumpulan sumber daya.

Anda dapat menggunakan portal Azure untuk menghapus indeks, pengindeks, dan sumber data.

Lihat juga

Sekarang setelah Anda terbiasa dengan contoh implementasi skenario pengindeksan multimodal, lihat: