DeepSeek-OCR 论文精读与实践:用“光学上下文压缩”把长文本变成图片,再由 VLM 高效还原

关键词:DeepSeek-OCR、视觉-文本压缩、长上下文、MoE、OCR、文档解析、vLLM、Transformers


一、写在前面(5 点速览)

  • 研究动机 :LLM 处理超长上下文时计算与显存成本会随序列长度急剧上升。DeepSeek-OCR 提出把长文本转为高分辨率图像 ,再用视觉 token替代海量文本 token,从而显著降低成本。
  • 总体架构 :一个DeepEncoder(视觉编码器) + 一个3B MoE 解码器 。DeepEncoder 以窗口注意力 + 16×卷积压缩 + 全局注意力 串联,既能吃高分辨率,又能把视觉 token 压到很少;解码器负责从少量视觉 token 还原出文本/Markdown 等。
  • 压缩-精度权衡 (来自论文的量化结论):在10×压缩 下可达约 96%/97% OCR 准确率 ;极限到20× 时仍能保持约 60%。意味着能用更少 token 涵盖更多历史内容。
  • 实际表现 :在 OmniDocBench 等文档基准上,以更少的视觉 token 达到或超越同类端到端 OCR/VLM;生产侧可做大规模文档数据生成(单张 A100-40G 即可高吞吐处理)。
  • 开源易用 :已提供 Transformers / vLLM 推理脚本、多分辨率模式(Tiny/Small/Base/Large/Gundam)、常见 prompt 模板与批量 PDF 处理示例,直接落地工程。

二、为什么"把文本变图片"有意义?

LLM 的时间/显存复杂度通常随文本序列长度 上升(例如注意力机制近似二次/线性-常数优化仍有限)。而图像 是一种天然的"稠密表达"------一张图能承载成百上千字 。如果我们有一个足够强的视觉编码器,能把高分辨率图像 → 少量但信息密度高的视觉 token ,再配合一个语言解码器把信息解码回文本,那么:

  • 压缩收益 :同等信息量下,视觉 token 数量可显著小于文本 token 数量;
  • 成本优势 :训练与推理中,上下文长度可大幅缩短,从而降低显存与时间开销;
  • 统一范式 :"文档版面/表格/图表/化学式/多语言"在图像域的统一建模,简化传统"检测+识别+版面分析"的多模型流水线。

OCR 在这里不仅是"识别字符",更是作为可量化试验台 :压缩多少视觉 token,仍能还原多少文本信息(带标准答案可评估)。


三、方法总览:DeepSeek-OCR 的整体设计

DeepSeek-OCR 是一个端到端 VLM,包含:

  • DeepEncoder(≈380M 参数)

    • 前半段:窗口注意力主导(基于 SAM-base),以较低激活成本消化高分辨率细节;
    • 中间:2 层 3×3、stride=2 的卷积压缩 模块,把视觉 token 16×下采样(例如 4096 → 256);
    • 后半段:全局注意力(基于 CLIP-large),在更少 token 下做全局建模;
    • 多分辨率/动态分辨率模式,让工程上能"按预算"灵活切换。
  • 解码器:DeepSeek-3B-MoE(激活参数 ≈570M)

    • MoE(多专家)提升表达/效率;
    • 解码目标是文本/Markdown/结构化输出 ;支持一些输出约束(如 NGram 处理、表格标签白名单等)。

输入/输出 :输入为单页/多页文档图像 (或截图),输出可为纯文本Markdown结构化块(表格、代码、图示说明)等。


四、DeepEncoder 细节解剖:高分辨率、低激活、少 token

