🦔

LLM時代の整形職人──MarkItDown徹底ガイド

に公開

はじめに

ChatGPT や Claude、Ollama など、生成系AIを活用したワークフローが急速に一般化してきました。

そこで必ず立ちはだかるのが「素材」の問題。PDF、Word、画像、音声──世の中の大半のドキュメントは、LLMが直接扱うには少々骨が折れる形式です。

そんな状況を「すべてMarkdownに整形する」というアプローチで解決しようとしているのが、Microsoft製のOSSライブラリ「MarkItDown」。

この記事では、そのアーキテクチャ、変換対象フォーマット別の詳細、拡張の仕組みまでを一気に解説します。


なぜMarkdownがLLMと相性が良いのか?

  • 構造を保ったまま記述可能:見出し・リスト・表などの構造が明確に保たれる。
  • トークン効率が高い:HTMLやリッチテキストに比べて軽量。
  • 学習との整合性が高い:多くのLLMがMarkdown形式で訓練されている。

構造・可読性・サイズ──この三拍子が揃っているMarkdownは、まさにLLMにとって“母語”のような存在です。


MarkItDownの変換アーキテクチャ

MarkItDownは以下の3段階で各種ファイルをMarkdown化します:

  1. 中間形式(HTMLやDataFrameなど)へ変換
  2. 独自のmarkdownifyロジックでMarkdownへ整形
  3. 画像や音声など足りない情報はLLMで補完

この構造により、幅広い入力形式を安定して処理できる柔軟性と拡張性が実現されています。

実装の中心ファイル:core/_markitdown.py


対応フォーマット別の処理

PDF

  • pdfminer.six によるテキスト抽出
  • レイアウトはヒューリスティック解析
  • OCRは未対応(画像PDFには事前処理が必要)

Word(.docx)

  • mammoth によるHTML化
  • Markdownifyで整形
  • 画像にはLLMによるキャプション生成を挿入可能

PowerPoint(.pptx)

  • python-pptx でスライド構造を抽出
  • タイトルを#、本文をリストとして変換
  • 表はHTML→Markdownへ変換

Excel(.xlsx)

  • pandas.read_excel() + DataFrame.to_markdown() による整形

画像(JPEG/PNGなど)

  • Pillow + exifread によるメタデータ抽出
  • OCRにpytesseract を使用
  • LLMを用いた画像キャプション生成で ![caption](path) を挿入

音声(MP3/WAV)

  • speech_recognition を介してWhisperやGoogle Speech APIで書き起こし
  • タイムスタンプ付きのMarkdownへ整形

その他

  • HTML / CSV / JSON / XML / EPUB / YouTube字幕なども対応

導入と基本の使い方

CLI

pip install 'markitdown[all]'
markitdown myfile.pdf -o output.md

Python API

from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("document.docx")
print(result.text_content)

公式使用例:GitHub README


MarkItDown MCPサーバー:APIとして使う

CI連携やRAGパイプラインでの活用を想定する場合は、サーバーモードが便利です。

pip install markitdown-mcp
markitdown-mcp  # localhost:5000 で起動
curl -F "file=@slide.pptx" http://localhost:5000/convert > slide.md

MCP実装:markitdown_mcp


フォーマット変換器を自作するには?

MarkItDownの変換器は DocumentConverter を継承して実装されており、非常にシンプルです。

from markitdown.core import DocumentConverter

class MyFormatConverter(DocumentConverter):
    def convert(self, stream):
        html = some_library.to_html(stream)
        markdown = self.markdownify(html)
        return self.result(markdown)

抽象基底クラス:core/_base.py


現状の制限と今後の展望

  • PDFの段組や複雑なレイアウト再現には弱い
  • PDF内画像のOCRは未実装(画像単体には対応)
  • 音声認識は外部APIに依存

今後はAzure Document Intelligence連携や、プラグインによる拡張エコシステムが注目されています。


まとめ

「まずはMarkdownに変換してから渡す」──それがLLMとの付き合い方の基本。

MarkItDownは、

  • 多彩なファイル形式を自動でMarkdownに整形し、
  • LLMやRAGとの連携を前提に設計されていて、
  • 拡張やサーバー化も容易

という三拍子そろった“整形職人”。

まずは pip install 'markitdown[all]' で触ってみてください。あなたの資料整理とAI活用が、ぐっと加速するはずです。


関連リンク

Discussion