AI

PDF Intelligence比較:LlamaParse vs Unstructured vs Marker でPDFをRAGに活用する

オープンソースラボ編集部2026年6月14日

PDF Intelligence比較:LlamaParse vs Unstructured vs Marker でPDFをRAGに活用する

PDF・論文・請求書・契約書からテキスト・表・図表を高精度に抽出してLLMのRAGシステムに活用するPDF解析(Document Intelligence)ツールが急速に進化しています。LlamaParse(LlamaIndex製・高精度)・Unstructured(OSS・多フォーマット対応)・Marker(GPU高速・Markdown変換)の3つが2026年のPDFインテリジェンスデファクトスタンダードです。

PDF Intelligenceツールを使う理由

  • RAG品質向上: 単純なPDFテキスト抽出の低精度(表・図表・数式の文字化け)を解消してRAGの回答精度を大幅改善
  • 非構造化→構造化: 請求書・契約書・決算書からキーバリューペアを自動抽出してデータベースに格納
  • 大量バッチ処理: 数千件のPDF(論文・マニュアル・報告書)を自動パースしてナレッジベースを構築
  • Markdown変換: PDFの複雑なレイアウト(マルチカラム・表)をLLMが読みやすいMarkdown形式に変換

主要ツールの概要

LlamaParse

2024年公開(LlamaIndex)、Pythonベースです。最高品質のPDF→Markdown変換で複雑な表・数式・図表のキャプション抽出に特化した有料SaaSサービスです。無料枠(1日1000ページ)が提供されており、LlamaIndex・LangChainとシームレスに統合できます。

# LlamaParse + LlamaIndex でPDFをRAGに活用
import os
from llama_parse import LlamaParse
from llama_index.core import VectorStoreIndex
from llama_index.core.node_parser import MarkdownElementNodeParser

# LlamaParse 設定(環境変数にAPIキーを設定)
os.environ['LLAMA_CLOUD_API_KEY'] = 'llx-your-key'

parser = LlamaParse(
    result_type='markdown',       # 'text' | 'markdown'
    num_workers=4,                # 並列処理数
    verbose=True,
    language='ja',                # 日本語PDF
    parsing_instruction='''
        このPDFは技術仕様書です。
        表はMarkdownテーブルとして出力してください。
        図表のキャプションは[図N: 説明]形式で記述してください。
    ''',
)

# PDFをパース
documents = parser.load_data('technical_spec.pdf')
print(f'パース完了: {len(documents)}ページ')

# Markdown内の表・コードブロックを意識したノード分割
node_parser = MarkdownElementNodeParser(
    llm=None,
    num_workers=8,
)
nodes = node_parser.get_nodes_from_documents(documents)
base_nodes, objects = node_parser.get_nodes_and_objects(nodes)

# ベクターインデックスを作成してRAGクエリ
index = VectorStoreIndex(base_nodes + objects)
query_engine = index.as_query_engine(similarity_top_k=5)

response = query_engine.query('仕様書の最大動作温度は何度ですか?')
print(response)
# バッチPDFパース(複数ファイルを並列処理)
import asyncio
from pathlib import Path
from llama_parse import LlamaParse

