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作为文档解析器。

开始使用

  1. 克隆仓库:git clone https://github.com/baidu/Unlimited-OCR
  2. 安装依赖:pip install torch transformers pillow pymupdf
  3. 使用上述示例运行推理。
  4. 对于生产环境,使用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.