OpenAI DevDayで発表されたGPT-4のマルチモーダルモデルであるGPT-4 Turbo with Visionが、Azure OpenAIでもプレビュー機能として使用できるようになりました。
今回の記事では概要と簡単な使用方法に触れていきます。
概要
GPT-4 Turbo with Visionモデルは以下のような特徴があります。
- 文字+画像を送信して、文字の返答を得る
- 2023年4月時点のデータで学習
- 最大トークン数が大幅に拡張されている
11月に先行リリースされたGPT-4 Turboモデルについては以下をご参照ください。
前提条件
モデルの使用データ
GPT-4 Turboと同様に2023年4月までのデータを使用して学習されています。この時点までの知識であればAIが回答してくれる可能性があります。
ユーザーがアップロードした画像データは文字同様に学習に使用されず、回答生成後に削除されます。
リージョン
使用できるリージョンは変更される可能性がありますので、最新情報は以下のDocsをご参照ください。 learn.microsoft.com
2023年12月15日現在、GPT-4 Turbo with Visionは、GPT-4 Turboと同様に使用できるリージョンが制限されています。
- オーストラリア東部
- スウェーデン中部
- スイス北部
- 米国西部
現在は全てのリージョンで10K TPMに制限されています。 learn.microsoft.com
読み込みモードとトークン数の計算方法
低解像度モード(low)と高解像モード(high)の2種類が用意されています。自動選択するautoを含めて3種類のモードの中から1つを選択します。
特徴はそれぞれ次の通りです。
low
- 512×512pxの画像を入力として想定する
- 固定で85tokenが消費される
high
- 画像サイズを以下のアルゴリズムに基づいて規定サイズにおさめる
- 2048×2048pxの正方形におさまるように画像を縮小する
- 画像の短辺が768pxになるように画像を縮小する
- 512*512pxに画像を分割する(分割された複数の画像が生成される)
- 分割したタイル全てをモデルに入力する
- 170*分割したタイル数+85tokenが消費される
auto
- 入力した画像によって高解像度モードか、低解像度モードを自動選択する
使用可能なトークン数
GPT-4 Turbo with Visionモデルでは入力と出力のトークン数が以下のように制限されます。
- 入力: 128,000
- 出力: 4096
入力のトークン数は画像と文字列が想定されます。履歴を含めて送信する場合、送信済み画像のトークン数もカウントされます。特に1分当たりのトークン制限(TPM)にもカウントされるため、画像サイズが大きい場合は注意する必要があります。
上記モデル別トークン数制限とは別に、画像のアップロードは画像あたり20MBに制限されています。
トークン数を事前計算する場合はtiktokenなどのライブラリとは別に、上記のアルゴリズムに基づいてOpenCVなどで画像サイズを計算する必要があります。
画像のメタデータ等は処理に使用されません。
モデルのデプロイ
Azure OpenAI ServiceでGPT-4 Turbo with Visionをデプロイします。
通常通り管理-デプロイの画面に移動し、「+新しいデプロイの作成」をクリックします。
GPT-4のモデルを選択すると以下のようにプルダウンが出てきます。ここでvision-previewを選択します。
GPT-4 Turbo with Visionモデルの使用
プレイグラウンド
これまではファイルのアップロードの項目がありませんでしたが、GPT-4 Turbo with Visionを選択した場合は文字入力のボックスにクリップマークが表示されます。
ComputerVisionをS1以上でデプロイすることで、動画のアップロードも可能になります。また 光学式文字認識(OCR)やオブジェクトグラウンディング等の機能と連携させて回答させることができます。
試しにパンダの画像を送信してみます。
デフォルトのシステムプロンプトが入っていると、画像を認識しているにも関わらず答えを返してくれないケースがあったため、テスト時にはシステムプロンプトは空にしておくことを推奨します。
追記:動画を送信する場合
動画のアップロードも可能であったため、試しにComputerVisionをデプロイしてみました。使用した動画は1分程度のもので、私が卒業旅行でダイビングをした際に撮影したものになります。
ビデオを画像に分解して、質問毎に回答に必要そうなフレームを抜き出しています。
次のような回答が得られました。
質問 | 回答 | コメント |
---|---|---|
これはどんな映像ですか? | これは、ダイバーたちが海中で潜水している映像です。彼らは様々なポーズを取りながら写真を撮っており、周囲には熱帯魚や大きな魚が泳いでいます。透明度の高い水中で、ダイビングの楽しみを堪能している様子が映されています。 | 正解です。動画中盤では私と友人がカメラに向かってポーズを取っています |
この映像がどこで撮影されたものか分かりますか? | 映像の中には特定の場所を示す直接的な手がかりやランドマークが映っていないため、これらの画像だけから正確な撮影場所を特定することはできません。しかし、透明度が高く、熱帯魚が見られることから、暖かい気候の海域で撮影された可能性が高いです。具体的な場所については、追加の情報が必要です。 | オーストラリアのケアンズ(グレートバリアリーフ)で撮影した映像なので、かなり正解に近いです。 |
冒頭で映っている大きな魚の種類はなんでしょうか | 冒頭で映っている大きな魚は、その体の形状と色から、ヒラマサの可能性があります。しかし、鮮明な特徴が不明瞭なため、断定はできません。他の可能性としては、同じく大型の熱帯魚であるスズメダイ科の魚などが考えられます。 | スクリーンショットでも映っている魚で、ナポレオンフィッシュです。熱帯魚である点は正解です。 |
Python
openaiのバージョンは1.3.3
を使用しています。Web上の画像データを送信することもできますが、今回はローカル環境上に画像ファイルを送信します。
from openai import AzureOpenAI import json import base64 API_KEY = "" RESOURCE_ENDPOINT = "" gpt4_turbo_vision = "gpt-4-vision-preview" image_path = "./panda.jpg" prompt = "この画像には何が描かれていますか?" # 画像をbase64に変換 def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') client = AzureOpenAI( api_key=API_KEY, azure_endpoint=RESOURCE_ENDPOINT, api_version="2023-09-01-preview" ) b64_image = encode_image(image_path) response = client.chat.completions.create( model = gpt4_turbo_vision, messages=[ { "role": "user", "content": [ { "type": "text", "text": prompt }, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{b64_image}", "detail": "high" } } ] } ], max_tokens=4096 ) print(response.choices[0].message.content)
次のようなレスポンスが得られました。
パンダが描かれています。
おわりに
Azure OpenAIでは、送信したデータはモデルの学習に使用されることがなくクローズドな環境で使用することができます。また画像に加えて、ComputerVisionと連携させることで動画などを読み込むこともできるようになり、ChatGPTでやれることの幅が大きく広がりました。
AIモデルの進化は続いていくため、今後も最新の情報を発信していこうと思います。