目标:在高分辨率下,既吃得下又压得好

  1. 局部-全局两阶段

    • 阶段 A(局部/窗口注意力) :以 SAM-base 为骨干(patch size 16)。对 1024×1024 输入,初始产生 4096 个 patch token。窗口注意力激活低、可并行,适合首先吃掉海量局部细节。
    • 阶段 B(16×卷积压缩) :2 层 3×3/stride=2 卷积,通道 256→1024,把 token 从 4096 压到 256
    • 阶段 C(全局注意力) :把压缩后的 token 输入 CLIP-large (移除了首个 patch-embed,因为输入已是 token),在较少 token上做全局建模。
  2. 多分辨率/动态分辨率模式(示例)

模式 原生分辨率 典型视觉 token 数
Tiny 512×512 64
Small 640×640 100
Base 1024×1024 256
Large 1280×1280 400
Gundam(动态) 1×1024×1024 + n×640×640 256 + n×100

工程含义:你可以按显存/吞吐 预算选择模式;需要更细粒度时使用 Gundam(主视图 + 若干局部高密度裁剪)。


五、MoE 解码器与输出约束

  • 3B MoE / 激活 570M:在保持推理效率的同时获得更强表达能力。
  • 输出约束(可选) :为减少"胡写",可用 NGramPerReqLogitsProcessor 等策略限制输出 n-gram 或对表格专用 token 做白/黑名单约束(如只放行 <td> / </td>),提升结构化输出的稳定性

六、数据与训练:两阶段、8192 序列、三类数据源

  • 数据配比 (示例):OCR 数据 ~70%通用视觉数据 ~20%文本-only ~10% ;序列长度通常在 8192
  • 训练流程(2 阶段)
    1)先独立训练 DeepEncoder ,把"高分辨率 → 少 token"这件事做到稳而准;
    2)再端到端训练 DeepSeek-OCR,让解码器学会从视觉 token 还原文本/Markdown/表格。
  • 能力扩展 :除文本外,对图表/化学式/简单几何图等也有专门解析能力,工程上更实用。

七、效果与指标:压缩-精度曲线 & 基准对比(论文结论)

  • 压缩 vs 准确率(以 Fox 等基准为例)
    • ≈9--10× 压缩 :OCR 解码**≈96%+**;
    • ≈10--12×≈90%
    • ≈20×≈60%
  • 基准对比(OmniDocBench) :在更少视觉 token 的前提下,达到或超越 GOT-OCR2.0MinerU 等端到端方案。
  • 生产吞吐 :单张 A100-40G 可达每日 20 万+ 页 ;规模化集群(如 20 台 × 8 卡)可达数千万页/日的训练语料生成与处理能力。

工程解读:**中低压缩(≤10×)**已经非常可用;如果业务能够容忍部分损失,可进一步上调压缩比换更高吞吐/更低成本。


八、与传统 OCR / 通用 VLM 的对比

维度 传统 OCR(检测+识别) 通用 VLM(端到端解析) DeepSeek-OCR(本工作)
范式 多模型流水线 单模型端到端 单模型端到端,但显式追求"视觉-文本压缩"效率最优
对长上下文 依赖外部拼接 仍受文本 token 长度限制 用视觉 token 替代文本 token,显著降本
版面/表格 需专门模块 依赖指令/微调 内建图表/结构化解析能力更强
工程易用性 成熟 快速迭代 已提供开源脚本/多分辨率模式/vLLM 集成
可能的弱项 复杂维护 token 多、成本高 超高压缩会降精度;对布局/清晰度仍有要求

九、快速上手(GPU:8GB+ 更佳;建议 BF16 + FlashAttention)

下列示例已在官方仓库/模型卡给出,可直接粘贴运行。

9.1 依赖环境(Transformers 路线)

bash 复制代码
# Python 3.12.9 + CUDA 11.8(示例)
pip install "torch==2.6.0" "transformers==4.46.3" "tokenizers==0.20.3" einops addict easydict
pip install "flash-attn==2.7.3" --no-build-isolation

9.2 最小推理脚本(Transformers)

python 复制代码
from transformers import AutoModel, AutoTokenizer
import torch, os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

