こんにちは!電通総研AITC のAIソリューショングループ太田です。
このコラムでは、Azure AI Searchを用いたマルチモダール検索とマルチモダールRAGについて紹介します。
マルチモダール検索はGPT-4V登場以前から存在する技術です。 昨年のGPT-4Vの登場により、マルチモーダル検索結果に基づくRAGが実現できるようになり、今マルチモーダルRAGがホットになっています。
マルチモーダルRAGは、通常のRAGと同じく、参考となる情報をLLMに読み込ませることで、LLMが本来持っていない知識を利用して文章生成する技術です。 通常のRAGと違い、マルチモーダルLLMを利用することで、文章だけでなく画像や音声も参照情報として扱うことが可能になります。
マルチモーダルRAGの必要性
従来のLLMを用いたRAGだと、どうしても図やグラフをLLMにテキストとして与える必要があり困難でした。 そのため、画像も入力データとして扱えるGPT-4Vに期待を寄せられていました。
ユーザーはマルチモーダルRAGには以下を期待しています。
- 図やグラフを探して回答してほしい(Search)
- 図やグラフの値を読み取って回答してほしい(Read)
- 図やグラフの結果から考えて回答してほしい(Think)
これらができるようにマルチモーダル検索とマルチモーダルRAGのアルゴリズムを構築していきます。 まず最初に私はドキュメントの性質でアルゴリズムが変わると考えています。 図が中心のドキュメントと文章が中心のドキュメントです。
このコラムでは、パワーポイントや図面など、図が中心のドキュメントに対するマルチモーダルRAGを前提に技術を紹介します。
数十ページに及ぶ文章が多い資料内の図やイラストを扱ったRAGを取り組むには、より高度な技術が必要になります。なぜなら資料の何ページ目に図があるのか、図の番号と文章の説明の対応づけなど、取り扱う情報が多く煩雑になるからです。
本コラムの前提とする問題設定
例として製造業でのマルチモーダルRAGの活用事例を考えます。 製造業では、設計図やマニュアル、仕様書などの製品に関するドキュメントを多く利用します。 それらには画像としての図面や記号と、テキストとしての詳細説明や注意書きが記されています。
そしてマルチモーダルLLMにこれらの情報を読み込ませると、モデルが元々持っている知識も使用し、設計図や詳細説明から明示的に書いていない素材や構造の特徴を把握することができます。
ここから以下のビジネスシーンでそれぞれ活用方法が考えられます。
- 営業業務:商材理解のために関連する製品の違いを理解したり、顧客の要望にあった製品を探すのに活用できます。
- 調達業務:特定の条件に合う部品や素材を探すために、製品情報からマルチモーダル検索で求める部品や素材の情報を検索できます。
- 設計業務:図面や仕様書、報告書から技術的な問題や具体的な部品の仕様に関する情報を得るために利用します。
注意として、マルチモーダルLLMがどこまで業界固有の知識を持っているかは別途検証が必要です。
マルチモーダル検索の紹介
RAGでマルチモーダルLLMに参照させる文書を選ぶには、マルチモーダル検索が必要があります。 このマルチモーダル検索は画像、テキスト、音声といった2つ以上のタイプの情報を組み合わせた検索です。
ここでは2種類のマルチモーダル検索を紹介します。
- ハイブリッド検索
- マルチモーダル埋め込み検索
ハイブリッド検索
異なる検索アルゴリズムでそれぞれ検索し、結果をリランキングすることで最終的な検索結果を得ます。
マルチモーダルの場合、テキストのベクトル検索と画像のベクトル検索を組み合わせる方法になります。 テキスト単体などのユニモーダル情報でも、キーワード検索とベクトル検索を組み合わるなどしてハイブリッド検索は可能です。
画像とテキストの両方で検索ランキングが高い場合、最終的なハイブリッド検索の結果で上位になります。
マルチモーダル埋め込み検索
二つの異なるモーダルの意味的表現を一つのベクトル(埋め込み)に変換する技術を活用した検索です。
この技術により、テキストから画像を検索することができます。 マルチモーダル埋め込み検索の評価で重要な点は、テキストと画像の意味的表現が埋め込み空間でどれだけ近いかです。 例えば、「中央にバネが配置されていて、滑車が取り付けられている機構の図面」で検索したとき、検索結果にはバネと滑車が指定された配置で存在する図面の画像がヒットすることが望ましいです。
どちらのマルチモーダル検索の手法もAzure AI Searchを使用することで実現する事ができます。ここからはAzure AI Searchについて説明したあと、一つずつAzure AI Searchによるマルチモーダル検索の実装方法を紹介します。
Azure AI Searchとは
Azure AI Searchはベクトル検索とキーワード検索などを持つ検索サービスです。フィルター機能、あいまい検索、セマンティック検索機能なども備えています。ベクトル検索は、テキストだけでなく画像もベクトル化すれば利用可能です。
様々な検索機能をサポートしているのは非常に便利です。これからは様々なデータをベクトルに変換して検索していく世界になるのでと想像しています。
Azure AI Searchの実装方法を説明します。 まず検索対象文章と補助情報を含めてスキーマを定義します。 通常のDBと同じようにどの列が検索対象で型は何か指定します。 そのスキーマに従うインデックスを作成し、インデックスにドキュメントをアップロードします。 検索するときはインデックスを指定して、クエリと検索フィールド名を与えると検索結果としてドキュメントが得られます。
Azure AI Searchでのマルチモーダル検索の実装方法
ハイブリッド検索の実装方法
ハイブリッド検索を直感的に理解するサンプルコードを載せます。 そのままでは動かないので、セクションの最後にあるAzure公式サンプルを確認してください。
フィールドの定義とインデックス作成
フィールドの定義は画像ベクトルとテキストベクトルと通常のテキストで分けます。 以下のコードでは、テキストベクトルはマルチモーダル埋め込みではなく、openaiのtext-embedding-ada002の埋め込みを使っています。
インデックス作成後に、スキーマに合うようにドキュメントをそれぞれ加工してインデックスにアップロードしてください。
#import文などは省略 #スキーマの定義 fields = [ SearchableField( name="text", type=SearchFieldDataType.String, analyzer_name="ja.microsoft", ), SearchField( name="textVector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single), searchable=True, vector_search_dimensions=1536, vector_search_profile_name="my-vector-config", ), SearchField( name="imageVector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single), searchable=True, vector_search_dimensions=1024, vector_search_profile_name="my-vector-config", ), #他のフィールド名は省略 ] #ベクトル検索のアルゴリズム定義 vector_search = VectorSearch( profiles=[ VectorSearchProfile( name="my-vector-config", algorithm_configuration_name="my-algorithms-config", ) ], algorithms=[ HnswAlgorithmConfiguration(name="my-algorithms-config"), ], ) cors_options = CorsOptions(allowed_origins=["*"], max_age_in_seconds=60) #インデックスの作成 index = SearchIndex( name=name, fields=fields, scoring_profiles=scoring_profiles, cors_options=cors_options, vector_search=vector_search, ) index_client.create_index(index)
Multi Vector Search
画像とテキストのマルチモーダル検索の場合はマルチベクトルを指定します。
query = "テキストクエリです。" multimodal_embbeding = generate_multimodal_text_embeddings(query) #別途APIを呼び出す text_query = VectorizedQuery( vector=self.embeddings.embed_query(query), k_nearest_neighbors=10, fields="textVector", ) image_query = VectorizedQuery( vector=multimodal_embbeding, k_nearest_neighbors=10, fields="imageVector", ) search_documents = search_client.search( search_text=None, vector_queries=[text_query, image_query], )
Hybrid Text Search
通常のテキストのキーワード検索とベクトル検索のハイブリッド検索は以下のように記述します。
query = "テキストクエリです。" text_query = VectorizedQuery( vector=self.embeddings.embed_query(query), k_nearest_neighbors=10, fields="textVector", ) search_documents = search_client.search( search_text=query, vector_queries=[text_query], )
参考
AI Searchのハイブリッド検索の精度調査については、Microsoftが公開している記事をご覧ください。
Microsoft が Azure Cognitive Search による RAG システムの定量評価結果を公表 #ChatGPT - Qiita
実装の省略されたところを知りたい方はAzure公式サンプルをご覧ください。
https://github.com/Azure/azure-search-vector-samples/blob/main/demo-python/code/azure-search-vector-python-sample.ipynbgithub.com
Azureが提供するマルチモーダル埋め込み用のAPIの利用方法はMS Learnをご覧ください。
マルチモーダル埋め込みの概念 - Image Analysis 4.0 - Azure AI services | Microsoft Learn
マルチモーダル埋め込み検索の実装方法
インデックスの作成ではハイブリッド検索の"imageVector"のみフィールドに用意すれば大丈夫です。 インデックスにドキュメントを追加するときは画像をベクトル変換し、インデックスにアップロードしてください。
マルチモーダル埋め込み検索
最初にテキストクエリをマルチモーダル埋め込みします。 埋め込みベクトルをもとに検索をするとテキストクエリで画像を検索することができます。
multimodal_embbeding = generate_multimodal_text_embeddings(query) #別途APIを呼び出す image_query = VectorizedQuery( vector=multimodal_embbeding, k_nearest_neighbors=10, fields="imageVector", ) search_documents = search_client.search( search_text=None, vector_queries=[image_query], )
どちらの検索アルゴリズムを使うべきか
マルチモーダル埋め込み検索は、実装が容易で、インデックスを作成する際に、大量の画像を先の実装のようにベクトルに変換するだけです。 また、この検索方法の良さとして、数万オーダーの画像データを速くインデックスに保存することができます。 マルチモーダル埋め込み検索が有効なユースケースは、検索対象が自然写真であり、複雑なドメイン知識が不要な場合です。
逆に、マルチモーダル埋め込み器の学習データに含まれていない画像を検索対象にする場合や、ドメイン知識を豊富に含むテキストクエリで検索する場合は、異なる方法を検討する必要があります。この場合、クエリの意図した検索結果得られないことが多いです。 設計図を例にすると、図面に記載される長さやアームの形や素材を指示してもドメイン知識が正しく埋め込み表現に変換されず、検索結果に反映されないでしょう。
こういった課題に対応するため、ハイブリッド検索を利用します。
GPT-4Vの登場によって、画像のベクトル情報では表現しきれないタスク固有のセマンティックをプロンプト設計することでテキスト化できます。 つまり、ハイブリッド検索を使うと画像の構造や表層情報と意味的な情報を総合的にランキングして返すことができます。 ただし、画像の理解をGPT-4Vに依存させるとインデックスにドキュメントをアップロードする時間が画像一枚につき20秒程度かかり、インデックス作成時に画像の枚数をスケールしにくいです。
単純に画像上の文字を検索対象にしたい場合は、従来のOCRを使うか、OCR結果を通常のChatGPTに補正してもらいましょう。
マルチモーダルRAGのアーキテクチャ
ここで、マルチモーダル検索を使ったRAGのアーキテクチャを説明します。 Azure のリソースアーキテクチャは下図を想定します。
最初にインデックス作成では、pdfファイルを1ページずつ画像に変換する処理を挟みます。 その後は、図の通りでマルチモーダル検索で説明した手続きでインデックスを作成します。
ちなみに、pdfファイルから画像を物体検知することもできますが、私たちの手元のデータだと学習なしでは検知できませんでした。
このアーキテクチャが文章中心の資料に適さない理由
pdfを一枚ずつ画像に変換するため、通常の文章が多いpdfやdocx系のファイルだと、処理に無駄が多く適していません。 なぜなら各ページに画像がない場合もあり、画像があってもページ全体の一部分に過ぎず、それでは検索結果に期待ができません。
その場合は、pdfに埋め込まれている画像を取り出すか、物体検知をするかで画像用のDBか検索インデックスを作成する方が望ましいです。
マルチモーダルRAGの回答フロー
今回は2種類のマルチモーダル検索について、入力の種類を考慮し、4つの処理フローを考えます。
従来のRAGとの違いは2つあります。
- ユーザーの入力クエリがテキストと画像の2種類に増えたこと
- 回答生成に検索結果のテキストと画像が使えること
これらのアルゴリズムは、先ほど紹介した検索アルゴリズムの選択理由を理解したうえで、問題設定によって使い分けていくことが重要です。 また、従来のRAGのテクニックを適用することでより高度な処理が可能になります。
Azure GPT-4V を用いたマルチモーダルRAGの要点
マルチモーダルRAGの実行には大きく3つの処理を実行します。 インデックスの作成、クエリに対する検索、GPT-4Vによる回答の生成です。
①インデックスの作成
インデックスの作成部分は既に紹介したため、割愛します。
②異なるクエリに対する検索
検索クエリはテキストと画像の2種類が考えられます。 それぞれ検索するまでの処理を示します。
テキストクエリの場合、検索までのデータ処理は以下になります。
画像クエリの場合、検索までのデータ処理は以下になります。
検索がマルチモーダル埋め込みだけなのか、ハイブリッド対応させるかで利用する処理が変わります。 またそれぞれの変換に対して、従来のRAGで利用されるクエリの前処理を入れることでより検索精度が高まることが期待されます。
③GPT-4Vによる回答の生成
最後に検索結果から回答を生成するフローを紹介します。
回答生成に検索結果の画像を使うべきか
ユーザーの質問が、検索フィールドのテキストに書かれていない情報を期待する場合、検索結果の画像を回答に使うことが望ましいです。 ただし、参照情報に画像を入れてGPT-4Vに推論させると回答生成時間が遅くなります。
回答に検索結果の画像を全て渡すべきか
回答の生成に検索した画像を全てGPT-4Vに渡しても、GPT-4Vは画像とファイル名の対応が取れないため、混乱が生じ精度低下に繋がる恐れがあります。 そのため、ユーザーに検索結果からQAで使うデータを絞り込んでもらう方がよいかもしれません。
まとめ
このコラムでは、Azure AI SearchとGPT-4Vを活用したマルチモーダル検索とマルチモーダルRAGを紹介しました。 紹介した技術は、様々な業界での課題解決や情報検索の質の向上に貢献すると期待されます。 GPT-4Vの登場により、これまでにない形で情報を活用できるようになりました。 まさに、今が新たな可能性を探る模索期間です。たくさんのトライ&エラーを重ね、生成AIのビジネスへの適応範囲を拡大していきましょう。
以上になります。最後まで読んで頂きありがとうございます。
筆者
AIソリューショングループ
太田真人