中級 11 分ドキュメント

ローカルでDeepSeek-OCR:PDFを読む スキャン済み

DeepSeek-OCRは約30億パラメーターのビジョンモデルで、MITライセンスで公開されており、ページ画像をMarkdownを含む構造化テキストに変換するよう設計されています。このガイドでは、Ollamaを使ってdeepseek ocrをローカルで動かす方法、必要なランタイムのバージョン、確保すべきメモリ容量、スキャンしたPDFをページに分割してRAGで利用できるMarkdownを取得する方法を説明します。最後に、より単純なツールのほうが適しているケースも取り上げます。

著者 Léa B.·更新 2026-10-07·Windows・macOS・Linuxでテスト済み

#従来型OCRではなくDeepSeek-OCRを使う理由

スキャンしたPDFにはテキストがなく、テキスト画像だけが含まれています。Tesseractのような従来のOCRエンジンは、そこから生の行を抽出しますが、ブロックが見出しだとは認識できず、表を崩し、2段組みページの読み取り順も失います。DeepSeek-OCRはこの問題を別の方法で処理します。これは視覚言語モデルで、ページ全体を見たうえで、見出し、リスト、表、数式を含むMarkdownを直接生成します。

このモデルはDeepSeekによって2025年秋に公開され、「Contexts Optical Compression」という題名の記事が添えられました。中心となる考え方は、ページに含まれる数千のテキストトークンの代わりに、解像度モードに応じて64から400個の少数の視覚トークンでページを表現することです。提供元は、圧縮率が十未満にとどまる場合、デコード精度は約97%になると発表しています。これは提供元自身のデータセットで測定した提供元の数値であり、私たちの数値ではありません。ここで特に押さえておきたいのは、このモデルが用途に対して軽量かつ高速だという点です。

ローカルで使う場合、重要なのは三つです。モデルがエントリークラスのグラフィックカードに収まること。そのままRAGパイプラインでインデックス化できるMarkdownを出力すること。そしてOllamaのライブラリで利用できることです。これにより、公式リポジトリが要求するPyTorch、Flash Attention、vLLMのインストールを避けられます。完全な仕様はモデルページにあります:https://quelllm.fr/modele/deepseek-ocr

#想定しておくべき前提条件とメモリ

ローカルRAGキット

あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。

  • 永久に利用できるオンラインスペース
  • PDF + ファイル
  • 生涯アップデート

サイトのモデルカードには、精度ごとのVRAMの目安が示されています。8 192トークンのコンテキストでは、Q4で約2 GB、Q8で4 GB、FP16で6 GBです。実際にダウンロードする重量は、Ollamaがタグに何をパッケージしたかによって異なります。ライブラリのタグページにはファイルサイズが表示されており、こちらが基準になります。これにコンテキスト用メモリも加わります。密度の高いページをMarkdownに変換すると、数千トークンの出力になることがあります。

NVIDIA GPU
8 GB以上のカードなら快適に使えます。RTX 3060 12 GBまたはRTX 4070 12 GBなら、コンテキスト用の余裕を確保しながらモデルをFP16で動かせます。
Apple Silicon搭載Mac
Ollamaはユニファイドメモリを使用します。モデル単体なら16 GBのMacで十分です。RAG用にチャットモデルも横でロードしておきたい場合は、24 GBを見込んでください。
GPUなし
可能ですが、画像のエンコードとMarkdownの生成はプロセッサー上で行われます。数ページなら許容できますが、百ページのバッチでは、マシンによってはページあたり数分かかると見込んでください。
ソフトウェア
Ollamaを最新の状態にし、PDFを分割するpoppler-utilsと、バッチ処理を自動化する場合はollamaライブラリ付きのPython 3を用意します。
i
このガイドでは何も測定していません
ここでは、毎分のページ処理速度も精度スコアも公表していません。引用した数値は、公開資料におけるDeepSeekのものです。手元の文書での品質は、スキャンの解像度、言語、レイアウトによって異なります。バッチ処理を始める前に、代表的な二十ページでテストしてください。

#ステップ1:Ollamaを確認し、適切なタグを取得する

DeepSeek-OCRはモデルのリリース後、2025年末にライブラリOllamaへ追加されました。これは、ローカルウィンドウモジュールとグローバルアテンションモジュールを組み合わせた特殊なビジュアルエンコーダーDeepEncoderを基盤としています。Ollamaは、このアーキテクチャへの対応をエンジンに追加する必要がありました。以前のランタイムでは重みをダウンロードできてもロードを拒否され、モデルにはより新しいバージョンが必要だというメッセージが表示されます。ライブラリのページには、該当する場合、必要な最小バージョンが表示されます。

