はじめに
こんにちは、Insight Edgeでソフトウェアエンジニアをしている田島です。 入社から1年と少しが経過し、一貫して、生成AI関係のプロジェクトに携わっています。 その中の1つとして、RAGの精度向上のための施策をしており、ドキュメント解析のライブラリを開発したので、その内容について紹介します。
RAGの精度向上
はじめにRAGとは、Retrieval-Augmented Generationの略で、検索結果を元に文章を生成する技術を指します。 プライベートなドキュメント情報を比較的容易にLLMに入力できるため、多くのケースで活用されています。 実際にInsight Edgeでも、RAGを用いた複数のアプリを住友商事グループ向けに提供しており、その精度向上のために様々な施策をしています。 LLMのロングコンテキスト化している現在においても、データソースが大規模であるケースや精度面の利点などから、依然としてRAGの重要度は高いです。
RAGの精度向上には、おおまかに検索結果性能と生成部の質向上の2つの改善手法があります。 検索結果性能の向上には検索エンジンの改善やデータソースへのメタデータ付与、 生成部の質向上にはプロンプトエンジニアリングや エージェントアーキテクチャの採用 などの施策が考えられます。 ここでは前者の中でも元データの前処理に関する施策について紹介します。
問題:検索が困難なデータソース
マルチモーダルLLM の登場により、RAGの検索対象となるデータソースは多様化しています。 画像をマルチモダールLLMに入力することで、画像に関する情報を自然言語で抽出することが可能になりました。 ただし、前段で検索にヒットさせる必要は依然あり、検索が困難な場合は上述のご利益を享受できません。
一般的に、データソースが非構造化データ(PDFやWordなど)の場合は、テキスト抽出したものを検索対象にすることが多いです。 ただし、レイアウト情報が複雑なPDFや、画像だけで構成されたPDFでは、単純なテキスト抽出だけでは不十分な場合が多くあります。
※ 2025/1時点で画像とテキストの両方を同一のベクトルにする方法多くはありません。
ドキュメント解析ライブラリの開発
Insight Edgeでは住友商事グループの様々な業種向けに技術支援しており、個々のドメインに対するドキュメント処理が必要になります。 一方で、ドメインごとに技術開発をするリソース確保は難しく、汎用的に利用できるドキュメント解析ライブラリを開発する必要がありました。
ライブラリの想定ユースケース
ドキュメント解析ライブラリのユースケースは以下になります。
- データソースが大規模でRAGが必要となるケース
- データソースに図表やフローチャートなどの非構造データが含まれ、OCRのみでは対応できないケース
ドキュメント解析ライブラリ「Exparso」
📑 対応ドキュメント
本ライブラリでは以下のドキュメントをPDF化した上で、マルチモーダルLLMによる解析をします。 今後、HTMLや動画ファイルなどの対応も予定しています。
コンテンツタイプ | 拡張子 |
---|---|
📑 ドキュメント | PDF, PowerPoint, Word |
🖼️ 画像 | JPEG, PNG, BMP |
📝 テキストデータ | テキストファイル, Markdown |
📊 表データ | Excel, CSV |
インストール
以下でライブラリをインストールします。
※現在は開発中のため、PyPIには公開していません。弊社プライベートレポジトリのみの公開となります。
pip install exparso
Officeドキュメントを解析するために libreoffice
をインストールしておく必要があります。
# Ubuntu sudo apt install libreoffice # Mac brew install --cask libreoffice
使い方
コードは以下のように利用します。model
はLangChainの BaseChatModel
を継承したクラスを指定し、 context
は解析対象のドキュメントに関する説明を入力します。
from exparso import parse_document from langchain_openai import AzureChatOpenAI llm_model = AzureChatOpenAI("gpt-4o") text = parse_document( path="path/to/document.pdf", model=llm_model, context="このドキュメントは..." )
対応LLM
マルチモーダルLLMの実行方式はLLMによって異なるため、BaseChatModel
を継承したLLMにおいても限られたモデルのみに対応しています。
- AzureChatOpenAI, ChatOpenAI
- ChatVertexAI
- ChatAnthropic, ChatAnthropicVertexAI
アルゴリズム
アルゴリズムで現時点では簡易的なもので、ページ毎に以下のフローでドキュメントを解析します。

