Amazon Bedrock の Advanced parsing でRAGの品質が上がった話

記事タイトルとURLをコピーする

サーバーワークスの村上です。

2024年7月に Amazon Bedrock のナレッジベースに登場した新機能である Advanced parsing に関するブログです。

aws.amazon.com

そもそもナレッジベースとは?という方は以下のブログもご参照ください。

blog.serverworks.co.jp

RAGの検索前処理における課題

これまでナレッジベースを使ってRAGを構成していた場合の課題を2点挙げます。

表形式のレイアウトが崩れる

体感ですが、これまでも表の解釈はある程度できていました。サーバーワークスのお客様の前で、RAGのデモをする機会は何度もありましたが、ドキュメント内の表に関する質問をしても正しく回答できていたことが多かったです。

ただし実際、表形式のドキュメントは裏側で、下図のように表の体裁が崩れてインデックス化されています。

表のレイアウトが失われ、見出しの順番が変わるなどしている

よって複雑な表では、誤った回答を生成してしまうなどの事象が起きていました。

画像などの非テキスト情報が失われる

ドキュメント内にある画像は、インデックス化される時点で情報が失われていました。

Amazon Titan Multimodal Embeddings G1 などのマルチモーダルな埋め込みモデルを使えば、画像も検索可能なベクトルに変換することが可能ですが、ナレッジベースではサポートされていません(ブログ執筆時点)。

そのため、画像やテキストとして認識できない文字(スキャンしたPDFなど)は、ナレッジベースでは検索できないという課題がありました。

画像は検索できない

Advanced parsing とは

Advanced parsing とは検索対象ドキュメントをインデックス化する前に、生成AIを使ってドキュメントを解釈しやすいように変換する機能です。

  • マークダウン形式に変換(見出しや表の解釈性が向上)
  • 画像情報は自然言語で説明を作成し、検索可能な状態にする

Advanced parsingを使うとこうなる

先ほど掲載した画像では、見出しや表のレイアウトが崩れていました。

Advanced parsingを使うと下記のように、見出しや表がマークダウン形式に変換されインデックス化されるので、明らかに解釈性が向上しているのが分かります。

見出しや表の解釈性が向上

また、画像についても説明文を作成し、その情報を検索可能にしてくれます。

画像も検索できる

設定方法

データソース作成時に設定可能です。

注意点

  • 一度データソースを作成すると後から変更はできません。
  • Advanced parsingに対応しているのはPDFのみです。
  • Advanced parsing使用時に生成AIを利用するので、その分の料金も必要です

Prerequisites for your Amazon Bedrock knowledge base data - Amazon Bedrock

使用されるプロンプト(カスタマイズ可能)

Advanced parsing時に使用する基盤モデルとプロンプトはカスタマイズ可能です。

基盤モデルはClaude3 SonnetまたはClaude3 Haikuが選択可能です。

プロンプトは下記のとおりです。デフォルトのままでもある程度使えますが、Provide a detailed description in natural languageProvide a detailed description in Japaneseとかにカスタマイズしても良いかと考えます。

パース時に使用されるプロンプト(クリックして展開できます)

Transcribe the text content from an image page and output in Markdown syntax (not code blocks). Follow these steps:

  1. Examine the provided page carefully.

  2. Identify all elements present in the page, including headers, body text, footnotes, tables, visualizations, captions, and page numbers, etc.

  3. Use markdown syntax to format your output:

    • Headings: # for main, ## for sections, ### for subsections, etc.
    • Lists: * or - for bulleted, 1. 2. 3. for numbered
    • Do not repeat yourself
  4. If the element is a visualization

    • Provide a detailed description in natural language
    • Do not transcribe text in the visualization after providing the description
  5. If the element is a table

    • Create a markdown table, ensuring every row has the same number of columns
    • Maintain cell alignment as closely as possible
    • Do not split a table into multiple tables
    • If a merged cell spans multiple rows or columns, place the text in the top-left cell and output ' ' for other
    • Use | for column separators, |-|-| for header row separators
    • If a cell has multiple items, list them in separate rows
    • If the table contains sub-headers, separate the sub-headers from the headers in another row
  6. If the element is a paragraph

    • Transcribe each text element precisely as it appears
  7. If the element is a header, footer, footnote, page number

    • Transcribe each text element precisely as it appears