ターミナル
# Version installée (comparez avec la version minimale affichée sur ollama.com/library/deepseek-ocr)
ollama -v

# Récupérer le modèle (le tag 3b est celui référencé par la fiche modèle)
ollama pull deepseek-ocr:3b

# Vérifier l'architecture, le contexte et la quantification empaquetée
ollama show deepseek-ocr:3b

showコマンドだけが、直前にダウンロードしたものを確認する信頼できる情報源です。モデルファミリー、パラメーター数、コンテキスト長、量子化レベルを示します。latestタグと3bタグが同じダイジェストを指しているなら、どちらを使っても構いません。ガイドでは明確さを保つために3bを使用しています。

!
先にOllamaを更新してから、さらに調べてください
モデルはダウンロードできるのに読み込みに失敗する場合、または Ollama が画像を考慮せずテキストだけを返す場合、最も多い原因はランタイムが古すぎることです。Linux では公式インストールスクリプトを再実行し、Windows と macOS ではアプリケーションを自動更新するかメニューから更新してください。その後、ollama -v を再実行します。

#ステップ2:PDFのページを準備する

OllamaはPDFを開けません。画像を受け付けますが、PNGまたはJPEGを1回のリクエストにつき一枚です。そのため、最初の作業は文書をページごとにラスタライズすることになります。最も簡単なツールはpdftoppmです。これはpoppler-utilsに含まれており、すべてのLinuxディストリビューションとmacOSのHomebrewで利用できます。

ターミナル
# Debian/Ubuntu : sudo apt install poppler-utils
# macOS : brew install poppler
# Arch : sudo pacman -S poppler

mkdir -p pages
pdftoppm -r 200 -png scan.pdf pages/page
ls pages
# pages/page-1.png  pages/page-2.png  ...  (numérotation complétée par des zéros selon le nombre de pages)

解像度については、少し考える価値があります。DeepSeek-OCRは固定解像度で動作し、モードに応じて一辺512、640、1024、または1280ピクセルを使用します。さらに、全体表示を1024ピクセルとし、その周囲のページを640ピクセルのタイルに分割する、Gundamという動的モードもあります。200 dpiでラスタライズしたA4ページは、およそ1,650×2,340ピクセルです。Ollamaは、エンコーダーに送る前にこれをリサイズします。300 dpiに上げてもモデルには何のメリットもなく、ファイルが無駄に大きくなります。100 dpiまで下げると、モデルが見る前に脚注の小さな文字が失われます。

スキャンが斜めになっていたり、コントラストが非常に高かったりする場合、モデルは通常、行単位のOCRよりもうまく処理できますが、事前に傾きを補正しておくと有効です。サイトのTesseractガイドでは、ここでも適用できる有用な前処理を詳しく説明しています:https://quelllm.fr/guide/tesseract-ocr-guide-local

#ステップ3:deepseek ocrでMarkdownを取得する

公式リポジトリでは、モデルの異なる動作を引き起こす複数の指示が説明されています。主な二つは、構造化変換用の「Convert the document to markdown.」と、書式なしで生の文字起こしを行う「Free OCR.」です。学習時の指示は英語なので、そのまま使用してください。認識されたテキストは、ドキュメントの言語で出力されます。コマンドラインクライアントでは、画像のパスをプロンプトに直接指定します。

ターミナル
# Conversion structurée (titres, listes, tableaux)
ollama run deepseek-ocr:3b "Convert the document to markdown. ./pages/page-1.png"

# Transcription brute, sans structure
ollama run deepseek-ocr:3b "Free OCR. ./pages/page-1.png"

デフォルトで http://localhost:11434 をリッスンするローカル API 経由でも同じ操作ができます。この API は images フィールドに画像を base64 で埋め込みます。ページを連続して処理する場合や、別のプログラムからモデルを呼び出す場合は、こちらの方法を優先してください。

ターミナル
# Linux (GNU coreutils). Sur macOS, remplacez base64 -w0 par base64 -i pages/page-1.png
curl http://localhost:11434/api/generate -d "{
  \"model\": \"deepseek-ocr:3b\",
  \"prompt\": \"Convert the document to markdown.\",
  \"images\": [\"$(base64 -w0 pages/page-1.png)\"],
  \"stream\": false,
  \"options\": { \"num_ctx\": 8192, \"temperature\": 0 }
}"