model_name = "deepseek-ai/DeepSeek-OCR"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
    model_name,
    _attn_implementation="flash_attention_2",
    trust_remote_code=True,
    use_safetensors=True
).eval().cuda().to(torch.bfloat16)

# 典型 OCR 指令(无版面/结构):
# prompt = "<image>\nFree OCR."

# 保留版面/表格(Markdown 输出)更常用:
prompt = "<image>\n<|grounding|>Convert the document to markdown."

image_file = "your_image.jpg"
output_path = "outputs"

# infer(self, tokenizer, prompt='', image_file='', output_path=' ',
#       base_size=1024, image_size=640, crop_mode=True, test_compress=False, save_results=False)
res = model.infer(
    tokenizer,
    prompt=prompt,
    image_file=image_file,
    output_path=output_path,
    base_size=1024,   # Base
    image_size=640,
    crop_mode=True,   # Gundam 动态分辨率
    save_results=True,
    test_compress=True  # 输出压缩相关信息(可选)
)

print(res)

9.3 vLLM 路线(高吞吐/批量 PDF)

bash 复制代码
# vLLM 最新版(当前需 nightly,具体以官方说明为准)
uv venv && source .venv/bin/activate
uv pip install -U vllm --pre --extra-index-url https://wheels.vllm.ai/nightly
python 复制代码
from vllm import LLM, SamplingParams
from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor
from PIL import Image

llm = LLM(
    model="deepseek-ai/DeepSeek-OCR",
    enable_prefix_caching=False,
    mm_processor_cache_gb=0,
    logits_processors=[NGramPerReqLogitsProcessor],  # n-gram/白名单约束
)

image_1 = Image.open("1.png").convert("RGB")
image_2 = Image.open("2.png").convert("RGB")
prompt = "<image>\nFree OCR."

model_input = [
    {"prompt": prompt, "multi_modal_data": {"image": image_1}},
    {"prompt": prompt, "multi_modal_data": {"image": image_2}},
]

sampling_param = SamplingParams(
    temperature=0.0,
    max_tokens=8192,
    extra_args=dict(
        ngram_size=30,
        window_size=90,
        whitelist_token_ids={128821, 128822},  # 例如只允许 <td> 与 </td>
    ),
    skip_special_tokens=False,
)

outs = llm.generate(model_input, sampling_param)
for o in outs:
    print(o.outputs[0].text)

批量 PDF/评测脚本 :官方仓库含 run_dpsk_ocr_pdf.pyrun_dpsk_ocr_eval_batch.py,并给出并发与吞吐参考。

9.4 分辨率/模式与显存建议

  • Tiny(512):64 token,超快,但细节损失多;
  • Small(640):100 token,适合轻量部署;
  • Base(1024):256 token,综合性价比高;
  • Large(1280):400 token,复杂版面/小字更稳;
  • Gundam(动态) :主图 + 多裁剪,对小字/表格/脚注特别友好。

工程建议 :先用 Base/Gundam 打基准,再按成本/精度切 Tiny/Small 或 Large。


十、Prompt 小抄(可直接复用)

text 复制代码
# 文档转 Markdown(含版面)
<image>
<|grounding|>Convert the document to markdown.

# 纯 OCR(只要文本,不要结构)
<image>
Free OCR.

# 解析图表/示意图
<image>
Parse the figure.

# 指定定位/引用
<image>
Locate <|ref|>"配料表"<|/ref|> in the image.

十一、应用场景与落地建议

  • 票据/合同/发票/规范:结构保持、表格解析、页眉页脚处理;
  • 扫描书籍/论文/专利 :Markdown 保版式,适配后续 RAG/检索/标注
  • 多语言 OCR:跨语言混排(中英/日英等)鲁棒;
  • 图表/公式/化学式:可抽取文本描述与结构标签,利于后处理。

结合工程实践的小贴士

1)输入预处理 :去噪、畸变矫正、对比度增强,尤其是手机拍照/曲面纸张;

2)大页/小字 :优先 GundamLarge

