1. 开篇:为什么 Unlimited-OCR 值得关注
2026 年 6 月,百度开源了 Unlimited-OCR——一个只有 3B 参数却能一次性解析 100 页 PDF 的 OCR 模型。截至目前,GitHub Star 已突破 2.6 万,成为 OCR 领域最受关注的开源项目。
传统 OCR 工具(Tesseract、PaddleOCR)处理长文档时采用"逐页独立识别"策略,每翻一页就清空上下文。这导致: - 上下文断裂:跨页表格、跨页段落无法连贯理解 - 重复计算:每页都要重新建立特征提取器 - KV Cache 爆炸:长文档的注意力缓存呈线性增长
Unlimited-OCR 通过创新的 R-SWA(Reference Sliding Window Attention) 机制彻底解决了这个问题。本文将深度解析其技术原理、最新进展(vLLM 集成、企业级服务)、部署指南和实战案例。
相关推荐阅读: - AI 模型部署指南系列 - 本地 LLM 推理优化实战
2. 核心技术:R-SWA 注意力机制
2.1 问题:长文档的 KV Cache 灾难
传统 Transformer 处理长文档时,KV Cache(Key-Value 缓存)随文档长度线性增长。处理 100 页 PDF 时,KV Cache 可能占用数十 GB 显存,导致: - 显存溢出(OOM) - 推理延迟急剧增加 - 无法在消费级 GPU 上运行
2.2 解决方案:R-SWA 机制
Unlimited-OCR 的核心创新是 R-SWA(Reference Sliding Window Attention),设计灵感来自人类阅读长文档的方式:
人类阅读长文档时:
1. 保持一个"滑动窗口"的工作记忆(当前阅读的几页)
2. 通过引用机制回溯关键信息(前面的重要内容)
3. 不会每翻一页就忘记前面所有内容
R-SWA 的技术实现:
# R-SWA 核心逻辑伪代码
class ReferentialSlidingWindowAttention(nn.Module):
def __init__(self, window_size=2048, ref_size=512):
self.window_size = window_size # 当前窗口(局部细节)
self.ref_size = ref_size # 参考窗口(全局上下文)
def forward(self, hidden_states, past_kv):
# 1. 当前窗口注意力(局部细节)
local_attn = self.local_attention(hidden_states[-self.window_size:])
# 2. 参考窗口注意力(全局上下文)
ref_attn = self.ref_attention(past_kv[-self.ref_size:])
# 3. 门控融合:局部 + 全局
gate = self.sigmoid(self.gate_proj(hidden_states))
fused = gate * local_attn + (1 - gate) * ref_attn
return fused
关键优势: - 固定内存占用:无论文档多长,注意力缓存只维护 window_size + ref_size - 连续上下文:跨页信息通过参考窗口保持连贯 - 高效推理:32K 上下文长度下,单次前向传播完成数十页解析
2.3 MoE 架构:3B 总参数,0.5B 激活
Unlimited-OCR 采用 Mixture of Experts(MoE) 架构:
| 指标 | 数值 |
|---|---|
| 总参数量 | 30 亿(3B) |
| 每步激活参数 | 5 亿(0.5B) |
| 上下文长度 | 32K tokens |
| 支持分辨率 | 最高 1024×1024 |
| 支持语言 | 中/英/日/韩/德/法等 |
MoE 的好处:模型容量大(3B),但推理成本低(每步只激活 0.5B)。这意味着在消费级 GPU(如 RTX 3090/4090)上就能跑起来。
3. 最新进展:vLLM 集成与企业级服务
3.1 vLLM 社区支持(2026-06-28)
2026 年 6 月 28 日,vLLM 社区正式合并了对 Unlimited-OCR 的支持 PR,实现了 vLLM 推理加速。
vLLM 的优势: - PagedAttention:高效管理 KV Cache,显存利用率提升 2-4 倍 - Continuous Batching:动态批处理,吞吐量提升 3-5 倍 - Tensor Parallelism:多 GPU 并行推理
使用 vLLM 部署 Unlimited-OCR:
# 安装 vLLM
pip install vllm
# 启动 vLLM 服务
python -m vllm.entrypoints.openai.api_server \
--model baidu/Unlimited-OCR \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--port 8000
# 调用 API(兼容 OpenAI 格式)
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "baidu/Unlimited-OCR",
"messages": [
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "file:///path/to/document.pdf"}},
{"type": "text", "text": "请解析这份文档"}
]
}
]
}'
3.2 百度 AI 开放平台企业级服务
百度已上线 Unlimited-OCR 企业级服务,提供: - 托管式 API:无需自建 GPU 服务器 - SLA 保障:99.9% 可用性 - 企业级安全:数据加密、访问控制、审计日志
适用场景: - 无 GPU 硬件的团队 - 需要高可用保障的生产环境 - 快速原型验证
3.3 社区反馈与生态
截至 2026 年 10 月,Unlimited-OCR 社区生态: - GitHub Star:2.6 万+ - Hugging Face 下载量:50 万+ - 社区贡献: - Docker 镜像(官方 + 社区版本) - LangChain 集成 - LlamaIndex 文档加载器 - Gradio Web UI
4. 性能评测:对比商业 OCR 服务
4.1 OmniDocBench 基准测试
| 模型 | OmniDocBench v1.6 | 备注 |
|---|---|---|
| Unlimited-OCR | 93.92% | 百度 2026.06 开源 |
| DeepSeek-OCR | 87.70% | 前代基线 |
| GPT-4o | ~90% | 闭源大模型 |
| Google Vision API | ~88% | 商业 API |
| Azure AI Vision | ~87% | 商业 API |
| PaddleOCR v4 | ~85% | 传统 OCR |
| Tesseract 5 | ~78% | 开源经典 |
4.2 长文档解析能力对比
| 特性 | Unlimited-OCR | Google Vision | Azure AI | PaddleOCR |
|---|---|---|---|---|
| 长文档连续识别 | ✅ 32K 上下文 | ❌ 按页计费 | ❌ 按页计费 | ❌ 逐页独立 |
| 跨页表格 | ✅ 完整提取 | ❌ 截断 | ❌ 截断 | ❌ 截断 |
| 版面理解 | ✅ 标题/表格/代码 | ⚠️ 基础 | ⚠️ 基础 | ⚠️ 基础 |
| 数据隐私 | ✅ 本地部署 | ❌ 云端处理 | ❌ 云端处理 | ✅ 本地部署 |
| 成本 | ✅ 免费(自有 GPU) | ❌ 按页计费 | ❌ 按页计费 | ✅ 免费 |
4.3 速度对比
50 页 PDF 处理时间: - Unlimited-OCR(vLLM):~15 秒(1 次推理) - Unlimited-OCR(原生):~45 秒(1 次推理) - Google Vision API:~50 秒(50 次 API 调用) - PaddleOCR:~750 秒(50 次推理) - Tesseract:~1250 秒(50 次推理)
结论:vLLM 加速后的 Unlimited-OCR 在长文档场景下速度最快,且成本最低。
5. 部署指南:三种方式
5.1 方式一:Hugging Face Transformers(最简单)
# 安装依赖
pip install transformers torch pillow
# Python 代码
from transformers import AutoModelForVision2Seq, AutoProcessor
from PIL import Image
import torch
# 加载模型
model = AutoModelForVision2Seq.from_pretrained(
"baidu/Unlimited-OCR",
torch_dtype=torch.float16,
device_map="auto"
)
processor = AutoProcessor.from_pretrained("baidu/Unlimited-OCR")
# 处理文档
image = Image.open("document.pdf") # 支持 PDF、图片
inputs = processor(images=image, text="解析这份文档", return_tensors="pt")
inputs = {k: v.to(model.device) for k, v in inputs.items()}
# 推理
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=32768)
result = processor.decode(outputs[0], skip_special_tokens=True)
print(result)
5.2 方式二:vLLM 加速(推荐生产环境)
# 安装 vLLM
pip install vllm
# 启动服务
python -m vllm.entrypoints.openai.api_server \
--model baidu/Unlimited-OCR \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--port 8000
# 批量处理脚本
import requests
import base64
import os
def ocr_document(pdf_path):
with open(pdf_path, "rb") as f:
pdf_base64 = base64.b64encode(f.read()).decode()
response = requests.post(
"http://localhost:8000/v1/chat/completions",
json={
"model": "baidu/Unlimited-OCR",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": f"data:application/pdf;base64,{pdf_base64}"}},
{"type": "text", "text": "解析这份文档为 Markdown 格式"}
]
}]
}
)
return response.json()["choices"][0]["message"]["content"]
# 批量处理
for pdf_file in os.listdir("./documents"):
if pdf_file.endswith(".pdf"):
result = ocr_document(f"./documents/{pdf_file}")
with open(f"./results/{pdf_file}.md", "w") as f:
f.write(result)
print(f"Processed: {pdf_file}")
5.3 方式三:Docker 容器化部署
# 拉取官方镜像
docker pull baidu/unlimited-ocr:latest
# 启动服务
docker run -d \
--name unlimited-ocr \
--gpus all \
-p 8000:8000 \
-v $(pwd)/models:/models \
-v $(pwd)/results:/results \
baidu/unlimited-ocr:latest
# 处理文档
docker exec unlimited-ocr python infer.py \
--model /models/Unlimited-OCR \
--input /results/document.pdf \
--output /results/output.md \
--mode multi
# Docker Compose 配置
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
unlimited-ocr:
image: baidu/unlimited-ocr:latest
ports:
- "8000:8000"
volumes:
- ./models:/models
- ./results:/results
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
environment:
- MODEL_PATH=/models/Unlimited-OCR
- MAX_MODEL_LEN=32768
EOF
docker-compose up -d
6. 实战案例
6.1 案例 1:100 页技术手册解析
场景:将 100 页扫描版技术手册转为可编辑 Markdown。
# 输入:scanned_manual.pdf (100 页)
# 输出:editable_manual.md
python infer.py \
--model baidu/Unlimited-OCR \
--input scanned_manual.pdf \
--output editable_manual.md \
--mode multi \
--format markdown \
--context-length 32768
# 耗时:约 90 秒(vLLM 加速)
# 输出质量:标题层级、代码块、表格结构均正确识别
6.2 案例 2:财务报表跨页表格提取
场景:财务报表中有跨页的大表格,传统工具会截断。
from unlimited_ocr import UnlimitedOCR
ocr = UnlimitedOCR(model_path="baidu/Unlimited-OCR")
# R-SWA 的连续上下文确保跨页表格完整提取
result = ocr.extract_tables(
input_path="financial_report.pdf",
output_format="csv",
context_length=32768
)
# 输出:完整的跨页表格,无截断
result.to_csv("extracted_tables.csv")
6.3 案例 3:学术论文批量解析
场景:批量解析 100 篇学术论文 PDF,提取摘要、方法、实验结果。
#!/bin/bash
# batch_parse_papers.sh
INPUT_DIR="./papers"
OUTPUT_DIR="./parsed"
MODEL="baidu/Unlimited-OCR"
mkdir -p "$OUTPUT_DIR"
for pdf in "$INPUT_DIR"/*.pdf; do
filename=$(basename "$pdf" .pdf)
echo "Processing: $filename"
python infer.py \
--model "$MODEL" \
--input "$pdf" \
--output "$OUTPUT_DIR/${filename}.md" \
--mode multi \
--extract-structure # 提取标题、摘要、章节
echo "Done: $filename"
done
echo "All papers processed."
7. 总结与建议
7.1 Unlimited-OCR 的核心优势
- ✅ R-SWA 注意力机制:32K 上下文连续解析,解决长文档 OCR 痛点
- ✅ MoE 架构:3B 总参数,0.5B 激活,消费级 GPU 可运行
- ✅ SOTA 准确率:OmniDocBench 93.92%
- ✅ vLLM 加速:生产环境吞吐量提升 3-5 倍
- ✅ 完全开源:Apache 2.0 协议,无 API 调用费用
7.2 适用场景
推荐使用: - 长文档批量解析(技术手册、财务报表、学术论文) - 跨页表格提取 - 多语言混合文档识别 - 数据隐私要求高的场景(本地部署)
不推荐使用: - 单页简单文本(用 Tesseract 更轻量) - 实时视频流 OCR(延迟较高) - 无 GPU 环境(CPU 推理太慢,建议用百度企业级服务)
7.3 下一步行动
- 快速体验:使用 Hugging Face 在线 Demo
- 本地部署:参考第 5 节部署指南
- 生产环境:使用 vLLM 加速 + Docker 容器化
- 企业级服务:访问 百度 AI 开放平台
参考链接: - GitHub 仓库:baidu/Unlimited-OCR - Hugging Face 模型:baidu/Unlimited-OCR - vLLM 文档:vLLM 官方文档 - 百度企业级服务:Unlimited-OCR 企业版