Unlimited-OCR:百度推出的一次性长文档解析工具
百度的Unlimited-OCR支持一次性解析长文档和PDF,仅需单次前向传播,上下文长度可达32K。
什么是Unlimited-OCR?
Unlimited-OCR是百度推出的一款全新开源OCR模型,旨在突破文档解析的边界——特别是针对一次性长文档解析。与传统的逐页处理或依赖滑动窗口的OCR系统不同,Unlimited-OCR可以接收整个多页文档(或高分辨率单张图片),并在单次前向传播中生成结构化的文本输出。
这对于文档理解来说是一个重大进步,尤其适用于研究论文、法律合同或多页报告等长篇幅内容。
为什么重要
大多数OCR流程会将文档拆分为单独的页面或区域,独立处理,然后再将结果拼接起来。这种方法存在几个缺点:
- 上下文丢失:跨页面的信息会丢失。
- 推理速度慢:每个页面都需要单独的模型调用。
- 流程复杂:需要页面检测、排序和合并逻辑。
Unlimited-OCR通过接收多张图片(或转换为图片的PDF)并生成单一连贯的输出来解决这些问题。该模型支持32,768个令牌的上下文长度,足以覆盖数十个密集页面。
主要特点
- 一次性长文档解析:一次输入多页,获得单一输出。
- 两种推理模式:
gundam(基于裁剪,图像尺寸640px)适用于需要精细细节的单张图片,base(图像尺寸1024px)适用于多页或PDF解析。 - 支持vLLM和SGLang:可使用生产级推理引擎部署。
- 开源:MIT许可证,可在GitHub和Hugging Face上获取。
- 32K上下文长度:处理长文档而无需截断。
如何使用Unlimited-OCR
使用Transformers快速开始
最简单的入门方式是使用Hugging Face Transformers。以下是一个最小示例:
import torch
from transformers import AutoModel, AutoTokenizer
model_name = 'baidu/Unlimited-OCR'
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
model_name,
trust_remote_code=True,
use_safetensors=True,
torch_dtype=torch.bfloat16,
)
model = model.eval().cuda()
# 单张图片解析(gundam模式,高细节)
model.infer(
tokenizer,
prompt='<image>document parsing.',
image_file='your_image.jpg',
output_path='./output',
base_size=1024, image_size=640, crop_mode=True,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=128,
save_results=True,
)
多页/PDF解析
对于多页文档,将每页转换为图片并使用infer_multi:
import fitz # PyMuPDF
def pdf_to_images(pdf_path, dpi=300):
doc = fitz.open(pdf_path)
mat = fitz.Matrix(dpi / 72, dpi / 72)
paths = []
for i, page in enumerate(doc):
out = f'page_{i+1:04d}.png'
page.get_pixmap(matrix=mat).save(out)
paths.append(out)
doc.close()
return paths
model.infer_multi(
tokenizer,
prompt='<image>Multi page parsing.',
image_files=pdf_to_images('your_doc.pdf', dpi=300),
output_path='./output',
image_size=1024,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024,
save_results=True,
)
使用vLLM部署
对于生产环境,推荐使用vLLM推理引擎。百度提供了预构建的Docker镜像:
# 默认(CUDA 13.0)
docker pull vllm/vllm-openai:unlimited-ocr
# 适用于Hopper GPU(CUDA 12.9)
docker pull vllm/vllm-openai:unlimited-ocr-cu129
然后按照官方指南操作:https://recipes.vllm.ai/baidu/Unlimited-OCR
SGLang部署
SGLang也受支持。设置环境并启动服务器:
uv venv --python 3.12
source .venv/bin/activate
uv pip install wheel/sglang-0.0.0.dev11416+g92e8bb79e-py3-none-any.whl
uv pip install kernels==0.11.7
uv pip install pymupdf==1.27.2.2
python -m sglang.launch_server \
--model baidu/Unlimited-OCR \
--served-model-name Unlimited-OCR \
--attention-backend fa3 \
--page-size 1 \
--mem-fraction-static 0.8 \
--context-length 32768 \
--enable-custom-logit-processor \
--disable-overlap-schedule \
--skip-server-warmup \
--host 0.0.0.0 \
--port 10000
然后通过兼容OpenAI的API发送请求:
import requests
response = requests.post(
"http://127.0.0.1:10000/v1/chat/completions",
json={
"model": "Unlimited-OCR",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "document parsing."},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
]
}
],
"temperature": 0,
"images_config": {"image_mode": "gundam"},
"custom_logit_processor": "DeepseekOCRNoRepeatNGramLogitProcessor",
"custom_params": {"ngram_size": 35, "window_size": 128},
"stream": True,
},
timeout=1200,
stream=True,
)
性能与基准测试
虽然README中没有包含详细的基准测试,但该模型的架构专为长文档解析设计。32K的上下文长度和no_repeat_ngram_size参数(设置为35)有助于避免长输出中的重复——这是自回归模型中的常见问题。
gundam模式采用基于裁剪的方法,image_size=640,非常适合需要精细细节的单张图片(例如密集的文本页面)。base模式使用image_size=1024且不进行裁剪,更适合需要全局布局的多页文档。
与DeepSeek-OCR的比较
Unlimited-OCR明确将自己定位为将“DeepSeek-OCR向前推进一步”。主要改进包括:
- 更长的上下文:32K令牌 vs. 早期模型。
- 多页支持:原生处理一次输入多张图片。
- 生产就绪:开箱即用支持vLLM和SGLang。
- 开源:MIT许可证,完全可复现。
使用场景
- 研究论文解析:输入整个PDF,获取结构化文本。
- 法律文档分析:合同、协议和表格。
- 发票和收据处理:批量处理文档。
- 历史文档数字化:具有复杂布局的长文档。
- RAG流程:在索引前使用Unlimited-OCR作为文档解析器。
开始使用
- 克隆仓库:
git clone https://github.com/baidu/Unlimited-OCR - 安装依赖:
pip install torch transformers pillow pymupdf - 使用上述示例运行推理。
- 对于生产环境,使用vLLM Docker镜像。
结论
Unlimited-OCR是一个实用、开源的一次性长文档解析解决方案。它支持多页输入、32K上下文和生产级推理引擎,是构建文档理解流程的开发者的强大选择。MIT许可证和活跃的社区支持(GitHub上超过13k星)表明它将继续发展。
如果你正在从事OCR、文档解析或RAG流程的工作,这个项目值得一试。
来源
baidu/Unlimited-OCR: Unlimited OCR Works: Welcome the Era of One-shot Long-horizon Parsing.