GPT-4 Turbo with Vision を使用する

GPT-4 Turbo with Vision は、OpenAI によって開発された大規模マルチモーダル モデル (LMM) であり、画像を分析し、それらに関する質問に対するテキスト応答を提供できます。 自然言語処理とビジュアル解釈の両方が組み込まれています。

GPT-4 Turbo with Vision モデルは、画像に存在するものについての一般的な質問に回答します。

ヒント

GPT-4 Turbo with Vision を使用するには、デプロイした GPT-4 Turbo with Vision モデルで Chat Completion API を呼び出します。 Chat Completion API に慣れていない場合は、GPT-4 Turbo と GPT-4 の攻略ガイドを参照してください。

GPT-4 Turbo モデルのアップグレード

GPT-4 Turbo の最新 GA リリースは次のとおりです。

  • gpt-4 バージョン turbo-2024-04-09

これは、次のプレビュー モデルに代わるものです。

  • gpt-4 バージョン 1106-Preview
  • gpt-4 バージョン 0125-Preview
  • gpt-4 バージョン vision-preview

OpenAI と Azure OpenAI GPT-4 Turbo GA モデルの違い

  • OpenAI の最新の 0409 ターボ モデル バージョンでは、すべての推論要求に対して JSON モードと関数呼び出しがサポートされています。
  • Azure OpenAI の最新の turbo-2024-04-09 バージョンでは、現在、画像 (ビジョン) 入力による推論要求を行う場合、JSON モードと関数呼び出しの使用はサポートされていません。 テキスト ベース入力の要求 (image_url とインライン イメージがない要求) では、JSON モードと関数呼び出しがサポートされています。

gpt-4 vision-preview との違い

  • Azure AI 固有の Vision 拡張機能と GPT-4 Turbo with Vision の統合は、gpt-4 バージョン: turbo-2024-04-09 ではサポートされません。 これには、光学式文字認識 (OCR)、オブジェクト グラウンディング、ビデオ プロンプト、画像を含むデータの処理の改善が含まれます。

GPT-4 Turbo のプロビジョニングされたマネージド可用性

  • gpt-4 バージョン turbo-2024-04-09 は、標準デプロイとプロビジョニングされたデプロイの両方で使用できます。 現在、このモデルのプロビジョニングされたバージョンでは、イメージ/ビジョン推論要求はサポートされていません。 このモデルのプロビジョニングされたデプロイでは、テキスト入力のみ受け入れます。 標準のモデル デプロイでは、テキストと画像/ビジョンの両方の推論要求を受け入れます。

GPT-4 Turbo with Vision GA のデプロイ

Studio UI から GA モデルをデプロイするには、GPT-4 を選択し、ドロップダウン メニューから turbo-2024-04-09 バージョンを選択します。 gpt-4-turbo-2024-04-09 モデルの既定のクォータは、GPT-4-Turbo の現在のクォータと同じになります。 リージョンのクォータ制限を参照してください。

Chat Completion API を呼び出す

次のコマンドは、GPT-4 Turbo with Vision モデルをコードで使用する最も基本的な方法を示しています。 これらのモデルをプログラムで初めて使用する場合は、GPT-4 Turbo with Vision のクイックスタートから始めることをお勧めします。

POST 要求を https://{RESOURCE_NAME}.openai.azure.com/openai/deployments/{DEPLOYMENT_NAME}/chat/completions?api-version=2024-02-15-preview に送信します。このとき

  • RESOURCE_NAME は Azure OpenAI リソースの名前です
  • DEPLOYMENT_NAME は、GPT-4 Turbo with Vision モデル デプロイの名前です

必須のヘッダー:

  • Content-Type: application/json
  • api-key: {API_KEY}

本文: 要求本文のサンプルを次に示します。 形式は GPT-4 の Chat Completions API と同じですが、メッセージの内容がテキストと画像 (画像への有効な HTTP または HTTPS URL、または base-64 でエンコードされた画像) を含む配列でもかまわない点が異なります。

重要

必ず "max_tokens" 値を設定してください。そうしないと、戻り値の出力が途切れます。

重要

画像をアップロードする場合、チャット要求ごとに 10 個の画像という制限があります。

