Von Bedeutung
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳細については、「 Microsoft Azure プレビューの追加使用条件」を参照してください。
多様なデータ入力を処理および解釈できるマルチモーダル大規模言語モデル (LLM) は、言語のみのシステムの機能を新たなレベルに引き上げる強力なツールです。 さまざまなデータ型の中で、画像は実際にある多くのアプリケーションにとって重要です。 画像データを AI システムに組み込むことで、視覚的な理解に不可欠なレイヤーが提供されます。
この記事では、次のことについて説明します。
- プロンプト フローで画像データを使用する方法
- 画像入力を分析するための内蔵 GPT-4V ツールの使用方法。
- 画像とテキストの入力を処理できるチャットボットの作成方法。
- 画像データを使用したバッチ実行の作成方法。
- 画像データを使用したオンライン エンドポイントの使用方法。
プロンプト フローの画像の種類
プロンプト フローの入出力は、新しいデータ型として Image をサポートします。
プロンプト フロー作成ページで画像データを使用するには、次の操作を行います。
フロー入力を追加し、データ型として Image を選択します。 画像ファイルのアップロード、ドラッグ アンド ドロップ、クリップボードからの画像の貼り付け、フロー フォルダーの画像 URL や相対画像パスの指定が可能です。
LLM に画像をフィードする前に、Python ツールを使用して画像を前処理することができます。 たとえば、画像のサイズを変更したり、より小さいサイズにトリミングしたりすることができます。
from promptflow import tool from promptflow.contracts.multimedia import Image as PFImage from PIL import Image as Image import io @tool def process_image(input_image: PFImage) -> PFImage: # convert the input image data to a BytesIO object data_byteIO = io.BytesIO(input_image) # Open the image data as a PIL Image object image = Image.open(data_byteIO) # crop image cropped_image = image.crop((100, 100, 900, 900)) # Convert the cropped image back to BytesIO byte_arr = io.BytesIO() cropped_image.save(byte_arr, format = 'JPEG') # Create a new prompt flow Image object with the cropped image data # This image is now ready to be returned cropped_PF_image = PFImage(byte_arr.getvalue(), mime_type = "image/jpeg") return cropped_PF_image ``` > [!IMPORTANT] > To process images using a Python function, you need to use the `Image` class that you import from the `promptflow.contracts.multimedia` package. The `Image` class is used to represent an `Image` type within prompt flow. It is designed to work with image data in byte format, which is convenient when you need to handle or manipulate the image data directly. > > To return the processed image data, you need to use the `Image` class to wrap the image data. Create an `Image` object by providing the image data in bytes and the [MIME type](https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) `mime_type`. The MIME type lets the system understand the format of the image data, or it can be `*` for unknown type.
Python ノードを実行し、出力を確認します。 この例では、Python 関数は処理された Image オブジェクトを返します。 画像出力を選択して、画像をプレビューします。
Python ノードの Image オブジェクトがフロー出力として設定されている場合は、フロー出力ページで画像をプレビューすることもできます。
GPT-4V ツールの使用
Azure OpenAI GPT-4 Turbo with Vision ツールと OpenAI GPT-4V はプロンプト フローの組み込みツールであり、OpenAI GPT-4V モデルを使用して、入力画像に基づいて質問に回答できます。 このツールを見つけるには、フロー作成ページで [その他のツール] を選択します。
Azure OpenAI GPT-4 Turbo with Vision ツールをフローに追加します。 GPT-4 vision-preview モデルを利用できる Azure OpenAI 接続があることを確認します。
GPT-4V ツールのプロンプトを構成する Jinja テンプレートは、LLM ツールのチャット API と同様の構造になっています。 プロンプト内で画像入力を表すために、構文 
を使用できます。 画像入力は、user
、system
、assistant
メッセージで渡すことができます。
プロンプトを構成したら、[入力を検証して解析する] ボタンを選択して入力プレースホルダーを解析します。

