はじめに
GenAI(生成AI)プロジェクトやRAG(検索拡張生成)システムを構築する際、データのクレンジングと準備はとても重要なステップですよね。でも実際には、企業の内部ドキュメントがきれいなテキスト形式になっていることはほとんどありません。
複数列のPDF、複雑な表が含まれるレポート、プレゼンテーションのスライド、さまざまなマルチメディアデータなどに頻繁に遭遇します。一方で、大規模言語モデル(LLM)が最も効率よく処理できるのは、構造化されたきれいなテキストデータです。特にMarkdown形式は、見出しタグ(#)、リスト(-)、表(|---|)があるおかげで、LLMが文脈を正確に把握でき、トークンの節約にもつながります。
最近、このデータ抽出の課題を解決するために、オープンソースコミュニティで2つの注目ツールが話題になっています。IBMのDoclingとMicrosoftのMarkItDownです。どちらも多様なドキュメント形式をMarkdownに変換することを目指しています。この記事では、インテグレーションエンジニアの視点から、機能と動作の仕組みを詳しく分析し、皆さんのプロジェクトにぴったりのツールを選ぶためのヒントをお届けします!
背景 / 課題(どうしてPDFの処理はそんなに複雑なの?)
2つのツールを評価する前に、そもそもPDFの処理がなぜ難しいのか、その根本的な理由を見ていきましょう。PDF形式は主に印刷や、さまざまなデバイス上でピクセル単位の座標を正確に表示するために設計されています。表のセルなのか、どの列に属するテキストなのかといった「論理的な構造」を保持せず、単にX・Y座標で文字の集まりを保存しているだけなんです。
この変換パイプラインを手作業で作ろうとすると、通常は以下のような対応が必要になります。
- テキスト読み取りライブラリを使用する(ただし、空白でおかしくなったり、列に沿った読み取り順序が崩れたりしがちです)。
- OCRやCV(コンピュータビジョン)のツールを使って、表の領域や各要素の枠を認識させる。
- ロジックに基づいてレイアウトを考慮し、データを再構築して結合する。
DoclingとMarkItDownは、まさにこうした面倒な作業をすっきりと自動化・簡略化するために開発されたツールなんです。
Docling - 深く入り込むドキュメント分析のスペシャリスト
Doclingは、IBMが開発したオープンソースプロジェクトです。このツールは、ローカル環境で確固たる論理構造を維持しながら、複雑なドキュメントを処理するように上手く設計されています。
主な機能と特徴
- VLM(視覚言語モデル)アーキテクチャ: Granite VLMやHeronのような、軽量かつ効果的なモデルをローカルで動かすことで、外部のAPIに依存せずにレイアウトを認識します。タイトル、列のフロー、フッター、さらには専門的な数式までしっかり識別してくれます。
-
多様なフォーマットへの柔軟な抽出: 最終的な出力はMarkdownが基本ですが、内部では
DoclingDocumentという中間構造を持っています。ここから、構造を完全に維持したJSON(lossless JSON)や、DocTags形式に出力することも可能です。 - AIエージェント・エコシステムとの統合: 導入時からMCP Serverが用意されており、LangChain、LlamaIndex、Haystackと直接連携できます。
- 安心の強力なセキュリティ: ドキュメント処理は完全にローカルのランタイム環境や社内Docker内で完結します。データが社外のネットワークに送信されることはないので、機密情報を扱う場合でも安心ですね。
ワークフローの流れ
Doclingの処理の流れ:
| ステップ | コンポーネント | 役割 |
|---|---|---|
| 1 | 入力ドキュメント | まだ構造が定まっていない生のドキュメント(PDF、DOCX、画像など)を受け取ります。 |
| 2 | DocumentConverter | 全体の処理ライフサイクルを管理し、設定を行うナビゲーターの役割を果たします。 |
| 3 | TextとLayoutの並行処理 | ローカルAI(VLM)を使って領域の構造を認識しつつ、並行して元のテキストを抽出します。 |
| 4 | DoclingDocument | テキスト座標とレイアウト構造を、標準化された1つのデータセットにまとめ上げます。 |
| 5 | エクスポート | 外部のシステムを一切呼ばずに、きちんと整理された順序で目的のフォーマット(Markdown、JSON、DocTags)で出力します。 |
インストールと使ってみる
pip install docling
技術レポート(PDF)を処理する簡単なPythonの例です:
from docling.document_converter import DocumentConverter
converter = DocumentConverter()
# URLやローカルのファイルパスを渡すことができます
result = converter.convert("https://arxiv.org/pdf/2408.09869")
markdown_output = result.document.export_to_markdown()
print(markdown_output)
パフォーマンスとリソースについて: Doclingはマシン内でVLMプロセスを実行するため、比較的スペックの高いハードウェア(AVX命令セットをサポートしているPCや、GPU搭載機)が推奨されています。数百ページのPDFを分析する場合、マシンの性能によっては数十秒から数分かかることがあります。
DoclingをサポートするUIツールのご紹介
コードを書くよりも、使いやすいGUIを使いたいという方のために、Doclingには拡張UIのエコシステムが用意されていますよ。
-
docling-serve: DoclingをAPIサービスとして展開するためのツールです。
pip install "docling-serve[ui]"でインストールし、--enable-uiフラグをつけて実行すると、すぐにGradioベースのWeb UIが立ち上がります。 - docling-ui: オープンソースのデスクトップアプリ(React & Electron製)です。ドラッグ&ドロップでスムーズに、かつ完全なオフライン環境で変換作業ができます。
- Open WebUI統合: 人気が高い汎用AIプラットフォームであるOpen WebUIの中で、標準のドキュメント抽出エンジンとしてDoclingを設定・組み込むことも可能です。
MarkItDown - 複数の変換タスクをこなす、身軽でフレキシブルなツール
パソコン内のローカル処理にこだわるIBMのアプローチとは対照的に、Microsoftから提供されているMarkItDownは、超軽量なコアモジュールを作り、重い画像解析などはサードパーティのLLM APIに直接委譲(おまかせ)する、というアプローチをとっています。
主な機能と特徴
-
圧倒的な処理スピードと多様なフォーマット対応: PDFやDOCXはもちろん、
.zipの展開からの情報抽出、.csvレポートの読み取り、さらにYouTube動画の文字起こし(トランスクリプト)取得まで幅広く対応しています。 -
OCRの外部委託(Delegated OCR): デバイスのハードウェアに重いLLMやVision解析の負担をかけないのがMarkItDownの特徴です。テキストレイヤーのないスキャン画像などを読み取る際は、OpenAI経由の
gpt-4oAPIや、専門の Azure Document Intelligence 環境に接続して処理を行うオプションが用意されています。 - システムユーティリティのように簡単導入: コンパクトに独立してパッケージ化されているため、CLIやBashを通じてシステムの自動化プロセスに簡単に組み込めます。
ワークフローの流れ
MarkItDownの処理の流れ:
| ステップ | コンポーネント | 役割 |
|---|---|---|
| 1 | 多様な入力 | Officeファイル、メディアへのリンク、Webページなど、幅広い素材を受け入れます。 |
| 2 | MarkItDown Core | ローカルで処理するか、ネットワーク上のAPIに委譲するかを判断・振り分けするナビゲーターの部分です。 |
| 3 | ローカル処理 (Fast Data) | AIモデルを使わず、軽量なパーサーでWord、Excel、圧縮ファイルなどからテキストを抽出します。 |
| 4 | API委任 (Heavy Data) | スキャンされた画像認識をLLM Visionに任せたり、音声/動画データの処理をWeb経由で実施したりします。 |
| 5 | エクスポート | 各階層からのデータをまとめ上げ、綺麗で読みやすいMarkdownとして完成させます。 |
インストールと使ってみる
用途に合わせて、必要に応じたプラグイン(PDFやYouTubeなど)と一緒にインストール可能です。
pip install 'markitdown[all]'
コマンドラインインターフェース(CLI)を使って以下のように簡単に実行できます:
# stdin/stdoutともスムーズに連携できます
cat path-to-file.pdf | markitdown > output.md
Python APIを使って、スキャンされた画像を含むドキュメントにGPT-4oを適用する場合:
from markitdown import MarkItDown
from openai import OpenAI
# OPENAI_API_KEY の環境変数が必要です
md = MarkItDown(
enable_plugins=True,
llm_client=OpenAI(),
llm_model="gpt-4o"
)
result = md.convert("annual_report_with_charts.pdf")
print(result.text_content)
セキュリティとコストについて: MarkItDownで外部のLLM/Vision APIをOCRなどに活用する場合、画像内の情報がOpenAIやAzureの環境とやり取りされることになります。社外秘のドキュメントや、法的な要件が厳しい社内データを扱う場合は、APIのコスト面だけでなく、セキュリティ基準に合致するか慎重にご判断をお願いします。
MarkItDownのためのWeb UIツール
Microsoftは公式なWeb UIを出しておらずCoreコンポーネントに注力していますが、コミュニティから素晴らしいWeb UIのエコシステムがいくつも誕生しています。簡単に導入できるものをご紹介しますね。
- lesteroliver911/microsoft-markitdown-streamlit-ui: Streamlitベースのプラットフォームで、OpenAIキー(GPT-4oモデルなど)を設定し、画像のスキャンや解析がシームレスに行えます。
- mrnithesh/mark-it-down: こちらもStreamlitベースの軽量なWebアプリで、変換結果をプレビュー(Live Preview)できる機能がとても人気です。
- CleverCloud/markitdown-converter: モダンなドラッグ&ドロップインターフェースを備え、ファイルとリンク先のURLの両方に対応しています。バックエンドはFastAPIベースでサクサク動作します。
スペック比較まとめ
2つのツールのアーキテクチャのアプローチと、それぞれの長所・課題を以下の表にまとめました:
| 分類基準 | Docling (IBM) | MarkItDown (Microsoft) |
|---|---|---|
| コアアーキテクチャの哲学 | データセキュリティを重視し、ローカルVLM処理に大きく投資。 | 軽量なコア設計。複雑なファイルの分析はLLM APIに接続して委譲する。 |
| データ分析時のセキュリティ | 非常に高い。完全にオフライン(Air-gapped)な環境でも運用可能。 | ファイルの画像などをクラウドサーバーに送るため、外部APIのポリシーに依存する。 |
| 表やLaTeX数式の精度 | 非常に安定している。複雑な表レイアウトや数式の構造まで正確に抽出可能。 | 実用レベルだが、精度は接続先のVision APIモジュールに依存する。 |
| メディア形式の抽出サポート | 主に文書ファイルや学術レポート、分析データなどのフォーマットに特化。 | MP3、ZIP展開、Web HTML、YouTubeの字幕など、非常にカバー範囲が広い。 |
| ハードウェアとリソース要件 | RAMやハードウェアの処理能力を相応に求めるが、APIの従量課金は不要。 | 小さな機材でもテキスト処理はスムーズ。Visionを使う場合はAPIの従量課金が発生する。 |
まとめ
結局どちらを使えばいいの?と迷うかもしれませんが、実際のプロジェクト要件に合わせて選択するのがベストです。具体的なおすすめポイントをご紹介しますね!
-
Docling がおすすめなケース
- 複雑な表や学術的なレイアウトが含まれたレポート、論文などのドキュメントを大量に処理するRAGシステムを構築する。
- 会社のデータポリシーなどで機密保持が厳しく、サードパーティのクラウドにファイルを送信することが許可されていない。
- ローカル(オンプレミス)専用の抽出エンジンとして機能できるだけのサーバーリソースが準備可能である。
-
MarkItDown がおすすめなケース
- XLSXやText、ZIP、MP3、HTML、YouTube動画まで、とにかく幅広いフォーマットに対応したデータの汎用抽出フローを作りたい。
- サーバー上のCLIコマンドなどを通じて、パイプラインの中へ処理モジュールを素早く手軽に組み込みたい。
- すでにAzureやOpenAIといったLLM APIのアカウントを持っており、一般的なテキストファイルの超高速な処理を優先したい。
現場での活用アイデア: 実際の規模の大きい業務環境では、2つを組み合わせて使うのも効果的です! まずは MarkItDown を前処理フィルターとし、シンプルなテキスト(txt、Word、粗いExcel)を超高速で捌きます。そして、複数列に分かれた複雑な構成のスキャンPDFなどに遭遇した場合に、元のレイアウト構造をしっかり保つために Docling にルーティングしてあげる、という工夫もアリですよ。