powered by TechFeed
表示モード
Deep Dive

AIがPDFを正しく読むには「Markdown変換」が鍵だった — テーブル構造や見出し階層を保持する理由とその限界

10月9日、LlamaIndexが「Markdown Is All You Need: Parsing Docs for AI」と題した記事を公開した。「PDFからテキストを全部抜けばいい」という直感に反し、プレーンテキスト抽出では不十分であり、Markdownによる構造保持こそが精度の鍵だという逆説的な知見が示されている。AIによるドキュメント解析においてMarkdownが事実上の標準出力フォーマットとなっている理由と、その実装上の判断・限界について詳しく解説されている。

10月9日、LlamaIndexが「Markdown Is All You Need: Parsing Docs for AI」と題した記事を公開した。「PDFからテキストを全部抜けばいい」という直感に反し、プレーンテキスト抽出では不十分であり、Markdownによる構造保持こそが精度の鍵だという逆説的な知見が示されている。AIによるドキュメント解析においてMarkdownが事実上の標準出力フォーマットとなっている理由と、その実装上の判断・限界について詳しく解説されている。


なぜ出力フォーマットが正確さを左右するのか

PDFからすべてのテキストを抽出しても、それが使い物にならないケースがある。値や文字列が正しくても、「どのテーブルのどの列に属する値か」という文脈が失われれば、モデルはその関係性を推測するしかなくなる。

この問題の核心は出力フォーマットにある。ドキュメント検索・抽出においては、見出し階層・読み順・テーブル構造・各要素の前後文脈を保持する必要がある。さらに、何かおかしいときに人間が読んで確認できる形式であることも重要だ。

LlamaIndexは、自社のドキュメントパーサー「LlamaParse」において、Markdownを標準出力フォーマットとして採用している。その判断の根拠と、Markdownだけでは対応できないケースへの対処法が本記事で解説されている。


Markdownが保持できる構造

ほとんどのドキュメントは、見出し・段落・リスト・テーブルの組み合わせで構成されている。Markdownはこれらを過不足なく表現できる。

  • 見出しレベル(##など)がセクションとサブセクションの関係を保持する
  • リストがステップや入れ子の項目をまとめる
  • シンプルなテーブルが行と列の対応を明示する
  • リンクがテキストと参照先を結びつける

この構造はドキュメントパイプライン全体で活用できる。チャンク分割(RAGの前処理)では見出しをセクション境界として使い、セクションタイトルを各チャンクに引き継げる。また、モデルが誤った回答を出したとき、開発者がパース済みテキストを読んで「問題がパース時に起きたのか、検索時か、生成時か」を切り分けられる。

フォーマットのオーバーヘッドも小さい。見出しを##で表現すれば、型・スタイル・座標を持つオブジェクトとしてラップするよりもトークン数を抑えられる(ただし実際の削減量はドキュメントと比較対象のフォーマットに依存する)。

加えて、LLMはMarkdownをプロンプト文脈で扱いやすいという側面もある。GPTやLlamaをはじめとする主要なモデルは、事前学習においてGitHubやドキュメントサイト等からMarkdown形式のテキストを大量に学習している。そのため、Markdown構造を含むプロンプトは、プレーンテキストよりも見出しやテーブルの意味をモデルが正確に解釈しやすいと考えられる。※編集部の考察


複雑なテーブルはHTMLで補う

Markdownのパイプテーブルには表現力の限界がある。典型例が複数列・複数行をまたぐセル(colspan/rowspan)だ。

たとえば、2年分の業績を示す財務レポートで、年度ラベルが「Revenue」「Margin」の2列にまたがるケースを考える。素直にMarkdownへ変換すると次のようになる:

| Segment  | FY2026  |        | FY2025  |        |
|----------|---------|--------|---------|--------|
|          | Revenue | Margin | Revenue | Margin |
| Americas |         |        |         |        |
| Cloud    | 1,240   | 34%    | 1,050   | 31%    |
| Services | 610     | 18%    | 590     | 17%    |

人間が読めば意味はわかるが、「FY2026がRevenueとMarginの両方にかかる」という関係がフォーマット上は明示されていない。2行目のヘッダーはデータ行として表現され、Americasのグループ化は空行を解釈することで初めて成立する。

この問題に対してLlamaParseは、HTMLテーブルをMarkdown内に埋め込むアプローチを取る。colspanで複数列にまたがるヘッダーを、rowspanで複数行にまたがるセルを、<thead>でヘッダー行グループを表現できる。LlamaParseはパイプテーブルとHTMLテーブルの両方をMarkdown出力でサポートしている。

ただし、HTMLで表現できるのは「パーサーが正しく読み取った関係性」だけだ。HTMLが関係性を保証するわけではない、とLlamaIndexは明示している。


JSONはどこで使うか

JSONはドキュメント要素とそのメタデータを格納したり、アプリケーションへ抽出フィールドを返したりするのに適している。財務データの抽出なら、次のようなレコードが欲しいケースがある:

{
  "segment": "Cloud",
  "region": "Americas",
  "fiscal_year": "FY2026",
  "revenue": 1240,
  "margin_pct": 34
}

LlamaIndexが推奨するのは、まずMarkdownに変換し、中間表現として保持してからJSONを生成するフローだ。複数の下流タスクが同じコンテンツを必要とする場合、パース済みMarkdownを使い回せるため、ドキュメントから直接抽出するより柔軟性が高い。


画像とレイアウト情報の扱い

テキスト変換だけでは情報が失われるコンテンツもある。チャートは抽出した値と説明文、図表は空間的な関係を説明するために元画像そのものが必要になることがある。

ページ番号やバウンディングボックス(ページ上の矩形領域を示す座標情報)は、引用やハイライト表示に役立つ。LlamaIndexは「LiteParse visual grounding」として、Markdownの各要素を元ページ上の位置と対応づける取り組みも進めている。


実際に試す際のポイント

LlamaParseで試す際、LlamaIndexは「よく知っているドキュメントを使い、パース済みテーブルを目視確認せよ」と強調している。各値が正しいヘッダー・単位・脚注を持っているかを確認することが、出力の実用性を判断する最も確実な方法だ。見た目が整っているかどうかは関係ない。

詳細はMarkdown Is All You Need: Parsing Docs for AIを参照していただきたい。