ちょっと話題の記事

Claude3を使って人間が読むようにパワポ資料を読み込んでみる

2024.03.06

はじめに

新規事業部 生成AIチーム 山本です。

ChatGPT(OpenAI API)をはじめとしたAIの言語モデル(Large Language Model:以下、LLM)を使用して、チャットボットを構築するケースが増えています。通常、LLMが学習したときのデータに含まれている内容以外に関する質問には回答ができません。そのため、例えば社内システムに関するチャットボットを作成しようとしても、素のLLMでは質問に対してわからないという回答や異なる知識に基づいた回答が(当然ながら)得られてしまいます。

この問題を解決する方法として、Retrieval Augmented Generation(以下、RAG)という手法がよく使用されます。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれた文章を検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。

以前の記事では、社内のドキュメント情報に関してQAできるチャットボット(Slackアプリ)を構築した際の、構成方法や試してみての知見や課題についてまとめました。

RAGの実案件に取り組んできた今までの知見をまとめてみた | DevelopersIO

「DEIM2024」でチュートリアルの登壇をしました | DevelopersIO

この記事では、課題の内の1つである「人間のようにドキュメントを読む」ために、Claude3を使ってみた結果について説明します。

RAGを実際に使用する時の課題

RAGそのものについては、多くの研究がされていて、知見・プラクティスがあります。ドキュメントの検索や生成AIの使い方について、検索や回答の精度を上げるための工夫が様々あります。

しかし、実際の状況では、その前段階に課題(取り組むべき作業が多い状態)があります。具体的には、ドキュメント自体が整備されていることが少なく、研究用のデータセットのように整っていないことがほとんどで、以下の2点が大きな問題です。

  • 課題1:ドキュメントが意図しない読み込まれ方になってしまう。ドキュメントは人間が読んでわかるように作られているが、データをそのまま読み込むとわかりにくいテキストになってしまう
  • 課題2:人間が使う情報に比べて情報量が少ない。ドキュメントには書かれない前提や、社内特有の知識などが存在するため、ドキュメントの中身だけでは必要な情報が足りない

(上記の1つ目のページ中の「課題3-2-1」や「課題3-2-2」や、2つ目のページの資料中の「実際にやってみての課題」が該当する内容です)

課題1の例

例えば、Amazon Kendraを基本的な設定で使った場合、ドキュメントは以下のように読み込まれます。

PowerPointファイルの場合

テキストの順序がおかしくなることがある

PDFファイルの場合(ヘッダ・フッタ部分)

PDFファイルの場合(表部分)

画像がある場合

読み込まれない

原因の一部はデータの読み込み方(読み込む対象をどうするか)の問題で、ローダを自作すれば対処できる点もあります。しかし、そもそもデータの順序や構成が人間の意図とは異なっていて、単純な方法では対処は難しい点が大きな問題です。

今回やったこと

以下では、パワーポイントを例として、人間が読む順序のように、かつ、画像部分も何らかのテキストとして読めるようにすることを目標とします。AWSのマネジメントコンソールで、Amazon Bedrockを使い、パワーポイントのスクリーンショットを画像として読み込ませてみました。

BedrockでClaude3を有効化する

BedrockのモデルアクセスでAnthropic Claude 3 Sonnetを有効化しました(5分くらい待ちました)。詳しくは、suzukiさんの記事に書かれているので、こちらをご覧ください。

Anthropic Claude 3 の画像処理をBedrockで試してみた | DevelopersIO

Bedrockのプレイグランドにアクセスする

Bedrockのプレイグランドにチャットにアクセスしました。「モデルを選択」ボタンを押し、表示されたウィンドウでAnthropicの「Claude 3 Sonnet v1」を選択し、「適用」ボタンを押しました。

画像をアップロードし文字起こしさせる

「Image」ボタンを押して画像をアップロードし、続けてプロンプトを入力しました。(創造的な出力は不要なため)パラメータの「温度」は0に設定しました。

プロンプトは以下のテキストを使いました。(今回用に簡単に作成したものです。本格的にやる場合は、Claudeのプロンプトガイドに合わせて、構成などを凝った方が良いと思います)