Output Example:

A bar chart showing annual sales figures, with the y-axis labeled "Sales ($Million)" and the x-axis labeled "Year". The chart has bars for 2018 ($12M), 2019 ($18M), 2020 ($8M), and 2021 ($22M). Figure 3: This chart shows annual sales in millions. The year 2020 was significantly down due to the COVID-19 pandemic.

Annual Report

Financial Highlights

  • Revenue: $40M
  • Profit: $12M
  • EPS: $1.25

| | Year Ended December 31, | | | | 2021 | 2022 | |-|-|-| | Cash provided by (used in): | | | | Operating activities | $ 46,327 | $ 46,752 | | Investing activities | (58,154) | (37,601) | | Financing activities | 6,291 | 9,718 |

Here is the image.

パース時に使用されるプロンプト(クリックして展開できます)※機械翻訳

画像ページからテキストコンテンツを転記し、Markdown構文で出力します(コードブロックではありません)。以下の手順に従ってください:

  1. 提供されたページを注意深く調べる。

  2. ヘッダー、本文、脚注、表、視覚化、キャプション、ページ番号など、ページに存在するすべての要素を特定する。

  3. マークダウン構文を使用して出力をフォーマットする:

    • 見出し: 見出し:#はメイン、##はセクション、###はサブセクションなど。
    • リスト: 箇条書きは*または-、番号付きは1.2.3.
    • 繰り返さない
  4. 要素が視覚化の場合

    • 自然言語で詳細な説明を記述する
    • 説明を提供した後、視覚化のテキストを書き写さないでください。
  5. 要素がテーブルの場合

    • マークダウン・テーブルを作成し、すべての行が同じ数の列を持つようにします。
    • セルの整列はできるだけ維持する
    • 表を複数の表に分割しない
    • 結合されたセルが複数の行または列にまたがる場合は、左上のセルにテキストを配置し、その他のセルには「'」を出力します。
    • 列の区切り文字には|を、見出し行の区切り文字には|-|-|を使う。
    • セルに複数の項目がある場合は、別々の行にリストする。
    • 表にサブヘッダがある場合は、サブヘッダとヘッダを別の行で区切る。
  6. 要素が段落の場合

    • 各テキスト要素を正確に書き写す。
  7. 要素がヘッダー、フッター、脚注、ページ番号の場合

    • 各テキスト要素を出現する通りに正確に書き写す。

出力例

Y軸を「売上高(百万ドル)」、X軸を「年」とラベル付けした、年間売上高を示す棒グラフ。このチャートには、2018年(1,200万ドル)、2019年(1,800万ドル)、2020年(800万ドル)、2021年(2,200万ドル)の棒グラフがある。 図3:このチャートは年間売上高を百万単位で示している。2020年はCOVID-19のパンデミックにより大幅に減少している。

年次報告書

財務ハイライト

  • 売上高:4,000万ドル
  • 利益:1,200万ドル
  • EPS:1.25ドル

| 12月31日締め | | 2021 | 2022 | |-|-|-| | キャッシュ・フロー | | | | 営業活動|46,327ドル|46,752ドル|投資活動|(58,154ドル | 投資活動 | 財務活動|6,291|9,718||です。

イメージはこんな感じ。

Advanced parsing でRAGの品質が上がった話

実際にあった例ですが、以下のようなドキュメントを検索する際に、ハルシネーションが多発していました。

  • 複数の表が隣接し、前提条件によって参照すべき表が異なる
  • かつ高度なドメイン知識が要求されるドキュメントである(業界の専門用語が頻出するなど)

原因を分析すると、以下2つに大別できました。

  • 参照すべき表を検索できていない
    • または、表周辺の文章(タイトルや注釈など)と、表自体が異なるチャンクに属しており、片方のチャンクしか検索できていない
  • 参照すべき表を検索できていても、誤った回答をしている(おそらく表が複雑なため)

ここにAdvanced RAGの階層的チャンキングと、今回ご紹介したAdvanced parsingを導入することでハルシネーションを低減することができました。

blog.serverworks.co.jp

まとめ

Advanced parsingによりドキュメントの表や画像などをより正確に解釈することができ、RAGの品質を上げることができます。

こういった機能を簡単に導入できるのはAWSの良いところですね。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp