Создание подписей для изображений на другом языке

В этой статье вы узнаете, как создавать подписи с помощью обогащения ИИ и набора навыков. Изображения часто содержат полезные сведения, относящиеся к сценариям поиска. Вы можете векторизировать изображения для представления визуального содержимого в индексе поиска. Кроме того, можно использовать обогащение ИИ и наборы навыков для создания и извлечения текста, доступного для поиска, из изображений.

Навык Chat Completion (предварительная версия) позволяет сгенерировать описание каждого изображения в источнике данных, а индексатор добавляет это описание в индекс поиска. Чтобы просмотреть описания, выполните запрос, содержащий их в ответе.

Prerequisites

Чтобы работать с содержимым изображения в наборе навыков, вам потребуется:

  • Поддерживаемый источник данных. Рекомендуется служба хранилища Azure.
  • Файлы или блобы, содержащие изображения.
  • Чтение доступа к поддерживаемому источнику данных. В этой статье используется аутентификация на основе ключей, но индексаторы также могут подключаться с помощью удостоверения поисковой службы и аутентификации Microsoft Entra ID. Для ролевого контроля доступа назначьте роли в источнике данных, чтобы разрешить чтение данным удостоверением службы. Если вы тестируете на локальном компьютере разработки, убедитесь, что у вас также есть доступ для чтения в поддерживаемом источнике данных.
  • Индексатор поиска, настроенный для действий с изображением.
  • Набор навыков, включающий навык завершения чата.
  • Индекс поиска с полями для получения созданных текстовых выходных данных, а также сопоставления полей выходных данных в индексаторе, устанавливающего связи.

При необходимости можно определить проекции для приема выходных данных, проанализированных с помощью изображения, в хранилище знаний для сценариев интеллектуального анализа данных.

Настройка индексаторов для обработки изображений

После настройки исходных файлов включите нормализацию образа, задав imageAction параметр в конфигурации индексатора. Нормализация изображений помогает сделать изображения более универсальными для последующей обработки. Нормализация изображений включает следующие операции:

  • Большие изображения изменяются до максимальной высоты и ширины, чтобы сделать их универсальными.
  • Для изображений с метаданными, указывающими ориентацию, поворот изображения настраивается для вертикальной загрузки.

