GPT-4 Turbo with Vision の Add your data 機能が画像ファイルに対応、画像データによるRAGを試そう！

## はじめに
2023年12月ごろに、Azure OpenAI で GPT-4 Turbo with Vision が Public Preview となりました。GPT-4 Turbo with Vision について、 Azure OpenAI Studio と Azure AI Studio のチャットプレイグラウンドで **Add your data 機能** （日本語表記では **「データの追加(プレビュー)」** 機能）から画像をアップロードして、画像データの検索を行うことができるようになりました。この Add your data 機能を使うことで、
- 画像による画像検索
- 類似画像検索
- 画像データによるグラウンディング (RAG)

を試すことができます。
今回はその Add your data を実際に試していきたいと思います。
(※本記事は執筆時点の情報に基づいております。)

GPT-4 Turbo with Vision の概要については他の技術ブログでも記事があるかと思うので、今回は割愛させていただきます。

また本記事で行う手順は、 MS Learn のドキュメントとしてこちらに記載されているものです。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-image-data

## 手順
### リソースについて

[GPT-4 Turbo with Vision が使えるリージョン](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models#gpt-4-and-gpt-4-turbo-preview-model-availability)は下記になります。
東日本リージョンが最近追加されました。
- Japan East (2024/2月 追加)
- US East
- Sweden Central
- Switzerland North
- Australia East

Azure OpenAI のリソースを作成したあと、モデルのデプロイを行います。モデルとして `gpt4` を、モデルバージョンは `vision-preview` を選択します。

### チャットプレイグラウンド

チャットプレイグラウンドに移動し、まず右側にある構成タブのデプロイを、GPT-4 Turbo with Vision のモデルに指定します。その後、左側の **データの追加（プレビュー）** のタブから、**「＋データソースの追加」** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/5e2a3962-86d0-2df4-9079-8c741c7c2cde.png)


ここから画像データを用いたインデックスを作成することができます。
データの追加方法は