これはパワーポイントファイルのスクリーンショットです。文字起こしして、markdown形式で出力してください。出力は、'''などで囲わず、markdownのみ出力してください。人間が認識するような順番・親子関係としてheadingしてください。写真やフロー図・構成図などがスクリーンショット内部に含まれている場合は、内容を説明して[]で囲ってテキストとして出力してください。オブジェクトや図形の説明などは不要です。このスクリーンショットは画像ですが、スクリーンショット自体の説明は不要です

使用データ

画像は以下の2つを使いました。画像の解像度はそれぞれ、863x628・1315x906でした(そこまで大きなサイズではないと思います)。

例1:オブジェクトがたくさんあるスライド

例2:画像が含まれているスライド

結果

2つの画像で試した文字起こしの結果と料金について説明します。

文字起こし

プレイグランドでの出力結果は以下のとおりでした。

例1

文字が正しく起こされていて、順序や親子関係も妥当なもので、箇条書きも正しいとして良さそうです。

# 経済産業省のMission

## 日本経済・国民の暮らしを豊かにする

### 産業政策
- 人工知能、IoT、ヘルスケア
- データ活用、中小企業
- 産業構造・・・

### 通商・貿易
- EPA、TPP、インフラ輸出
- 新興国戦略、ルール形成
- 戦略・・・

### 資源・エネルギー
- 電力自由化、新エネ・省エネ
- 原発、資源外交・・・

### 手段
- 経済成長
- 産業競争力の強化
- イノベーション
- 世界の富の取り込み
- エネルギー安定供給

### 目的
- 社会課題の解決
  Ex.少子高齢化、貧困問題、
  世界の不安定化
- 豊かな社会の実現

例2

文字が正しく起こされていて、また、画像部分の説明も含まれています。

# 活気ある職場・働きやすい環境 1

## 職場風景
[オフィスの様子が写っている。複数の人が机を囲んで作業をしている。]
[3人の男女がパンフレットを見ながら話し合っている。壁には絵画が掛かっている。]

## 働きやすい職場環境
- テレワーク ※29FYは延べ7,000人以上が実施。中央省庁では最多。
- ペーパーレス ※4年で37%削減
- フレックス
- 風通しのよい職場 (職員意識調査:職場満足度77割以上)
- 様々な研修制度 (年間100回以上の勉強会の開催など)

[2台のノートPCが写っている。]

個人PC:軽量で持ち運びが容易

料金

Bedrockのページには、Claude 3 Sonnetの料金に関する情報がありませんでしたので、今回はAnthropicのページに掲載されている料金で計算してみます。(そのため、実際のAWSの利用料と異なる可能性があります)

言語を日本語に設定していたため情報がなかったのですが、言語をEnglishに変更するとClaude 3 Sonnetの料金の情報が掲載されていました(2024/03/07追記)。料金はAnthropicのAPIを直接使用する場合と同じでした。

https://aws.amazon.com/jp/bedrock/pricing/

https://www.anthropic.com/api#pricing

これらのページによると、以下の料金がかかります。(MTokは、100万トークンのことです)

  • 入力:$3 / MTok
  • 出力:$15 / MTok

チャットを実行すると、画面下の「モデルメトリクス」に消費したトークン数が表示されました。

これをもとに計算すると、トークン使用料は以下のような料金になりそうです。(1ドル150円換算)

例1:

  • 入力:937トークン x $3.00 / 1M token = 0.42円
  • 出力:278トークン x $15.00 / 1M token = 0.62円
  • (合計):1.04円

例2:

  • 入力:1775トークン x $3.00 / 1M token = 0.79円
  • 出力:242トークン x $15.00 / 1M token = 0.54円
  • (合計):1.33円

この程度の料金であれば、百枚近くスライドがあるパワーポイントファイルでも、1ファイルあたり100円程度で処理できそうです。

まとめ

マルチモーダルなモデルを使ってドキュメントを読み込む方法をためしました。具体的には、Claude3 sonnetを使い、パワーポイントのスクリーンショットを読ませてみました。単純なプロンプトでも、かなり精度良く読み取ることができ、簡単に使うことができました

冒頭に挙げた課題1に対して、人間が読むために書かれたドキュメントは(人間の目のような)マルチモーダルなモデルを使って読み込ませる、という方法が一つの解決手段になりそうです。ただし、機械的な方法と違って、コストが高くなってしまう点には注意が必要そうです(が、そこまで高い料金ではないので、どんどん使って、ドキュメントをデータとして整えていく方がメリットが大きい良いのかなと思います)。

今後

PowerPointのようなスライド資料は、スクリーンショット画像を入力することで読み込めそうことがわかったので、PDF・Word・ExcelについてもClaude3(のようなマルチモーダルなモデル)を使って、人間のように読み込めないかを試してみようと思っています。

また、Kendraにこの処理を組み込みために、KendraのCustom Document Enrichmentという前処理用の機能を使って、自動的に前処理させる構成を作ってみたいです。(そのためには、パワーポイントファイルをスクリーンショットとして画像に変換し、画像ごとにBedrockのAPIをコールする、という処理をLambdaに実装する必要がありそうです)

補足

他のモデルと比べて

GPT4VやGeminiのような画像に対応したモデル(マルチモーダルなモデル)使っても、同様にドキュメントをテキストに起こすことができました。ただし、今回使った資料で、今回使ったのと同様な簡単なプロンプトで試したところ、少し文字を読みミスすることがありました。例えば、「世界の富の取り込み」が「世界の"高"の取り込み」と読まれてしまうケースがありました。今回、Claude3を使いましたが、(結果の1枚目のスライドを)一回ですべての文字を間違うことなく認識することができました。

他のドキュメントも使い、プロンプトもモデルごとにエンジニアリングして比較する(=フェアな比較をする)必要がありますが、Claude3の方が読み取りの精度が良さそうな印象です。

文字起こしを補助する方法

Claude3でも文字を起こし間違えてしまう可能性はありそうです。この問題に対しては、他の手法を組み合わせる方法が良さそうです。テキスト部分をプログラム的に(ドキュメントローダなどを使って)読み込んでおき、プロンプトに読み込んだテキスト情報を書いて、それをもとに文字起こしするように指示する、といった方法です。

また、画像ファイルやテキストが画像になってしまっているPDFファイルなどの場合には、OCRを組み合わせる方法も利用できます。例えば、AzureのGPT4Vでは、Vision Enhancementという機能があり、従来のOCR機能を持つAIを前処理として利用することで、読み取りミスを減らし、文字起こしの精度を上げる、という方法が紹介されています。

https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/gpt-with-vision#enhancements