Compartilhar via


Gerar legendas para imagens em outro idioma

Neste artigo, saiba como gerar legendas usando o enriquecimento de IA e um conjunto de habilidades. As imagens geralmente contêm informações úteis relevantes em cenários de pesquisa. Você pode vetorizar imagens para representar o conteúdo visual no índice de pesquisa. Ou você pode usar o enriquecimento de IA e conjuntos de habilidades para criar e extrair texto pesquisável de imagens.

A habilidade Prompt do GenAI (versão prévia) gera uma descrição de cada imagem em sua fonte de dados e o indexador envia essa descrição para um índice de pesquisa. Para exibir as descrições, você pode executar uma consulta que as inclui na resposta.

Pré-requisitos

Para trabalhar com o conteúdo da imagem em um conjunto de habilidades, você precisará de:

  • Uma fonte de dados com suporte
  • Arquivos ou blobs que contêm imagens
  • Leia o acesso na fonte de dados com suporte. Este artigo usa autenticação baseada em chave, mas os indexadores também podem se conectar usando a identidade do serviço de pesquisa e a autenticação da ID do Microsoft Entra. Quanto ao controle de acesso baseado em função, atribua funções na fonte de dados para permitir o acesso de leitura pela identidade do serviço. Se você estiver testando em um computador de desenvolvimento local, verifique se você também tem acesso de leitura na fonte de dados com suporte.
  • Um indexador de pesquisa, configurado para ações de imagem
  • Um conjunto de habilidades com a nova habilidade da solicitação de genAI personalizada
  • Um índice de pesquisa com campos para receber a saída de texto verbalizada, além de mapeamentos de campo de saída no indexador que estabelecem a associação.

Opcionalmente, você pode definir projeções para aceitar a saída analisada por imagem em um repositório de conhecimento para cenários de mineração de dados.

Configurar indexadores para processamento de imagem

Após a configuração dos arquivos de origem, habilite a normalização da imagem definindo o parâmetro imageAction na configuração do indexador. A normalização de imagem ajuda a tornar as imagens mais uniformes para o processamento posterior. A normalização de imagem inclui as seguintes operações:

  • Imagens grandes são redimensionadas para uma altura e largura máximas para uniformizá-las.
  • Para imagens que têm metadados que especificam orientação, a rotação de imagem é ajustada para carregamento vertical.