async def parse_pdf_batch(pdf_dir: str, output_dir: str):
    parser = LlamaParse(result_type='markdown', num_workers=8)

    pdf_files = list(Path(pdf_dir).glob('**/*.pdf'))
    print(f'{len(pdf_files)}件のPDFをパース開始')

    async def parse_single(pdf_path: Path):
        try:
            docs = await parser.aload_data(str(pdf_path))
            output_path = Path(output_dir) / f'{pdf_path.stem}.md'
            output_path.write_text('

'.join(d.text for d in docs), encoding='utf-8')
            return {'file': pdf_path.name, 'pages': len(docs), 'status': 'ok'}
        except Exception as e:
            return {'file': pdf_path.name, 'status': 'error', 'error': str(e)}

    results = await asyncio.gather(*[parse_single(f) for f in pdf_files])
    ok_count = sum(1 for r in results if r['status'] == 'ok')
    print(f'完了: {ok_count}/{len(pdf_files)}件')
    return results

asyncio.run(parse_pdf_batch('pdfs/', 'outputs/'))

Unstructured

2022年公開、Python製のOSSです。GitHubスター11k+。PDF・Word・Excel・PowerPoint・HTML・メールなど30種類以上のドキュメント形式を統一APIで処理できるフレームワークです。ローカルモード(OSS)とAPI版の両方を提供します。

# Unstructured: PDF→構造化要素(表・タイトル・本文・リスト)に分解
from unstructured.partition.pdf import partition_pdf
from unstructured.staging.base import convert_to_dict
from unstructured.cleaners.core import clean_extra_whitespace
import json

def parse_pdf_to_elements(pdf_path: str) -> list[dict]:
    '''PDFを構造化要素に分解'''
    elements = partition_pdf(
        filename=pdf_path,
        strategy='hi_res',            # 'hi_res' | 'fast' | 'auto'
        infer_table_structure=True,   # 表構造を推論
        extract_images_in_pdf=True,   # 画像を抽出
        extract_image_block_types=['Image', 'Table'],
        languages=['jpn', 'eng'],     # OCR言語
    )
    result = []
    for element in elements:
        element_dict = {
            'type': type(element).__name__,  # Title / NarrativeText / Table / Image / etc
            'text': clean_extra_whitespace(str(element)),
            'metadata': {
                'page_number': element.metadata.page_number,
                'coordinates': element.metadata.coordinates,
            },
        }
        # 表要素はHTMLテーブルとして取得
        if hasattr(element, 'metadata') and element.metadata.text_as_html:
            element_dict['html'] = element.metadata.text_as_html
        result.append(element_dict)
    return result

elements = parse_pdf_to_elements('contract.pdf')
tables = [e for e in elements if e['type'] == 'Table']
print(f'検出要素: {len(elements)}個(表: {len(tables)}個)')

# FastAPIエンドポイントとして提供
from fastapi import FastAPI, UploadFile, File
import tempfile

app = FastAPI()

@app.post('/parse')
async def parse_document(file: UploadFile = File(...)):
    with tempfile.NamedTemporaryFile(suffix=file.filename, delete=False) as tmp:
        tmp.write(await file.read())
        elements = parse_pdf_to_elements(tmp.name)
    return {'elements': elements, 'count': len(elements)}

Marker

2023年公開、Python製のOSSです。GitHubスター22k+。GPUを使って高速にPDFをMarkdownに変換するOSSツールです。数学記号・数式(LaTeX変換)・コードブロックの検出が優れており、論文PDFの処理に特に強みがあります。

# Marker のインストールと使用
pip install marker-pdf

# 単一PDF変換
marker_single paper.pdf --output_dir outputs/ --languages Japanese,English

# バッチ変換(GPU使用)
marker_chunk_convert pdfs/ outputs/ --workers 4 --langs Japanese,English

# Pythonから呼び出す
python -c "
from marker.convert import convert_single_pdf
from marker.models import load_all_models
models = load_all_models()
text, images, metadata = convert_single_pdf('paper.pdf', models, langs=['Japanese'])
with open('output.md', 'w') as f:
    f.write(text)
print('変換完了')
"

機能比較表

比較項目LlamaParseUnstructuredMarker
表抽出精度✅ 最高
セルフホスト△(API)
多フォーマット△(PDF/img)✅ 30種+
数式変換
無料枠1000p/日OSS無制限OSS無制限

PDF Intelligenceはデータソースとして活用し、LLM Toolsカテゴリ/categories/llm-toolsのQdrant・Weaviateなどのベクターデータベースにチャンクを投入してRAGパイプラインを完成させます。DevOpsカテゴリ/categories/devopsのAirflow・n8nで「新規PDF検知→パース→Embedding→ベクターDB投入」を全自動化するデータパイプラインを構築します。

FAQ

Q. 日本語PDFの文字化けを防ぐベストプラクティスは?

A. OCRモード(hi_res)を使用して日本語フォントを正しく処理します。Unstructured: partition_pdf(strategy='hi_res', languages=['jpn', 'eng'])でTesseract OCRが日本語を正確に認識。前提条件: pip install unstructured[pdf] pytesseractとTesseractをインストール(apt-get install tesseract-ocr tesseract-ocr-jpn)。LlamaParse: language='ja'を設定するとLlamaIndexのサーバーサイドで日本語最適化処理を行います。Marker: --languages Japanese,Englishで日本語・英語混合PDFを処理。デジタルPDF(テキスト埋め込み)はOCRなしで高速処理できますが、スキャンPDF(画像のみ)はOCRが必須です。

Q. 請求書・契約書から特定フィールドを自動抽出するには?

A. UnstructuredでPDF要素を抽出→LLMで構造化データに変換するパターンが効果的です。実装: ①Unstructuredでpartition_pdfしてテキスト要素を取得②要素テキストをClaude API(claude-sonnet-4-6)に渡して「以下のテキストから請求金額・支払期限・振込先を抽出してJSON形式で返してください」③JSONをパースしてデータベースに保存。専用ツール: Dockling(IBM製OSS・docx/pptx/pdf→Markdown)・Docsumo(商用・インボイスOCR)・LLM-Sherpa(OSS・ドキュメント構造認識)も選択肢です。精度向上: Few-shot例(正解入力→正解出力)をプロンプトに含めるとLLMの抽出精度が大幅に向上します。

Q. 大量のPDF(1万件以上)を効率的にバッチ処理するには?

A. Celery + Redisのタスクキュー + 複数Workerで並列処理します。アーキテクチャ: ①FastAPIエンドポイントでPDFをS3にアップロードしてCeleryタスクを発行②CeleryワーカーがS3からPDFをダウンロードしてUnstructured/Markerで処理③処理結果(Markdownテキスト)をS3に保存してPostgreSQLにメタデータを登録④完了後にEmbedding生成→ベクターDB投入のタスクを連鎖発行。スループット目安: GPU(RTX 3090)でMarkerを使うと1分あたり10〜30ページ処理可能。1万件×平均20ページ=20万ページを約7時間で処理できます。

Q. PDFから画像・図表を抽出してマルチモーダルLLMに渡すには?

A. Unstructuredで画像要素を抽出してClaude Visionで説明を生成します。手順: ①partition_pdf(extract_images_in_pdf=True, extract_image_block_output_dir='images/')で画像をファイルに保存②各画像ファイルをbase64エンコードしてClaude API(Visionモード)に渡して「この図を説明してください」③生成された説明テキストを元のPDFテキストに挿入④テキスト全体をチャンク分割してベクターDBに投入。利点: チャート・回路図・組織図など画像の内容がテキスト検索で発見可能になる。モデル: claude-sonnet-4-6は画像1枚あたり$0.003〜0.01程度でコスト効率が高いです。

まとめ

ユースケース推奨ツール
高精度テーブル・数式・RAG品質最優先LlamaParse
セルフホスト・多フォーマット・FastAPI統合Unstructured
GPU高速バッチ・論文PDF・Markdown変換Marker

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。