二つのオプションは固定しておく価値があります。温度をゼロにすると出力が再現可能になり、これはOCRに期待される動作です。8 192トークンのコンテキストはモデルの上限に相当します。これより短いと、密度の高いページでは表のセルの途中で切り捨てられることがあります。公式リポジトリには、図の説明や座標によるテキスト位置の特定に特化した指示も記載されていますが、単純にインデックス化するPDFにはほとんど役立ちません。

→
同じページで2つの指示をテストしてください
通常のテキストページでは、Free OCRのほうがよりきれいで高速な結果になることがよくあります。数字の表や複数階層の見出しがあるページでは、Markdown変換に追加コストをかける価値があります。毎回同じものを選ぶのではなく、文書の種類に応じて選択してください。

#ステップ4:PDF全体を処理する

数十ページある文書でも、数行の Python スクリプトで十分です。画像を数値順に処理し、Ollama をページごとに呼び出し、モデルが挿入することのある位置情報タグを削除して、ページごとのマーカーを付けた単一の Markdown ファイルに連結します。このマーカーがあれば、後で RAG が引用した箇所の元ページを特定できます。

ターミナル
pip install ollama
ocr_pdf.py
import pathlib
import re
import ollama

MODEL = "deepseek-ocr:3b"
PROMPT = "Convert the document to markdown."

# Tri numérique : page-2 avant page-10
pages = sorted(
    pathlib.Path("pages").glob("page-*.png"),
    key=lambda p: int(re.search(r"(\d+)", p.stem).group(1)),
)

parts = []
for page in pages:
    r = ollama.generate(
        model=MODEL,
        prompt=PROMPT,
        images=[str(page)],
        options={"num_ctx": 8192, "temperature": 0},
    )
    md = r["response"]
    # Balises de localisation éventuelles : on garde le texte, on jette les coordonnées
    md = re.sub(r"<\|ref\|>(.*?)<\|/ref\|><\|det\|>.*?<\|/det\|>", r"\1", md, flags=re.S)
    parts.append(f"<!-- {page.name} -->\n{md.strip()}\n")
    print(f"{page.name} : {len(md)} caractères")

pathlib.Path("scan.md").write_text("\n\n".join(parts), encoding="utf-8")

各呼び出しは独立しています。モデルは前のページの記憶を保持しません。これは二ページにまたがる表には制限となりますが、失敗したページが別のページに影響しないため、堅牢性にとっては利点です。Ollamaはモデルを一度読み込み、OLLAMA_KEEP_ALIVE変数の値に従って呼び出しの間もメモリに保持します。バッチの開始時に読み込み時間を支払うだけで済みます。

余裕のあるGPUをお使いなら、OLLAMA_NUM_PARALLELオプションで複数のページを同時に処理できますが、コンテキストごとに追加のVRAMが必要になります。12 GBのGPUなら、この規模のモデルでは並列リクエスト二つまでが妥当です。nvidia-smiでシステムメモリを使い切っていないことを確認してください。使い切ると、速度が急激に低下します。

#ステップ5:出力を整理して確認する

生成されたMarkdownは読むには適していますが、そのままインデックス化するのに適しているとは限りません。ベクトルデータベースに送る前に、三つの点を確認してください。

  1. 01
    残存するタグ
    変換指示があると、モデルは位置情報トークン付きで学習され、ref タグと det タグの間に座標を返すことがあります。上記のスクリプトはそれらを削除します。ファイル先頭に画像タグや指示の断片も残っていないことを確認してください。
  2. 02
    数値と表
    視覚言語モデルはテキストを生成するため、判読できないセルにもっともらしい値を創作することがあります。従来のOCRなら異常な文字を残すようなケースです。財務表や技術表はスキャン画像と並べて開き、十行に一行の割合で比較してください。請求書については、サイトの専用ガイドで合計額との照合方法を説明しています:https://quelllm.fr/guide/extraction-factures-ocr-llm
  3. 03
    ヘッダーとフッター
    ページ番号、ドキュメント名、繰り返し記載される法的注記は各ページに現れ、セグメント分割を妨げます。ページの半分を超えて同一の行に現れる文字列を正規表現で検出すれば、通常は十分に除去できます。
  4. 04
    フランス語のアクセントとタイポグラフィ
    エディターは百ほどの言語での学習を告知しています。それでも、サンプルを使ってアクセント記号付きの文字、フランス語の引用符、二重記号の前のノーブレークスペースを確認してください。後の語彙検索を歪める目立ちにくいエラーは、そこに潜んでいます。

ファイルがきれいに整ったら、通常のMarkdownと同じようにRAGのパイプラインに入れられます。見出しによる分割、埋め込み、ベクトルデータベースという流れです。サイトのローカルRAG入門では、これらの手順を取り上げています:https://quelllm.fr/guide/rag-local-introduction

