GPT-4 Turbo with Vision × Azure AI Search × Azure AI Vision 時代のマルチモーダルエンタープライズサーチ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/14d69cc6-ea58-0fa4-09da-f368edb5c5e6.png)

2023/3/10 の公開から 9 か月経ちましたが、[GPT-4 Turbo with Vision](https://learn.microsoft.com/azure/ai-services/openai/how-to/gpt-with-vision) のパブリックプレビュー開始などもあり[例の RAG アーキテクチャ](https://github.com/Azure-Samples/azure-search-openai-demo)のレポジトリがマルチモーダル対応したり他にもいろいろ改良されています。

1. **GPT-4 Turbo with Vision による回答**が可能に
1. **Azure AI Vision と Azure AI Search を使用した画像類似検索**が可能に
1. Thought process UI の改良
1. その他多数→別記事で解説予定

https://github.com/Azure-Samples/azure-search-openai-demo

# 1. GPT-4 Turbo with Vision による回答が可能に
GPT-4 Turbo with Vision を Azure AI Search と統合する例が含まれるようになりました。この機能により、テキストベースのコンテンツに加えて、財務書類などの画像やグラフのインデックス作成と検索が可能になります。現在は画像のアップロード機能は実装されておらず、**Azure AI Search による画像類似検索でヒットしたドキュメントを画像化したものを渡して回答**させるという手法で実装されています。つまり今はユーザークエリーは常にテキストということになりますが、今後はユーザー画像クエリーとしてのアップデートもあるかと思います。

この機能を使用するには、リポジトリを最新に更新し、`azd env set USE_GPT4V true` コマンドで Vision 対応を有効化します。すでに古いデプロイを削除する場合は、`azd down --purge` で削除し、`azd up` で再度デプロイを行います。環境構築には Sweden Central のような `gpt-4-vision-preview`、`gpt-35-turbo-0613`、`text-embedding-ada-002`が同時に[デプロイ可能なリージョン]()が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/05027b89-b07f-7bd9-4601-58cb8abad214.png)

チャット UI から GPT-4 Turbo with Vision 機能を ON にするには、「Developer settings」メニューから「Use GPT-4 Turbo with Vision」チェックを ON にします。モデルに与えることのできるデータはテキストまたは画像、またはその両方となります。

# 2. Azure AI Vision と Azure AI Search を使用した画像類似検索が可能に
`USE_GPT4V` を有効化すると、バックエンドではユーザーのテキストクエリーを複数の方法で Embeddings に変換し、ハイブリッド検索（キーワード＋画像類似検索）を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/18607678-c8dd-ffeb-0de4-3cae0809e305.png)

## データインジェストフェーズ
 1. ドキュメントの前処理: `data`フォルダに格納したドキュメントはページ単位に分割され、**PNG ファイル**として Blob ストレージに保存されます。各ファイルの名前とページ番号は参照用に画像内に埋め込まれています。
 1. データ抽出: [Azure AI Document Intelligence](https://azure.microsoft.com/products/ai-services/ai-document-intelligence) の [prebuilt-layout](https://learn.microsoft.com/azure/ai-services/document-intelligence/concept-layout?view=doc-intel-4.0.0) を使用してテキスト データが抽出されます。
 1. データのインデックス作成: **ドキュメントの PNG 画像を Azure AI Vision を使用して Embeddings に変換**し、生のテキストとともに Azure AI Search でインデックス化されます。

※`USE_GPT4V` モードの時はテキストのチャンク化が無効化されます。将来は改良されるかとは思いますが、現状の実装ではしょうがないかな…　と。

## 検索フェーズ
検索フェーズでは、 Azure AI Vision の [Vectorize Text API](https://learn.microsoft.com/azure/ai-services/computer-vision/how-to/image-retrieval#call-the-vectorize-text-api) を使用してユーザーの質問の Embeddings も計算し、それを Azure AI Search に渡して、`imageEmbeddings` フィールドの Embeddings と比較します。一致するドキュメントごとに、画像 Blob がダウンロードされ、Base64 エンコーディングに変換されます。

プロンプトでは検索結果とユーザーの質問を組み合わせてから、Base64 でエンコードされた画像も入力として、テキストと画像の両方が GPT-4 Turbo with Vision モデルに送信されます。モデルは画像への引用を含む回答を生成し、引用がクリックされると UI が Base64 でエンコードされた画像をレンダリングします。

### マルチクエリーベクトル検索の例
マルチクエリーベクトル検索では、検索インデックス内の複数のベクトル フィールドに対して複数のクエリーが送信されます。このクエリーリクエストの一般的な例は、同じモデルで画像と非画像コンテンツをベクトル化できるマルチモーダル モデルを使用する場合です。ただし今回は、`text-embedding-ada-002` によるテキスト→ベクトルと Vectorize Image API による 画像→ベクトルをハイブリッドで検索します。

```python
r = search_client.search(
        None, 
        top=3, 
        vector_queries=[
            VectorizedQuery(
                vector=query1, k_nearest_neighbors=3, fields="imageEmbedding"),
            VectorizedQuery(
                vector=query2, k_nearest_neighbors=3, fields="embedding")
        ])
```

上のクエリ例では、`imageEmbedding` と `embedding` フィールドの両方の類似性を検索しますが、それぞれ 2 つの異なる クエリー Embeddings を送信します。このクエリーでは、[Reciprocal Rank Fusion (RRF)](https://learn.microsoft.com/azure/search/hybrid-search-ranking) を使用してスコア付けされた結果が生成されます。上のコードは `azure-search-documents==11.4.0` における記法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0851f1c4-71cf-6b0f-1b19-97dd7e0e81ae.png)

チャットアプリケーションからマルチクエリーベクトル検索のフィールドを制御するには、上のように「Vector Fields (Multi-query vector search)」を設定します。

## 回答結果の検証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/4eaa9ea4-0b25-5e8b-972b-f2e14b067582.png)

質問：原油価格と株式市場の動向の間に相関関係はありますか？
回答：はい、原油価格と株式市場の動向には相関関係があります。提供された相関表によると、原油価格は S&P500 と 0.6、NASDAQと 0.65 の相関関係があります。[1]

「画像のみ」を与えた場合であればドキュメント PDF 画像内の表から、「テキストのみ」を与えた場合であれば、Azure AI Document Intelligence で抽出した表構造から質問の回答に合うように**表内から必要なデータのみを抽出して回答**していることが分かります。

# 3. Thought process UI の改良
このチャットアプリケーションはクエリー拡張・変換、ドキュメント検索、結果生成の順で処理を行います。これまでの Thought process タブではそれぞれのステップが混ざって見にくかったのですが、今はステップごとに分割されて可視化されており、とても見やすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/8a47e5b2-c0df-248c-4afc-e242a22b9c6d.png)

# 進化の系譜
- 2023/03/11 

https://qiita.com/nohanaga/items/803c09b5a3a4e2d1776f

- 2023/08/24

https://qiita.com/nohanaga/items/bbc0c1fba1ec53deeeed

# 応用
https://qiita.com/nohanaga/items/eea68e0b7a0f417c5276

https://qiita.com/nohanaga/items/4c3f3370bdad7743e74d