Observe que habilitar imageAction (definir esse parâmetro como diferente none) incorrerá em uma cobrança adicional para extração de imagens de acordo com os preços do Azure AI Search.

  1. Crie ou atualize um indexador para definir as propriedades de configuração:

    {
      "parameters":
      {
        "configuration": 
        {
           "dataToExtract": "contentAndMetadata",
           "parsingMode": "default",
           "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. Defina dataToExtract como contentAndMetadata (obrigatório).

  3. Verifique se o parsingMode está definido como padrão (obrigatório).

    Esse parâmetro determina a granularidade dos documentos de pesquisa criados no índice. O modo padrão configura uma correspondência um-para-um para que um blob resulte em um documento de pesquisa. Se os documentos forem grandes ou se as habilidades exigirem partes menores de texto, você poderá adicionar a habilidade de Divisão de Texto que subdivide um documento na paginação para fins de processamento. Mas, para cenários de pesquisa, um blob por documento será necessário se o enriquecimento incluir processamento de imagem.

  4. Defina imageAction para habilitar o nó normalized_images em uma árvore de enriquecimento (obrigatório):

    • generateNormalizedImages para gerar uma matriz de imagens normalizadas como parte da quebra de documento.

    • generateNormalizedImagePerPage (aplica-se somente a PDF) para gerar uma matriz de imagens normalizadas em que cada página no PDF é renderizada em uma imagem de saída. Para arquivos não PDF, o comportamento desse parâmetro é semelhante a se você tivesse definido generateNormalizedImages. No entanto, a configuração generateNormalizedImagePerPage pode tornar a operação de indexação menos eficiente por design (especialmente para documentos grandes), pois várias imagens teriam que ser geradas.

  5. Opcionalmente, ajuste a largura ou a altura das imagens normalizadas geradas:

    • normalizedImageMaxWidth em pixels. O padrão é 2.000. O valor máximo é 10.000.

    • normalizedImageMaxHeight em pixels. O padrão é 2.000. O valor máximo é 10.000.

Obter imagens normalizadas

Quando imageAction é definido como um valor diferente de nenhum, o novo campo normalized_images contém uma matriz de imagens. Cada imagem é um tipo complexo que tem os seguintes membros:

Membro de imagem Descrição
dados Cadeia codificada em Base64 da imagem normalizada no formato JPEG.
largura Largura da imagem normalizada em pixels.
altura Altura da imagem normalizada em pixels.
originalWidth A largura original da imagem antes da normalização.
originalHeight A altura original da imagem antes da normalização.
rotationFromOriginal Rotação no sentido anti-horário em graus para criar a imagem normalizada. Um valor entre 0 graus e 360 graus. Esta etapa lê os metadados da imagem gerada por uma câmera ou scanner. Geralmente, é um múltiplo de 90 graus.
contentOffset O deslocamento de caractere dentro do campo de conteúdo do qual a imagem foi extraída. Este campo só é aplicável a arquivos com imagens incorporadas. O contentOffset para imagens extraídas de documentos PDF está sempre no final do texto na página da qual foi extraído no documento. Isso significa que as imagens aparecem após todo o texto da página, independentemente da localização original da imagem na página.
número da página Caso a imagem tenha sido extraída de um arquivo PDF ou renderizada nele, este campo vai conter o número da página da qual a imagem foi extraída ou na qual a imagem foi renderizada, começando pela página 1. Se a imagem não for de um PDF, esse campo será 0.

Valor de exemplo de normalized_images:

[
  {
    "data": "BASE64 ENCODED STRING OF A JPEG IMAGE",
    "width": 500,
    "height": 300,
    "originalWidth": 5000,  
    "originalHeight": 3000,
    "rotationFromOriginal": 90,
    "contentOffset": 500,
    "pageNumber": 2
  }
]

Definir conjuntos de habilidades para processamento de imagem

Esta seção complementa os artigos de referência de habilidades fornecendo contexto para trabalhar com entradas, saídas e padrões de habilidades, relacionadas ao processamento de imagem.

  • Crie ou atualize um conjunto de habilidades para adicionar habilidades.

Depois que a estrutura básica do conjunto de habilidades for criada e os serviços de IA do Azure estiverem configurados, será possível se concentrar em cada habilidade de imagem individual, definindo entradas e contexto de origem e mapeando saídas para campos em um índice ou repositório de conhecimento.

Observação

Para obter um exemplo de conjunto de habilidades que combine o processamento de imagens com o processamento de linguagem natural downstream, consulte Tutorial REST: Usar REST e IA para gerar conteúdo pesquisável de blobs do Azure. Ele mostra como alimentar a saída de imagens de habilidades em reconhecimento de entidade e extração de frases-chave.

Entradas de exemplo para processamento de imagem

Conforme observado, as imagens são extraídas durante a quebra de documento e, em seguida, normalizadas como uma etapa preliminar. As imagens normalizadas são as entradas para qualquer habilidade de processamento de imagem e são sempre representadas em uma árvore de documentos enriquecida de uma entre duas maneiras:

  • /document/normalized_images/* é para documentos processados inteiros.
    {
      "@odata.type": "#Microsoft.Skills.Custom.ChatCompletionSkill",
      "context": "/document/normalized_images/*",
      "uri": "https://contoso.openai.azure.com/openai/deployments/contoso-gpt-4o/chat/completions?api-version=2025-01-01-preview",
      "timeout": "PT1M",
      "apiKey": "<YOUR-API-KEY here>"
      "inputs": [
        {
          "name": "image",
          "source": "/document/normalized_images/*/data"
        },
        {
          "name": "systemMessage",
          "source": "='You are a useful artificial intelligence assistant that helps people.'"
        },
        {
          "name": "userMessage",
          "source": "='Describe what you see in this image in 20 words or less in Spanish.'"
        }
      ],
      "outputs": [ 
          {
            "name": "response",
            "targetName": "captionedImage"
          } 
        ]
    },