Обратите внимание, что при включении imageAction (установке этого параметра на значение, отличное от none) будет взиматься дополнительная плата за извлечение изображений в соответствии с тарифами службы Поиск с использованием ИИ Azure.

  1. Создайте или обновите индексатор , чтобы задать свойства конфигурации:

    {
      "parameters": {
        "configuration": {
          "dataToExtract": "contentAndMetadata",
          "parsingMode": "default",
          "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. Установите dataToExtract в contentAndMetadata (обязательно).

  3. Убедитесь, что parsingMode задано значение по умолчанию (обязательно).

    Этот параметр определяет степень детализации документов поиска, созданных в индексе. Режим по умолчанию создает однозначное соответствие, так что один blob приводит к одному документу поиска. Если документы большие или навыки требуют использования меньших фрагментов текста, можно добавить навык разделения текста, который подразделяет документ на страницы для целей обработки. Но для сценариев поиска требуется один BLOB для каждого документа, если обогащение включает обработку изображений.

  4. Установите imageAction, чтобы включить узел normalized_images в дереве обогащения (требуемо):

    • generateNormalizedImages для создания массива нормализованных изображений в рамках взлома документов.

    • generateNormalizedImagePerPage (применяется только к PDF-файлу) для создания массива нормализованных изображений, где каждая страница в PDF-файле отображается на одном выходном изображении. Для файлов, отличных от PDF, поведение этого параметра похоже на то, как если бы вы установили generateNormalizedImages. Однако параметр generateNormalizedImagePerPage может сделать операцию индексирования менее производительной путем проектирования (особенно для больших документов), так как необходимо создать несколько образов.

  5. При необходимости настройте ширину или высоту созданных нормализованных изображений:

normalizedImageMaxWidth измеряется в пикселях. Значение по умолчанию — 2000. Максимальное значение — 10 000.

normalizedImageMaxHeight измеряется в пикселях. Значение по умолчанию — 2000. Максимальное значение — 10 000.

Сведения о нормализованных изображениях

Если imageAction задано значение, отличное от ни одного, новое normalized_images поле содержит массив изображений. Каждое изображение представляет сложный тип со следующими элементами:

Элемент изображения Description
data Строка нормализованного изображения в формате JPEG в кодировке Base64.
width Ширина нормализованного изображения в пикселях.
height Высота нормализованного изображения в пикселях.
originalWidth Исходная ширина изображения перед нормализацией.
originalHeight Исходная высота изображения перед нормализацией.
rotationFromOriginal Поворот против часовой стрелки (в градусах), выполняемый для создания нормализованного изображения. Значение от 0 до 360 градусов. Этот шаг считывает метаданные из изображения, созданного камерой или сканером. Обычно используется кратное 90 градусам значение.
contentOffset Смещение символов в поле содержимого, откуда было извлечено изображение. Это поле используется только для файлов с внедренными изображениями. Для contentOffset изображений, извлеченных из PDF-документов, всегда находится в конце текста на странице, где она была извлечена в документе. Это означает, что изображения отображаются после всего текста на этой странице независимо от исходного расположения изображения на странице.
pageNumber Если изображение было извлечено или визуализировано из PDF-документа, это поле содержит номер страницы в PDF-файле, из которого оно было извлечено или отрисовано, начиная с 1. Если изображение не из PDF-файла, это поле равно 0.

Пример значения normalized_images:

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

Определение наборов навыков для обработки изображений

Этот раздел дополняет справочные статьи о навыках, предоставляя контекст для работы с входными данными навыка, выходными данными и шаблонами, так как они относятся к обработке изображений.

  • Создайте или обновите набор навыков для добавления навыков.

После создания базового набора навыков и настройки средств Foundry вы можете сосредоточиться на каждом навыке изображения, определении входных данных и контексте источника и сопоставлении выходных данных с полями в индексе или хранилище знаний.

Note

Пример набора навыков, объединяющего обработку изображений с последующей обработкой естественного языка, см. в руководстве Урок REST: использование REST и AI для создания контента с возможностью поиска из Azure blobs. В нём показано, как использовать вывод данных о навыках для распознавания сущностей и извлечения ключевых фраз.

Примеры входных данных для обработки изображений

Как отмечалось, изображения извлекаются во время взлома документов, а затем нормализуются как предварительный шаг. Нормализованные изображения являются входными данными для любого навыка обработки изображений и всегда представлены в обогащенном дереве документов одним из двух способов:

  • /document/normalized_images/* предназначен для документов, которые обрабатываются целиком.
{
  "@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"
    }
  ]
}

Пример использования ответов схемы JSON с текстовыми входными данными

В этом примере показано, как использовать структурированные выходные данные для языковых моделей. Эта возможность в настоящее время поддерживается в основном языковыми моделями OpenAI, хотя это может измениться в будущем.

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

Сопоставление выходных данных с полями поиска

Выходной текст представлен как узлы во внутреннем обогащенном дереве документов, и каждый узел должен быть сопоставлен с полями в индексе поиска или проекциями в хранилище знаний, чтобы сделать содержимое доступным в приложении.

Сначала используйте команду Create or Update — Index, чтобы добавить поля для приема выходных данных навыков.

В следующем примере коллекции полей:

  • content — это содержимое BLOB-объектов.
  • metadata_storage_name содержит имя файла (задано retrievableзначение true).
  • metadata_storage_path — это уникальный путь BLOB и является ключом документа по умолчанию.
  • merged_content выводится из слияния текста (полезно при внедренных изображениях).
  • captioned_image — это результат навыка и должен быть строковым полем для записи всех выходных данных языковой модели в индексе поиска.
"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
  }
]

Затем используйте Update - Indexer для сопоставления выходных данных набора навыков (в узлах дерева обогащения) с полями индекса.

Обогащенные документы являются внутренними. Чтобы внешне связать узлы в обогащенном дереве документов, настройте сопоставление полей для вывода, указывающее, какое индексное поле получает содержимое узла. Ваше приложение получает доступ к обогащённым данным через поле индекса. В следующем примере показан текстовый узел (выходные данные OCR) в обогащенном документе, сопоставленном с текстовым полем в индексе поиска.

"outputFieldMappings": [
  {
    "sourceFieldName": "/document/normalized_images/*/captionedImage",
    "targetFieldName": "captioned_image"
  }
]

Запустите индексатор для вызова извлечения исходного документа, обработки изображений с помощью заголовков языковой модели и индексирования.

Проверка результатов

Выполните запрос к индексу, чтобы проверить результаты обработки изображений. Используйте Search Explorer в качестве клиента поиска или любой инструмент, который отправляет HTTP-запросы. Следующий запрос выбирает поля, содержащие выходные данные обработки изображений.

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