#制限事項およびトラブルシューティング

モデルは画像を見ずに応答します
Ollamaがこのアーキテクチャには古すぎるか、画像が渡されていません。コマンドラインでは、パス自体を引用符で囲まず、絶対パスまたはカレントディレクトリからの相対パスにする必要があります。APIでは、imagesフィールドに改行なしのbase64が正しく含まれていることを確認してください。
表の途中で出力が途切れる
コンテキストがページに対して短すぎます。まだ設定していない場合は、num_ctxを8192にしてください。それでもページが収まらない場合は、数行重ねて、上半分と下半分の二つの画像に分割してください。
ページが順不同で読み取られる
3列のレイアウトやチェックボックス付きのフォームでは、モデルがブロックを混同することがあります。空間的な順序をより単純に追うFree OCRの指示を試すか、レイアウト解析が明示的なDoclingを使用してください。
異常な遅さ
ollama psで、モデルがGPUに完全に読み込まれており、プロセッサーに一部が置かれていないことを確認してください。コンテキストが大きすぎたり、二つ目のモデルが読み込まれていたりすると、システムメモリにあふれる可能性があります。
手書きテキスト
DeepSeek-OCRは印刷文書とページレンダリングを使って学習されています。手書き文字では結果が大きく変動するため、事前に試さず頼りにしないでください。
長い文書とページ間のコンテキスト
各ページは個別に処理されます。次のページに続く表では見出しが失われるため、手動または後処理ルールで再挿入する必要があります。
i
別のバージョンも存在します
DeepSeekは2026年初頭、エンコーダーを改良したモデルの第2版、DeepSeek-OCR-2を公開しました。執筆時点では、Ollamaのライブラリに含まれていることを確認できませんでした。選択する前に、提供元のHugging Faceページとサイトのモデルページを確認してください。ここで説明する方法は変わりません。

#PaddleOCR、Docling、または Tesseract で十分な場合

DeepSeek-OCRは、あらゆるスキャンに対する答えではありません。ページに保持すべき構造があり、パイプラインを組み立てずにMarkdownが欲しい場合に力を発揮します。一般的な多くのケースでは、より単純または専門的なツールでも、少ないリソースと低い捏造リスクで同じように対応できます。

Tesseract
白い背景に大量に印刷された、整ったテキストで、必要なのはテキストだけです。これはプロセッサー上で動作し、何も生成しないため、何も捏造しません。ガイド:https://quelllm.fr/guide/tesseract-ocr-guide-local
PaddleOCR
ページ上のどこにでも配置されたテキスト、傾いたスキャン画像、読み取り前に明示的な検出ステップで再構成する必要がある表に対応します。その VL 版もビジョンモデルで、DeepSeek-OCR より小型です。ガイド:https://quelllm.fr/guide/paddleocr-vl-ocr-local
Docling
ネイティブPDF、DOCX、プレゼンテーションなど、すでにテキストを含み、主にレイアウトと表の抽出が必要な文書です。Doclingは画像ページのためにOCRエンジンを呼び出せますが、中核となるのは構造解析です。ガイド:https://quelllm.fr/guide/docling-conversion-documents-ia
DeepSeek-OCR
見出し、リスト、表、数式を含むページのスキャン画像や写真を、控えめなグラフィックカード上で一度の処理で索引化可能なMarkdownにする必要がある場合。

判断を分ける基準はよくあります。数字の誤りが影響を及ぼす場合は、生成せずに認識するツールを選ぶか、2つ目のエンジンで読み取りを二重化して出力を比較してください。異種の文書群を読みやすく検索可能にすることが優先なら、DeepSeek-OCRのMarkdownによって、その後の各工程で時間を節約できます。

#さらに詳しく

モデル概要 DeepSeek-OCR
パラメーター、精度ごとの VRAM、ライセンス、インストールコマンド。https://quelllm.fr/modele/deepseek-ocr
Ollama のインストール
Windows、macOS、Linux へのインストール、基本コマンド、トラブルシューティング。https://quelllm.fr/guide/installer-ollama
コーディング不要のローカルRAG
生成したMarkdownをOpen WebUIまたはAnythingLLMに接続して、文書を検索します。https://quelllm.fr/guide/rag-local-ollama-sans-coder
公式ソース
GitHubリポジトリdeepseek-ai/DeepSeek-OCR(コード、手順、PDF用vLLMスクリプト)、Hugging Faceページdeepseek-ai/DeepSeek-OCR(重みとMITライセンス)、Ollamaページollama.com/library/deepseek-ocr(タグ、サイズ、最小バージョン)。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。