テキストと埋込みイメージを持つPDFファイルに対してのRAG構成

この記事の内容

  • PDFファイル内のテキストと埋め込み画像の両方を対象にRAGを構成する方法を解説します
  • 使用するAzureサービスは Azure OpenAI Service、Azure AI Search、Azure Blob Storage、Azure Functions です
  • Azure Functions がPDFのアップロードをトリガーにテキストと画像を分割・関連付けして処理します
  • Azure AI Search がインデックスを作成し、テキストと画像の関連性を保ったまま検索可能にします
  • GitHubにサンプルアプリケーションが公開されており、自分のドキュメントでも試せます

はじめに

RAGを活用する際、対象のドキュメントがPDFである場合、テキストだけでなく画像も埋め込まれているケースが多くあります。この場合、テキストと画像の関係性を維持したまま両方を正しく扱うことは、単純なテキストのみのRAG構成と比べて難易度が上がります。

本記事では、PDFファイル内に埋め込まれた画像とテキストの両方を扱うRAG構成の方法について解説します。


使用するAzureサービス

今回のソリューションでは以下のAzureサービスを使用します。

  • Azure OpenAI Service — テキストのベクトル化(エンべディング)とレスポンス生成
  • Azure AI Search — ベクトルインデックスの作成と検索
  • Azure Blob Storage — PDFファイルや処理済みデータの保存
  • Azure Functions — PDFアップロードをトリガーにした処理の自動実行

システム全体のアーキテクチャ

システムの処理の流れは以下のとおりです。

  1. PDFのアップロード — テキストと画像が混在するPDFドキュメントをAzure Blob Storageにアップロードして保存します。

  2. Azure Functionsによる処理 — PDFがアップロードされたイベントをトリガーとしてAzure Functionsが起動します。Functionsは大きなPDFをチャンクに分割し、テキストと画像を適切に処理します。処理されたデータはAzure Blob Storageに保存されます。

  3. Azure AI Searchによるインデックス作成 — Azure AI SearchがBlob Storageに対して定期的にインデックスを作成しに行きます。この際、Azure OpenAI Serviceを使用してテキストをベクトル化し、インデックスに反映します。

この流れにより、テキストと画像の関係性を保ったままインデックスが構築されます。


アプリケーションの処理フロー

チャットボットアプリケーション側の処理の流れは以下のとおりです。

  1. クライアント(ブラウザ等)からAIチャットボットアプリケーションに対してクエリを送信します。
  2. アプリケーションはそのクエリをAzure OpenAI Serviceに渡します。この段階で、必要に応じてコンテンツの安全チェックなどを組み込むことができます。
  3. Azure OpenAI ServiceはAzure AI Searchに対して検索を実行し、回答に必要な情報を取得します。
  4. 取得した情報を元にレスポンスを生成し、アプリケーションに返します。この際、引用データも合わせて返されます。
  5. アプリケーションはLLMからの出力を元に、テキストや画像のURLを含むレスポンスをクライアントに返します。

クライアント側では回答を受け取りつつ、その回答の元となったテキストや画像を参照・ダウンロードすることも可能です。また、ユーザーからのフィードバックを取得して保存する仕組みをオプションとして追加することもできます。


Blob Storage内のデータ構造

Azure Blob Storage内は以下のような構造でデータが保存されます。

  • コンテナ内に処理済みデータが格納されます
  • テキストデータは JSON形式 で保存されます
  • 各ページに対応する 画像ファイル が保存されます
  • ページ番号を含めた形で画像とテキストが対応付けられています

Azure Functionsの処理詳細

Azure FunctionsはPDFがアップロードされるたびに呼び出され、Azure AI Searchがインデックスを作成する前にドキュメントを前処理します。具体的な処理内容は以下のとおりです。

1. テキストチャンクへの分割

PDFを複数のテキストチャンクに分割します。実装上はページ単位での分割に相当します。

2. JSONファイルの作成

分割された各チャンクに対応するJSONファイルを作成します。

3. 画像の抽出とマッピング

PDFから画像を抽出し、対応するテキストチャンクにマッピングします。同じページで見つかった画像は、そのページのテキストチャンクに関連付けられます。

これにより、テキストと画像の関係性を維持したまま、データがBlob Storageに保存されます。


Azure AI Searchのインデックス設定

Azure AI Search側では、テキストと画像それぞれのフィールドを定義し、適切にマッピングを行います。これにより、インデックス内でテキストと画像の関連性が保持された状態でデータが格納されます。


サンプルアプリケーションの試し方

GitHubに以下のリポジトリでサンプルアプリケーションが公開されています。サンプルではAKSのドキュメントの一部がデモデータとして使用されています。

リポジトリには詳細な説明も記載されており、実際にデプロイして動作を確認できます。

自分のドキュメントで試す場合

自分のPDFドキュメントでRAGを試したい場合は、リポジトリ内の該当セクションに手順が記載されています。ヘルパースクリプトを使用してPDFをアップロードできます。

# ヘルパースクリプトを使用したPDFアップロードの例
# ※ドキュメント記載のコマンドに誤りが含まれている可能性があります
# リポジトリ内のヘルパースクリプトを直接確認してください

注意: ドキュメント内に記載されているコマンド例にタイポが含まれている可能性が指摘されています。ヘルパースクリプト自体を直接確認して実行することをお勧めします。

テスト後のクリーンアップ

テスト完了後は、リポジトリのクリーンアップセクションに記載されている手順に従ってリソースを削除してください。不要なAzureリソースを残さないよう注意しましょう。


まとめ

本記事では、テキストと埋め込み画像が混在するPDFファイルに対してRAGを構成する方法を解説しました。

ポイントをまとめると以下のとおりです。

  • Azure Functions がPDFアップロードをトリガーにテキストと画像を分割・関連付けする前処理を担います
  • Azure Blob Storage にテキスト(JSON形式)と画像をページ単位で関連付けて保存します
  • Azure AI Search がBlob Storageを対象にインデックスを作成し、Azure OpenAI Service でベクトル化することでセマンティック検索が可能になります
  • アプリケーションはテキストだけでなく画像も含めた回答を返すことができます

GitHubのサンプルリポジトリとドキュメントを合わせて参照することで、実際の動作を確認しながら理解を深めることができます。自分のドキュメントへの差し替え手順も用意されていますので、ぜひ試してみてください。