{
    "messages": [ 
        {
            "role": "system", 
            "content": "You are a helpful assistant." 
        },
        {
            "role": "user", 
            "content": [
	            {
	                "type": "text",
	                "text": "Describe this picture:"
	            },
	            {
	                "type": "image_url",
	                "image_url": {
                        "url": "<image URL>"
                    }
                } 
           ] 
        }
    ],
    "max_tokens": 100, 
    "stream": false 
} 

ヒント

ローカル画像を使用する

ローカル画像を使用する場合は、次の Python コードを使用して base64 に変換し、API に渡すことができます。 代替のファイル変換ツールはオンラインで入手できます。

import base64
from mimetypes import guess_type

# Function to encode a local image into data URL 
def local_image_to_data_url(image_path):
    # Guess the MIME type of the image based on the file extension
    mime_type, _ = guess_type(image_path)
    if mime_type is None:
        mime_type = 'application/octet-stream'  # Default MIME type if none is found

    # Read and encode the image file
    with open(image_path, "rb") as image_file:
        base64_encoded_data = base64.b64encode(image_file.read()).decode('utf-8')

    # Construct the data URL
    return f"data:{mime_type};base64,{base64_encoded_data}"

# Example usage
image_path = '<path_to_image>'
data_url = local_image_to_data_url(image_path)
print("Data URL:", data_url)

base64 画像データの準備ができたら、次のように要求本文で API に渡すことができます。

...
"type": "image_url",
"image_url": {
   "url": "data:image/jpeg;base64,<your_image_data>"
}
...

出力

API 応答は次のようになります。

{
    "id": "chatcmpl-8VAVx58veW9RCm5K1ttmxU6Cm4XDX",
    "object": "chat.completion",
    "created": 1702439277,
    "model": "gpt-4",
    "prompt_filter_results": [
        {
            "prompt_index": 0,
            "content_filter_results": {
                "hate": {
                    "filtered": false,
                    "severity": "safe"
                },
                "self_harm": {
                    "filtered": false,
                    "severity": "safe"
                },
                "sexual": {
                    "filtered": false,
                    "severity": "safe"
                },
                "violence": {
                    "filtered": false,
                    "severity": "safe"
                }
            }
        }
    ],
    "choices": [
        {
            "finish_reason":"stop",
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "The picture shows an individual dressed in formal attire, which includes a black tuxedo with a black bow tie. There is an American flag on the left lapel of the individual's jacket. The background is predominantly blue with white text that reads \"THE KENNEDY PROFILE IN COURAGE AWARD\" and there are also visible elements of the flag of the United States placed behind the individual."
            },
            "content_filter_results": {
                "hate": {
                    "filtered": false,
                    "severity": "safe"
                },
                "self_harm": {
                    "filtered": false,
                    "severity": "safe"
                },
                "sexual": {
                    "filtered": false,
                    "severity": "safe"
                },
                "violence": {
                    "filtered": false,
                    "severity": "safe"
                }
            }
        }
    ],
    "usage": {
        "prompt_tokens": 1156,
        "completion_tokens": 80,
        "total_tokens": 1236
    }
}

すべての応答には "finish_reason" フィールドが含まれます。 値は次のいずれかです。

  • stop: API から完全なモデル出力が返されました。
  • length: max_tokens 入力パラメーターまたはモデルのトークン制限により、不完全なモデル出力になりました。
  • content_filter: コンテンツ フィルターからのフラグによりコンテンツが省略されました。

画像処理の詳細パラメーター設定: low、high、auto

モデルの detail パラメータには、モデルが画像を解釈して処理する方法を調整するための 3 つの選択肢 (lowhigh、または auto) が用意されています。 既定の設定は auto です。この場合、モデルは画像入力のサイズに基づいて low か high かを決定します。

  • low 設定: モデルは "高解像度" モードをアクティブにせず、代わりに低解像度の 512x512 バージョンを処理します。その結果、微細さが重要ではないシナリオでは応答が速くなり、トークンの消費量が少なくなります。
  • high 設定: モデルは "高解像度" モードをアクティブにします。 この場合、モデルは最初に低解像度画像を表示し、次に入力画像から詳細な 512x512 セグメントを生成します。 各セグメントは 2 倍のトークン予算を使うため、画像をより詳細に解釈できます。''

使われるトークンと価格に画像パラメーターが与える影響の詳細については、OpenAI の概要に関するページの「画像トークン (GPT-4 Turbo with Vision)」を参照してください

