Bedrock Knowledge BaseのFoundation Model Parsingを使ってマルチモーダルRAGを構築する

# はじめに

noteの書いた記事 [生成AIでサポートチームをサポート 〜 チャットボットで業務効率化へ 〜](https://note.com/revsystem/n/n7376731aa266) では、Backlogヘルプセンターのページ のHTMLをもとにRAGを構築し、サポートチームの支援を行うチャットボット作成した取り組みを紹介しました。このとき構築したRAGはHTML内のテキストデータのみを扱うものでした。そのため、スクリーンショットや図が中心でテキストが少ないページが検索にヒットせず、RAGを構築するには情報量が十分ではないという結果になりました。その後、 [Amazon Bedrock Converse APIとTool useで実現するAdvanced RAG: クエリ拡張によるBacklogヘルプセンターの検索](https://qiita.com/revsystem/items/b819633c16bdb133a182) などの記事でテキスト検索の手法を工夫し、少しでも検索と回答精度を向上を狙ってみました。
その後、スクリーンショットや図に含まれる情報も検索対照に加えてヘルプセンター内の情報を幅広く検索する方法、かつマネージドで扱える方法がないかを探っていたところ、Bedrock Knowledge BaseのFoundation Model Parsingを使ったマルチモーダルRAGが求めているものだと気づいたので、紹介します。

Foundation Model Parsingを使ったマルチモーダルRAGを構築すると、このような処理が行われるようです。

- LLMがドキュメントに含まれる画像のテキスト化
- テキスト化されたデータをベクトルデータベースに保存
- ユーザーの質問に対して、ベクトルデータベースから関連するデータを検索
- 検索結果と元画像データを使って回答を生成

# 参考情報

Foundation Model Parsingがどのようなものかは、AWS Japan Solutions Architectの方の記事に詳しい解説があります。

https://qiita.com/kondo-k/items/1564c72540de3fb791d1

上記の記事の内容を含む、動画が [AWS Innovate Generative AI + Data](https://aws.amazon.com/jp/events/aws-innovate/apj/aiml-data/) の'T3-1: RAG の実装で直面する課題とその解決 ～Amazon Bedrock Knowledge Base で加速させるビジネス価値～'で公開されています。

# Foundation Model Parsingを使ったRAGの構築

ここでの設定はナレッジベース構築後に変更できないので、既存のナレッジベースを使わず `Create knowledge base with vector store`から新規に作成します。

![Create knowledge base with vector store](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/2bc0075a-78ee-4e2d-8595-b7f171691bf0.png)

## Parsing strategy

データソースは S3 を選択します。Configure data source 画面にある Parsing strategy で `Foundation models as a parser` を選択し、foundation model for parsingは `Claude 3.5 Sonnet v1`もしくは`Claude 3 Haiku v1`のいずれかを選択します。画面は us-east-1 のものです。リージョンによっては Amazon Bedrock Data Automation as parser がない場合があります。

![Parsing strategy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/9e8f4679-d2f7-4036-bba0-db2666bdb1b4.png)

## Vector database

今回の検証では、Pinecone を使用しました。参考にした記事では OpenSearch Serverless を使用しているようでした。

![Vector database](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/22ce58ab-08b8-4c5d-908a-f1a53ff44ec5.png)

## Multimodal storage destination

Multimodal storage destinationは、ドキュメントから抽出された画像を保存するS3バケットを指定します。これは、PDFなどに含まれる画像を抽出して保存するためのバケットです。今回の検証では画像ファイル単体でRAGを構築するので、元の画像がそのままこのバケットに保存されることになります。
**RAG用のドキュメントが入っているS3バケットとは異なるもの**を指定します。同じS3バケットを指定するとナレッジベースの構築でエラーになります。

このバケットの作成は必須ではありませんが、作成しないと画像がS3バケットに保存されないため回答生成時に画像が利用されません。

> Knowledge bases for Amazon Bedrock will create a folder in this S3 location, including ones extracted from documents, from your data source. These images are retrieved based on the user query, used to generate responses, and will be cited in the response.

> Amazon Bedrock のナレッジベースは、データソースのドキュメントから抽出されたナレッジベースを含むフォルダーをこの S3 の場所に作成します。これらの画像は、ユーザークエリに基づいて取得され、応答の生成に使用され、応答で引用されます。

![Multimodal storage destination](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/26911a88-50ec-4424-83b8-e9f9de2a6a7f.png)

## データソースの作成

Backlogヘルプセンターの記事をもとにデータソースを作成します。ここでは、 [進捗をチェックしよう！](https://support-ja.backlog.com/hc/ja/articles/360035961413) の記事をもとにデータソースを作成します。
前述の note に書いたように、ページ内のサイドバーやフッターなどヘルプコンテンツに不要なものは除外したHTMLファイルを作成します。そして、本文内にあるスクリーンショットや図など画像をとともにS3バケットに保存します。

## 検索

「ガントチャートに並んでいる項目を教えて。」という質問に対して、以下のような回答が返ってきました。期間が誤っているものの、件名や担当者名を正しく読み取っていることがわかります。元画像は解像度が低く文字が読みにくい部分もありますが、日本語テキストを問題無く読み取っています。
> ガントチャートには以下の項目が表示されています：1.市場ニーズを調査する（担当者：三宅 彩 期間：2019/08/01 - 2019/08/04）2.予算計画を作成する（担当者：三宅 彩 期間：2019/08/05 - 2019/08/08）また、ガントチャートには表示開始日（2019/08/01）、表示範囲（6ヶ月）、グルーピング（なし）、状態（すべて）などの設定項目があります。ガントチャートは「何を」「つまでに」やるのかを直感的に把握出来るツールで、期限日までに課題を処理することが重要なプロジェクトで使用されます。

![ガントチャートについて質問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/3619b2df-daec-43ea-bb14-593063ad4b8b.png)

次に、「カテゴリごとの状態の割合はどうなっていますか?」という質問をしてみました。カテゴリ名や割合、状態が正しく読み取れていることがわかります。途中で切れていて見にくいですが、x-amz-bedrock-kb-description には画像をテキスト化した内容がMarkdown形式になっていることが読み取れます。
> カテゴリごとの状態の割合は以下のようになっています：- 仕様: 42% 完了- デザイン: 50% 完了 - レビュー: 100%完了 - 開発33%完了 これらの数値は各カテゴリの総数に対しての完了課題数の割合を示しています。グラフでは各カテゴリの課題の状態（完了、進行中、未開始など）が色分けされて表示されています。

![カテゴリごとの状態の割合について質問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/8d9c6190-1059-4cf5-8daf-490087e63c00.png)

# まとめ

Foundation Model Parsingを使ったマルチモーダルRAGは、画像をテキスト化してベクトルデータベースに保存することで、画像を含むドキュメントを幅広く検索できるようになります。
スクリーンショットやスキャンした画像をPDF化したものなど、画像を含むドキュメントの検索や回答生成に応用できると考えられます。
Google NotebookLMを使えばマルチモーダルRAGを手軽に構築できますが、AWSに閉じた環境で同様のRAGを構築したい場合に有用ではないでしょうか。