で表される画像入力は、入力名を INPUT NAME として使用する画像の種類として解析されます。
画像入力には、次の方法を通して値を割り当てることができます。
- 画像の種類のフロー入力からの参照。
- 他のノードの画像の種類の出力からの参照。
- 画像をアップロードし、ドラッグして貼り付けるか、または画像 URL や相対画像パスを指定します。
画像を処理するチャットボットの作成
このセクションでは、画像とテキスト入力を処理できるチャットボットの作成方法について説明します。
画像とテキストに関するあらゆる質問に回答できるチャットボットを作成するとします。 このセクションの手順に従うことで、これを実現できます。
チャット フローを作成します。
[入力] で、データ型を "list" として選択します。 チャット ボックスで、テキストや画像の混成されたシーケンスを入力すると、プロンプト フロー サービスがそれをリストに変換します。
GPT-4V ツールをフローに追加します。 既定の LLM ツール チャットからプロンプトをコピーし、GPT 4V ツールに貼り付けることができます。 次に、フローから既定の LLM ツール チャットを削除します。
この例では、
{{question}}
はテキストと画像のリストであるチャット入力を指します。[出力] で、"answer" の値をビジョン ツールの出力の名前 (たとえば、) に変更します。
${gpt_vision.output}
(省略可能) GPT-4V の出力を処理するフローに任意のカスタム ロジックを追加できます。 たとえば、Guardrails > コントロール ツールを追加して、回答に不適切なコンテンツが含まれているかどうかを検出し、最終的な回答をユーザーに返すことができます。
これで、チャットボットをテストできるようになります。 チャット ウィンドウを開き、画像とともに質問を入力します。 チャットボットは、画像とテキストの入力に基づいて質問に回答します。 チャット入力値はチャット ウィンドウの入力から自動的にバックフィルされます。 画像付きのテキストは、テキストと画像のリストに変換されるチャット ボックスで見つけることができます。
注
チャットボットがリッチ テキストや画像で応答できるようにするには、チャット出力を型 list
にします。 リストはカスタム オーダーの文字列 (テキスト用) とプロンプト フロー イメージ オブジェクト (画像用) で構成される必要があります。
画像データを使用したバッチ実行の作成
バッチ実行では、広範なデータセットを使用してフローをテストできます。 画像データを表現するには、画像ファイル、公開画像の URL、Base64 文字列の 3 つの方法があります。
-
画像ファイル: バッチ実行で画像ファイルを使用してテストするには、data フォルダーを準備する必要があります。 このフォルダーには、ルート ディレクトリにある
jsonl
形式のバッチ実行エントリ ファイルと、同じフォルダーまたはサブフォルダーに格納されているすべての画像ファイルが含まれている必要があります。エントリ ファイルでは、各画像ファイルを参照する
{"data:<mime type>;path": "<image relative path>"}
形式を使用する必要があります。 たとえば、{"data:image/png;path": "./images/1.png"}
のようにします。 -
公開画像URL:
{"data:<mime type>;url": "<image URL>"}
形式を使用して、エントリ ファイル内の画像 URL を参照することもできます。 たとえば、{"data:image/png;url": "https://www.example.com/images/1.png"}
のようにします。 -
Base64 文字列: Base64 文字列は、
{"data:<mime type>;base64": "<base64 string>"}
形式を使用してエントリ ファイルで参照できます。 たとえば、{"data:image/png;base64": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABLAQMAAAC81rD0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABlBMVEUAAP7////DYP5JAAAAAWJLR0QB/wIt3gAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB+QIGBcKN7/nP/UAAAASSURBVDjLY2AYBaNgFIwCdAAABBoAAaNglfsAAAAZdEVYdGNvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVDnr0DLAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTA4LTI0VDIzOjEwOjU1KzAzOjAwkHdeuQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0wOC0yNFQyMzoxMDo1NSswMzowMOEq5gUAAAAASUVORK5CYII="}
のようにします。
要約すると、プロンプト フローは、{"data:<mime type>;<representation>": "<value>"}
という画像を表すために、固有の辞書形式を使用します。 ここでは、<mime type>
は HTML 標準の MIME 画像の種類を指し、<representation>
はサポートされている画像の表現 path
、url
、base64
を指します。
バッチ実行の作成
フロー作成ページで、[評価] ->[カスタム評価] ボタンを選択してバッチ実行を開始します。 バッチ実行設定で、データセットを選択します。これは、フォルダー (エントリ ファイルと画像ファイルを含む) またはファイル (エントリ ファイルのみを含む) のどちらかにできます。 エントリ ファイルをプレビューし、入力マッピングを実行して、エントリ ファイルの列をフロー入力に整列させることができます。
バッチ実行の結果の表示
バッチ実行の出力は、実行の詳細ページで確認できます。 出力テーブルで画像オブジェクトを選択すると、画像を簡単にプレビューできます。
バッチ実行の出力に画像が含まれている場合、出力 jsonl ファイルと出力画像を使用して flow_outputs dataset を確認できます。
画像データを使用してオンライン エンドポイントを使用する
リアルタイム推論のためにフローをオンライン エンドポイントにデプロイできます。
現在、デプロイの詳細ページの [テスト] タブでは、画像の入力または出力をサポートしていません。
今のところ、画像入力を含む要求を送信することでエンドポイントをテストできます。
画像入力でオンライン エンドポイントを使用するには、{"data:<mime type>;<representation>": "<value>"}
形式を使用して画像を表す必要があります。 この場合、<representation>
は url
または base64
のどちらかにできます。
フローで画像出力が生成される場合、base64
形式 (たとえば、{"data:<mime type>;base64": "<base64 string>"}
) で返されます。