出力

モデルから受信するチャット応答には、オブジェクト ラベルや境界ボックス、OCR 結果など、画像に関するより詳細な情報が含まれるようになりました。 API 応答は次のようになります。

{
    "id": "chatcmpl-8UyuhLfzwTj34zpevT3tWlVIgCpPg",
    "object": "chat.completion",
    "created": 1702394683,
    "model": "gpt-4",
    "choices":
    [
        {
            "finish_reason": {
                "type": "stop",
                "stop": "<|fim_suffix|>"
            },
            "index": 0,
            "message":
            {
                "role": "assistant",
                "content": "The image shows a close-up of an individual with dark hair and what appears to be a short haircut. The person has visible ears and a bit of their neckline. The background is a neutral light color, providing a contrast to the dark hair."
            }
        }
    ],
    "usage":
    {
        "prompt_tokens": 816,
        "completion_tokens": 49,
        "total_tokens": 865
    }
}

すべての応答には "finish_reason" フィールドが含まれます。 値は次のいずれかです。

  • stop: API から完全なモデル出力が返されました。
  • length: max_tokens 入力パラメーターまたはモデルのトークン制限により、不完全なモデル出力になりました。
  • content_filter: コンテンツ フィルターからのフラグによりコンテンツが省略されました。

ビデオ検索インデックスを作成する

  1. 使用している Azure OpenAI リソースと同じリージョンにある Azure AI Vision リソースを取得します。

  2. ビデオ ファイルとそのメタデータを保存および整理するためのインデックスを作成します。 下のコマンド例は、Create Index API を使用して my-video-index という名前のインデックスを作成する方法を示しています。 インデックス名を一時的な場所に保存します。後の手順で必要になります。

    ヒント

    ビデオ インデックスを作成する方法の詳細については、「ベクター化を使用したビデオ検索の実行」を参照してください。

    重要

    ビデオ インデックス名は、GUID (36 文字まで) でない限り、最大 24 文字まで指定できます。

    curl.exe -v -X PUT "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
    {
      'metadataSchema': {
        'fields': [
          {
            'name': 'cameraId',
            'searchable': false,
            'filterable': true,
            'type': 'string'
          },
          {
            'name': 'timestamp',
            'searchable': false,
            'filterable': true,
            'type': 'datetime'
          }
        ]
      },
      'features': [
        {
          'name': 'vision',
          'domain': 'surveillance'
        },
        {
          'name': 'speech'
        }
      ]
    }"
    
  3. 関連するメタデータと共にビデオ ファイルをインデックスに追加します。 次の例は、SAS URL と Create Ingestion API を使用し、2 つのビデオ ファイルをインデックスに追加する方法を示しています。 SAS URL と documentId の値を一時的な場所に保存します。後の手順で必要になります。

    curl.exe -v -X PUT "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index/ingestions/my-ingestion?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
    {
      'videos': [
        {
          'mode': 'add',
          'documentId': '02a504c9cd28296a8b74394ed7488045',
          'documentUrl': 'https://example.blob.core.windows.net/videos/02a504c9cd28296a8b74394ed7488045.mp4?sas_token_here',
          'metadata': {
            'cameraId': 'camera1',
            'timestamp': '2023-06-30 17:40:33'
          }
        },
        {
          'mode': 'add',
          'documentId': '043ad56daad86cdaa6e493aa11ebdab3',
          'documentUrl': '[https://example.blob.core.windows.net/videos/043ad56daad86cdaa6e493aa11ebdab3.mp4?sas_token_here',
          'metadata': {
            'cameraId': 'camera2'
          }
        }
      ]
    }"
    
  4. インデックスにビデオ ファイルを追加すると、インジェスト プロセスが開始されます。 ファイルのサイズと数によっては、これに時間がかかる場合があります。 Get Ingestion API を使用して状態を確認し、検索を実行する前にインジェストの完了を確認できます。 この呼び出しによって "state" = "Completed" が返されるのを待ってから、次の手順に進みます。

    curl.exe -v -X GET "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index/ingestions?api-version=2023-05-01-preview&$top=20" -H "ocp-apim-subscription-key: <YOUR_SUBSCRIPTION_KEY>"
    

次のステップ