別の言語で画像のキャプションを生成する

メモ

Azure AI 検索は、Azure ポータル、REST API、およびAzure SDKから使用できます。 また、Foundry IQ は、エンタープライズ コンテンツを、Microsoft Foundry ポータルのエージェントの再利用可能なアクセス許可に対応したナレッジ ベースに変換するマネージド ナレッジ レイヤーです。

Important

これらの機能は、他のMicrosoft サービスおよびサード パーティのサービスへの接続をサポートします。 これらのサービスの利用は各サービスの利用規約に従うものとし、データが Azure コンプライアンス境界の外部で処理または保存されたり、Azure コンプライアンス境界内に流入したりする場合があります。

データが組織のコンプライアンスと地理的境界の外部に流れるかどうか、および関連する影響、および適切なアクセス許可、境界、承認がプロビジョニングされるかどうかを管理するのは、お客様の責任です。

特定のユース ケースのコンテキストで構築したアプリケーションを慎重に確認およびテストし、すべての適切な決定とカスタマイズを行う責任があります。 これには、メタプロンプト、コンテンツ フィルター、その他の安全システムなどの独自の責任ある AI 軽減策の実装や、アプリケーションが適切な品質、信頼性、セキュリティ、信頼性の標準を満たしていることを確認する機能が含まれます。 詳細については、「Azure AI 検索透過性に関するメモを参照してください。

この記事では、AI エンリッチメントとスキルセットを使用してキャプションを生成する方法について説明します。 多くの場合、画像には検索シナリオに関連する有用な情報が含まれています。 画像を ベクター化 して、検索インデックス内の視覚的なコンテンツを表すことができます。 または、 AI エンリッチメントとスキルセット を使用して、画像から検索可能な テキスト を作成して抽出することもできます。

GenAI プロンプト スキルは、データ ソース内の各画像の説明を生成でき、インデクサーはその説明を検索インデックスにプッシュします。 説明を表示するには、応答に含まれるクエリを実行します。

前提 条件

スキルセット内の画像コンテンツを操作するには、次のものが必要です。

  • サポートされているデータ ソース。 Azure Storageすることをお勧めします。
  • イメージを含むファイルまたは BLOB。
  • サポートされているデータ ソースへの読み取りアクセス。 この記事ではキーベースの認証を使用しますが、インデクサーは検索サービス ID とMicrosoft Entra ID認証を使用して接続することもできます。 ロールベースのアクセス制御の場合は、データ ソースにロールを割り当てて、サービス ID による読み取りアクセスを許可します。 ローカル開発マシンでテストする場合は、サポートされているデータ ソースに対する読み取りアクセス権も付与されていることを確認します。
  • 画像アクション用に構成された 検索インデクサー。
  • GenAI プロンプト スキルを持つスキルセット。
  • 生成されたテキスト出力を受け取るフィールドと、関連付けを確立するインデクサーの出力フィールド マッピングを含む検索インデックス。

必要に応じて、データ マイニング シナリオ用の ナレッジ ストア に画像分析出力を受け入れるプロジェクションを定義できます。

画像処理用にインデクサーを構成する

ソース ファイルが設定されたら、インデクサー構成で imageAction パラメーターを設定して、イメージの正規化を有効にします。 画像の正規化は、ダウンストリーム処理のためのイメージの均一化に役立ちます。 画像の正規化には、次の操作が含まれます。

  • 大きな画像は、高さと幅が最大になるようにサイズ変更され、均一になります。
  • 方向を指定するメタデータを持つ画像の場合、画像の回転は垂直方向の読み込みに合わせて調整されます。