3)表格提取 :使用输出约束 (表格标签白名单);

4)吞吐优化 :vLLM + BF16 + FlashAttention;批量任务固定 base_size/image_size,方便缓存命中;

5)一致性评估 :对压缩比-精度做网格搜索,找业务最优 sweet spot。


十二、局限与展望

  • 超高压缩的损失:20× 压缩下的还原准确率明显下降(但可用于召回/预标注/粗读)。
  • 格式与语义一致性 :不同标注/输出规范会带来"格式差异 ≠ 识别错误"的评估偏差,需定制评测。
  • 更广的长上下文验证:论文也提出未来会做**"数字-光学交错预训练"、"针堆测试(Needle-in-a-Haystack)"**等,以系统性验证"光学上下文记忆/遗忘"的价值。

十三、复现实验 Checklist(拿来即用)

  • 环境:CUDA 11.8、PyTorch 2.6.0、Transformers 4.46.3、FlashAttention 2.7.3
  • 硬件:≥8GB 显存(Base/Gundam 更推荐 20--40GB)
  • 模式:先 Base/Gundam 打基线,再按预算调 Tiny/Small/Large
  • 指令:Markdown 输出优先 <|grounding|>Convert the document to markdown.
  • 结构化:表格白名单/约束(如 <td>
  • 批量:用 vLLM 脚本处理 PDF,记录压缩比-精度-时延三元组

十四、结语

DeepSeek-OCR 的关键不只在"识别的准",而是把文档理解 统一到一个"先压缩、再解码 "的范式,让长上下文处理 从堆长度(长文本 token)变为堆密度(视觉 token) 。这条路一旦打通,LLM 的"记忆与成本"将被系统性重构


参考资料(官方与社区,建议随文保留)

下面给出方便复制的链接(纯文本/代码块,不会在 CSDN 里触发公式/渲染问题)。

text 复制代码
论文(arXiv):https://arxiv.org/abs/2510.18234
GitHub:      https://github.com/deepseek-ai/DeepSeek-OCR
HuggingFace: https://huggingface.co/deepseek-ai/DeepSeek-OCR
vLLM 用法:   https://docs.vllm.ai (站内搜索 DeepSeek-OCR 或参考 GitHub README)
更多第三方 UI/工具(示例):
  https://github.com/fufankeji/DeepSeek-OCR-Web
  https://github.com/newlxj/DeepSeek-OCR-Web-UI
相关推荐
@解忧杂货铺7 小时前
【百度AI】Postman调用OCR服务-解决官方教程请求失败问题
ocr
翔云 OCR API14 小时前
身份证三要素实名核验API:基于OCR与可信身份认证的技术解析
ocr
realhuizhu2 天前
技术人的公关利器:专业新闻稿撰写AI指令深度解析
deepseek·ai提示词工程·公关传播·企业新闻稿·技术人的工具箱
AI人工智能+2 天前
服务器端护照识别技术:通过图像预处理、OCR字符识别和智能分析实现高效身份核验
人工智能·深度学习·ocr·护照识别
Eiceblue3 天前
Python 快速提取扫描件 PDF 中的文本:OCR 实操教程
vscode·python·ocr·1024程序员节
广州明周科技3 天前
Revit 200+新功能之“房间面积图表”,房间数据可视化功能,轻松洞察项目空间信息!
ai·信息可视化·数据分析·bim·revit二次开发·revit·deepseek
之墨_3 天前
【LLM】用 FastAPI 搭建「OpenAI 兼容」DeepSeek-OCR 服务 + 简洁WebUI
大模型·ocr·deepseek-ocr
小白狮ww3 天前
dots.ocr 基于 1.7B 参数实现多语言文档处理,性能达 SOTA
人工智能·深度学习·机器学习·自然语言处理·ocr·小红书·文档处理
xunan0033 天前
DeepSeek-OCR MoE结构梳理(其它LLM原理类似)
ocr