ドキュメント種別の判別
ドキュメントのプロパティを取得し、テキストのみの場合は次のページの処理に進みます。 利用トークンの節約のために画像を圧縮したうえで、マルチモーダルLLMによる判別をします。 各プロパティに即したプロンプトを生成し、マルチモーダルLLMに入力します。
- 言語
- グラフ
- テーブル
- 画像
ページテキストの読み込み
ドキュメントのメタ情報を含むコンテキスト情報と、ドキュメントのプロパティを反映したプロンプトを作成します。 このプロパティとページ内容をマルチモーダルLLMに入力し、ページ内容を取得します。
以下、プロンプトの例です。
あなたは画像から文書を読み取る専門家です。与えられた画像の内容を正確に書き起こしてください。 ## Constraints - ユーザーが文章を入力します。ドキュメントをより正確にするために修正してください。 - 画像に存在しない内容は回答しないでください。 - Document Type はデータを読み込むときの参考情報として提供されます。 - Document Context はドキュメントの参考情報として提供されます。 ## Document Type ### Text - 画像内のすべてのテキストを正しく抽出してください。 ### Flowchart - フローチャートの情報を説明してください。 - フローチャートをMermaid形式に変換してください。 - 出力にフローチャートの概要を追加してください。 #### Example - Input: ケーキ作りのプロセスを示すフローチャート。 - Output:このフローチャートはケーキ作りのプロセスを示しています。 (略)
コンテキスト情報の更新
読み込んだテキスト内容から、コンテキスト情報を更新します。 トークンの節約のため、内容が5-7文程度に収まるようにしています。
評価
ライブリの評価フローも構築しており、以下のフローでLLM-as-a-Judgeにて評価します。
- ライブラリの出力をコンテキスト情報として、質問に対する回答を取得
- 回答を正解データと比較し、評価結果を取得

評価データセット
データセットは以下の属性を持つデータ群(PDFファイル)を用いています。
属性 | 詳細 |
---|---|
フローチャート | 手順書、アルゴリズム設計書 |
グラフ | 棒グラフ、円グラフ、折れ線グラフ |
テーブル | 単純テーブル、結合テーブル |
要OCRテキスト | 手書きテキスト、非構造テキスト、デジタルデータのスクリーンショット |
フローチャートとテーブルの例を以下に示します。


参考:
- 【フローチャートの例】出典:営業時間短縮に係る 感染拡大防止協力金 - 東京都(https://www.town.nishiaizu.fukushima.jp/uploaded/attachment/7016.pdf)
- 【テーブルの例】出典:デジタル社会の実現に向けた重点計画(https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/5ecac8cc-50f1-4168-b989-2bcaabffe870/b24ac613/20230609_policies_priority_outline_05.pdf)
質問データセット
質問内容は一問一答&クローズド形式とし、1つのデータセットにつき複数の質問を用意します。 現在は手動で作成していますが、将来的には自動で生成する予定です。これにより、任意のデータ群に対して、容易に評価を行えるようになります。
ex. Q. フローチャートにおけるAからBへの矢印の意味は? A. APIリクエスト ex. Q. テーブルの中でも最も身長が高い人物は? A. Aさん
ベンチマーク対象
- Azure Document Intelligence
- pymupdf4llm : pymupdfを用いたドキュメント抽出ライブラリ、OCR対応はなし
- docling:ドキュメント解析ライブラリ、テーブル抽出に強み、日本語OCRは非対応
結果
以下は Exparso
を gemini-1.5-pro-002
で実行した結果です。データセットの属性毎に、正解率を示しています。

結果から、以下のような特徴が確認できした。
- フローチャートやカラフルな図表などのハイコンテキストなデータを読み込み
- 折れ線グラフや円グラフのテキスト化
一方で以下に課題がある状況です。
- 紙面に情報量が大きい場合の出力安定性
- マルチモーダルLLMのトークン節約
今後の展望
Exparso
は、今後も機能追加や精度向上を目指す予定です。その上で、OSS化を進める予定です。
OSS化について
2025年1月現在、本ライブラリはInsight Edge社内のプライベートレポジトリに配置し利用を限定していますが、OSS化を検討しています。 OSS化することで他社や個人の方にも活用してもらい、多くのフィードバックを得られると考えています。 実際にMicrosoftも 同様のライブラリ をOSSとしてリリースしており、SNS上で大きな反響が確認されました。 さらに、コミュニティ運営を正しく行うことで、Insight Edgeの採用や会社の認知度向上にも繋がると考えています。
近日OSSとしてリリースする予定なので、ご興味がある方はぜひ開発への参加やFBをいただけると幸いです。