imageAction (このパラメーターを none 以外に設定) を有効にすると、Azure AI 検索 価格に従って画像抽出に追加料金が発生することに注意してください。

  1. 構成プロパティを設定するインデクサーを作成または更新します。

    {
      "parameters": {
        "configuration": {
          "dataToExtract": "contentAndMetadata",
          "parsingMode": "default",
          "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. dataToExtractを contentAndMetadata (必須) に設定します。

  3. parsingModeが既定値 (必須) に設定されていることを確認します。

    このパラメーターは、インデックスに作成された検索ドキュメントの粒度を決定します。 既定のモードでは、1 つの BLOB で 1 つの検索ドキュメントが作成されるように、1 対 1 の対応が設定されます。 ドキュメントが大きい場合、またはスキルで必要なテキストのチャンクが小さい場合は、処理のためにドキュメントをページングに分割するテキスト分割スキルを追加できます。 ただし、検索シナリオでは、エンリッチメントに画像処理が含まれている場合は、ドキュメントごとに 1 つの BLOB が必要です。

  4. エンリッチメント ツリーでimageAction ノードを有効にするには、normalized_imagesを設定します (必須)。

    • generateNormalizedImages を使用して、ドキュメントクラッキングの一部として正規化された画像の配列を生成します。

    • generateNormalizedImagePerPage PDF 内の各ページが 1 つの出力イメージにレンダリングされる正規化された画像の配列を生成する (PDF にのみ適用されます)。 PDF 以外のファイルの場合、このパラメーターの動作は、 generateNormalizedImages設定した場合と似ています。 ただし、 generateNormalizedImagePerPage 設定すると、複数のイメージを生成する必要があるため、インデックス作成操作のパフォーマンスが低下する可能性があります (特に大きなドキュメントの場合)。

  5. 必要に応じて、生成された正規化された画像の幅または高さを調整します。

normalizedImageMaxWidth はピクセル単位で測定されます。 既定値は 2,000 です。 最大値は 10,000 です。

normalizedImageMaxHeight はピクセル単位で測定されます。 既定値は 2,000 です。 最大値は 10,000 です。

正規化された画像について

imageActionが none 以外の値に設定されている場合、新しいnormalized_images フィールドにはイメージの配列が含まれます。 各イメージは、次のメンバーを持つ複合型です。

画像のメンバー 説明
データ 正規化された画像の BASE64 エンコード文字列 (JPEG 形式)。
幅 正規化された画像の幅 (ピクセル単位)。
高さ 正規化された画像の高さ (ピクセル単位)。
originalWidth 正規化前の画像の元の幅。
originalHeight 正規化前の画像の元の高さ。
rotationFromOriginal 正規化された画像の作成時に発生した、反時計回りの回転角度。 0 ~ 360 度の値。 この手順では、カメラまたはスキャナーによって生成された画像からメタデータを読み取ります。 通常は 90 度の倍数です。
contentOffset (コンテンツオフセット) 画像が抽出された位置の、content フィールド内での文字オフセット。 このフィールドは、画像が埋め込まれたファイルにのみ適用されます。 PDF ドキュメントから抽出された画像の contentOffset は、ドキュメント内で抽出されたページのテキストの末尾に常に表示されます。 つまり、画像は、ページ上の画像の元の場所に関係なく、そのページ上のすべてのテキストの後に表示されます。
ページ番号 画像が PDF から抽出またはレンダリングされた場合、このフィールドには、1 から抽出またはレンダリングされた PDF のページ番号が含まれます。 画像が 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 Tools が構成されたら、個々のイメージ スキルに焦点を当て、入力とソース コンテキストを定義し、出力をインデックスまたはナレッジ ストアのフィールドにマッピングできます。

メモ

画像処理とダウンストリームの自然言語処理を組み合わせたスキルセットの例については、「REST チュートリアル: REST と AI を使用して、Azure BLOB から検索可能なコンテンツを生成するを参照してください。 スキル イメージング出力をエンティティ認識とキー フレーズ抽出にフィードする方法を示します。

画像処理の入力例

前に示したように、ドキュメントの解読中に画像が抽出され、事前の手順として正規化されます。 正規化されたイメージは、すべての画像処理スキルへの入力であり、常にエンリッチメントされたドキュメント ツリーで 2 つの方法のいずれかで表されます。

  • /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",
  "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",
  "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 または Update - Index を使用して、スキルの出力を受け入れるフィールドを追加します。

以下のフィールドコレクションの例:

  • content は BLOB コンテンツです。
  • metadata_storage_name には、ファイルの名前 ( retrievabletrue に設定) が含まれています。
  • 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"
  }
]

インデクサーを実行して、ソース ドキュメントの取得、言語モデルのキャプションによる画像処理、およびインデックス作成を呼び出します。

結果を確認する

インデックスに対してクエリを実行して、画像処理の結果を確認します。 検索エクスプローラーは、検索クライアント、または HTTP 要求を送信する任意のツールとして使用します。 次のクエリでは、画像処理の出力を含むフィールドを選択します。

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