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('変換完了')
"
機能比較表
| 比較項目 | LlamaParse | Unstructured | Marker |
|---|---|---|---|
| 表抽出精度 | ✅ 最高 | ✅ | ✅ |
| セルフホスト | △(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 |