1. [Azure Blob Storage を使用してデータを追加する](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-image-data#add-your-data-using-azure-blob-storage)
2. [Azure AI Search を使用してデータを追加する](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-image-data#add-your-data-using-azure-ai-search)
3. [ファイルをアップロードしてデータを追加する](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-image-data#add-your-data-by-uploading-files)

から選ぶことができます。
既存の Blob Storage にデータをアップロードする場合や、既に Azure AI Search のインデックスを作成してある場合は 1 か 2 を選んでください。
Azure AI Search でインデックスを作成する際はこちらの [Github リポジトリ](https://github.com/Azure/azure-search-vector-samples/tree/main) を参考にしてください。

今回はローカルにある画像ファイルをアップロードして試したいと思いますので、3つめの `Upload Files` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/4746bd26-5b03-b322-95cc-dce0b46bbcee.png)

File をアップロードする Blob Storage, AI Search リソースを選択します。
リソースがない場合は適宜、新規作成してください。

CORS 設定は、あるドメインで実行されている Web アプリケーションが別のドメイン内にあるリソースにアクセスできるようにする HTTP 機能です。CORS設定はオンにする必要があります。詳細については[ドキュメント](https://learn.microsoft.com/ja-jp/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services)でご確認ください。

作成されるインデックスには、画像データのインデックスと識別できるように '-v' がインデックス名の後につくようになっています。

実際に画像をアップロードします。今回は簡単に、Microsoft の Surface シリーズの画像をアップロードします。そして、各画像にメタデータを加えていきます。今回はメタデータとしてそれぞれ、機種名をいれていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/426bd365-1185-0696-9715-5e23cc1ead76.png)

保存し、データがインジェストされ、インデックスが作成されるのを待ちます。作成されたら、今回はシステムメッセージを「あなたはPCの機種について答えるアシスタントです。」と変更します。

### 試した結果

画像とともに「このパソコンの機種を教えて」と聞いてみましょう。
機種が Laptop5 だと教えてくれましたね！これは合っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/0d9f178d-f5ca-992c-46ff-c7a4ec4fd66e.png)

無事に画像による画像検索ができました。


GPT-4 Turbo with Vision の Preview が発表された時期に、[こちらの Tech Blog](https://techcommunity.microsoft.com/t5/microsoft-mechanics-blog/gpt-4-turbo-with-vision-azure-ai-vision/ba-p/4009630)に載っていた Demo 動画もご紹介します。

こちらの動画は英語ですが、テントやアウトドア用品のECサイト上に、チャットUIが追加されています。ユーザーが、この画像に似たテントを ＄200 以下で提案してほしい、と聞くと、オレンジの似たテントかつ ＄200 以下のものを探しだし、自然言語で回答しています。

https://youtu.be/KPTVu-AeG7g?si=nK52-LEmcLkxKc6T&t=293

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/bcef7b93-6c9f-a8b6-3453-c174c6161d3d.png)
([Demo動画](https://youtu.be/KPTVu-AeG7g?si=nK52-LEmcLkxKc6T&t=293)より画像引用)

このような形で、画像による画像検索や、類似画像検索などのユースケースは今後増えていきそうですね！

### 注意点
大規模言語モデル全般に言えることですが、ハルシネーション（間違った回答を生成すること）が起きる場合があります。今回の Surface の例でも常に 100% 正しく機種を回答したわけではありません。OpenAI 社が発表している GPT-4V モデルの [Limitations](https://platform.openai.com/docs/guides/vision/limitations) から一部引用すると、

>Non-English: The model may not perform optimally when handling images with text of non-Latin alphabets, such as Japanese or Korean.

日本語や韓国語などのテキストが含まれる場合、モデルは最適なパフォーマンスにならない可能性があるとのことです。Microsoft からは Azure AI Vision による Enhancement の機能が出ています。Azure OpenAI の GPT-4 Turbo with Vision で日本語テキストの読み取り機能をより強化するには [画像で Vision 拡張機能を使用する](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/gpt-with-vision?tabs=rest#use-vision-enhancement-with-images) のドキュメントに載っている手順で行いましょう。

>Spatial reasoning: The model struggles with tasks requiring precise spatial localization, such as identifying chess positions.

チェスのポジションを認識するなどの、正確な空間位置把握が必要とされる場合はモデルは苦戦するとこのことです。

>Rotation: The model may misinterpret rotated / upside-down text or images.

テキストや画像が回転していたり、上下逆の場合は誤って認識する可能性があるとのことです。

このような特性を知ったうえで、うまく活用していきたいですね！

GPT-4Vに関する論文として、ぜひこちらもご参考にしてくだい。
- [The Dawn of LMMs](https://arxiv.org/abs/2309.17421)



## Azure Portal での確認

それでは、アップロードした画像ファイルがどのような形でインデックス化されたのか Azure Portal からも確認します。

まず、Azure Storage ですが、データを追加する際に指定した Storage に、` "fileupload-<指定したインデックス名>-v" ` のような名前のコンテナができています。中身を見てみると、アップロードした画像の一覧が格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/bce0be03-cd5b-7251-0b1c-70bbbb819730.png)

また、"metadata-"で始まる jsonファイルがありますが、この中身を確認すると、メタデータ指定で追加した内容が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/c4f99749-8af7-c0e9-ebc7-37d24d85559f.png)

この"metadata-"で始まる jsonファイルは、[Azure Blob Storage を使用してデータを追加する](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-image-data#add-your-data-using-azure-blob-storage)ときにも、必要となります。

Add your data で追加した画像ファイルは Azure Blob Storage に入っていますが、入力のときにアップロードしている画像ファイルについては、FAQのひとつ " [アップロードした画像を削除できますか](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/faq#-------------------) " に記載があり、

>モデルによって処理された後、画像は自動的に削除されます。

とのことです。

次に Azure AI Search の方でインデックスを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620813/d340fbf2-480f-6b2d-9e44-293a99aaa879.png)

自動で image_vector フィールドが作成されていますね。
チャットプレイグラウンドから簡単に画像ベクトルを作って検索することができました。



## マルチモーダルモデルのプロンプトエンジニアリング

MS Learn のドキュメントも続々とアップデートが入っています。
マルチモーダルモデルに関しても [GPT-4 Turbo with Vision のプロンプトエンジニアリング](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/gpt-4-v-prompt-engineering) というドキュメントが出ました。テキストの場合のプロンプトエンジニアリングとほとんど同じですが、

- コンテキストの特異性
    - 背景情報などを明確で簡潔に書く
- タスク指向のプロンプト
    - 目的やタスクを明確にする
    - ○○に焦点を当てて、△△用に、など
- 拒否の処理
    - もし回答に”できません”などと生成された場合、フォローアップの質問をする
    - どのような情報が必要ですか、などと入力する
- 例の追加
    - 回答の仕方の例を追加する
- プロンプトチューニングを試す
    - 思考の連鎖 (Chain of Thought, CoT) の手法で段階的に推論させる
- 要求の分割
    - 抽象的ではなく、リクエストを細分化する
- 出力形式の定義
    - どのように回答させるかについて明確に指示をする
    - 3つ挙げてください、箇条書きにしてください、など

などが紹介されています。
望ましい出力を得るために、マルチモーダルモデルでも上記のようなプロンプトの工夫もしてみましょう！