Exemplo usando respostas de esquema json com entradas de texto

Este exemplo ilustra como você pode usar saídas estruturadas para modelos de linguagem. Observe que essa funcionalidade é suportada principalmente por modelos de linguagem OpenAI, embora isso possa mudar no futuro.

    {
      "@odata.type": "#Microsoft.Skills.Custom.ChatCompletionSkill",
      "context": "/document/content",
      "uri": "https://contoso.openai.azure.com/openai/deployments/contoso-gpt-4o/chat/completions?api-version=2025-01-01-preview",
      "timeout": "PT1M",
      "apiKey": "<YOUR-API-KEY here>"
      "inputs": [
        {
          "name": "systemMessage",
          "source": "='You are a useful artificial intelligence assistant that helps people.'"
        },
        {
          "name": "userMessage",
          "source": "='How many languages are there in the world and what are they?'"
        }
      ],
      "response_format": { 
        "type": "json_schema",
        "json_schema": {
            "name": "structured_output",
            "strict": true,
            "schema": {
                "type": "object",
                "properties": {
                    "total": { "type": "number" },
                    "languages": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "required": ["total", "languages"],
                "additionalProperties": false
                }
      },
      "outputs": [ 
          {
            "name": "response",
            "targetName": "responseJsonForLanguages"
          } 
        ]
    },

Mapear saídas para campos de pesquisa

O texto de saída é representado como nós em uma árvore de documento enriquecido interna, e cada nó deve ser mapeado para campos em um índice de pesquisa ou para projeções em um repositório de conhecimento, para que o conteúdo fique disponível no seu aplicativo.

  1. Crie ou atualize um índice de pesquisa para adicionar campos para aceitar as saídas de habilidades.

    No exemplo da coleção de campos a seguir, conteúdo é o conteúdo do blob. Metadata_storage_name contém o nome do arquivo (defina retrievable como verdadeiro). Metadata_storage_path é o caminho exclusivo do blob e é a chave de documento padrão. Merged_content é saída da Mesclagem de Texto (útil quando as imagens são inseridas).

    captionedImage são as saídas de habilidade e devem ser um tipo de cadeia de caracteres para capturar a saída do modelo de linguagem no índice de pesquisa.

      "fields": [
        {
          "name": "content",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_name",
          "type": "Edm.String",
          "filterable": true,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_path",
          "type": "Edm.String",
          "filterable": false,
          "key": true,
          "retrievable": true,
          "searchable": false,
          "sortable": false
        },
        {
          "name": "captioned_image",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        }
      ]
    
  2. Atualize o indexador para mapear a saída do conjunto de habilidades (nós em uma árvore de enriquecimento) para os campos de índice.

    Os documentos enriquecidos são internos. Para externalizar os nós em uma árvore de documento enriquecida, configure um mapeamento de campo de saída que especifique qual campo do índice recebe o conteúdo do nó. Os dados enriquecidos são acessados pelo seu aplicativo por meio de um campo de índice. O exemplo a seguir mostra um nó de texto (saída OCR) em um documento enriquecido mapeado para um campo de texto em um índice de pesquisa.

      "outputFieldMappings": [
        {
          "sourceFieldName": "/document/normalized_images/*/captionedImage",
          "targetFieldName": "captioned_image"
        }
      ]
    
  3. Execute o indexador para invocar a recuperação de documentos de origem, o processamento de imagens através de legendas geradas por modelos de linguagem e a indexação.

Verificar os resultados

Execute uma consulta no índice para verificar os resultados do processamento de imagem. Use o Gerenciador de pesquisa como um cliente de pesquisa ou qualquer ferramenta que envie solicitações HTTP. A consulta a seguir seleciona os campos que contêm a saída do processamento de imagem.

POST /indexes/[index name]/docs/search?api-version=[api-version]
{
    "search": "A cat in a picture",
    "select": "metadata_storage_name, captioned_image"
}