← 返回公开文章

Unlimited-OCR 实测:one-shot 多页 PDF 解析是否真的强

/research/unlimited-ocr-web-test-report-shareable.md

生成时间:2026-06-23 版本:脱敏分享版

这次测试的目标不是看单张图片 OCR 能不能识别,而是验证 Unlimited-OCR 官方真正有区分度的路径:PDF 多页 infer_multi() / one-shot long-horizon parsing。测试方式是把这个路径接入一个本地 Web UI,然后用真实 PDF 文档跑一轮,对比 one-shot 多页解析和逐页循环解析的差异。

一句话结论

Unlimited-OCR 的 one-shot 多页路径确实可用,14 页 PDF 能一次性解析成功,文本覆盖率很好;但在这轮测试里,它没有比“同一个模型逐页循环解析”明显更快。

它的工程价值是真的:能把多页 PDF 一次性交给模型做连续解析,并输出结构化 Markdown。但如果只看短 PDF 或单页图片,它不会给人一种“肉眼震撼、碾压普通 OCR”的体验。

测试结论

这轮测试可以分成两层看。

第一,官方最强路径跑通了。Web UI 对 PDF 默认使用 one_shot,后端实际调用 model.infer_multi(),而不是把 PDF 拆成一页一页循环 OCR。测试用 Unlimited-OCR 官方技术报告的 14 页版本,300 DPI 渲染,one-shot 解析成功:

pages: 14
elapsed_seconds: 159.078
infer_seconds: 156.913
output_tokens: 13493
result_chars: 39891
norm_ratio: 0.9579
token_coverage: 0.9902

这说明它不是 README 里的纸面功能,而是能在本地 GPU 环境里跑通“多页 PDF 一次性连续解析”。

第二,这轮测试没有复现出 one-shot 相对逐页循环的明显速度优势。2 页、5 页、10 页测试里,one-shot 和 page-loop 耗时非常接近;10 页时 one-shot 反而略慢:

10页 one_shot: 110.796s
10页 page_loop: 104.142s

这不等于官方论文是错的。官方强调的强项主要是相对 DeepSeek-OCR 这类标准注意力解码器:长输出时,Reference Sliding Window Attention(R-SWA)可以避免 KV cache 随生成长度持续增长。这轮 baseline 是“同一个 Unlimited-OCR 模型逐页调用”,不是 DeepSeek-OCR 原始 full-attention baseline,所以不能用它来复现论文里的 35% 长输出吞吐优势。

实现了什么

测试用 Web UI 做了两个路径:

  1. pdf_strategy=one_shot

    PDF 先渲染成多页图片,然后一次性调用 model.infer_multi()。这是官方多页长文档路径,也是默认选项。

  1. pdf_strategy=page_loop

    PDF 先渲染成多页图片,然后逐页调用 model.infer(),最后拼接 Markdown。这个路径保留为 baseline。

Web UI 支持:

后端返回的关键健康信息类似:

{
  "pdf_supported": true,
  "pdf_strategies": ["one_shot", "page_loop"],
  "default_pdf_strategy": "one_shot",
  "max_pdf_pages": 20,
  "pdf_dpi": 300,
  "has_infer_multi": true
}

测试方法

测试文档使用 Unlimited-OCR 官方仓库中的技术报告 PDF,并切分为 2、5、10、14 页版本。

质量对比使用 PDF 内嵌文本作为 reference,做两个轻量指标:

这不是严格 OCR benchmark,但足够判断:

性能与输出规模

casestrategypageselapsed_secondsinfer_secondsoutput_tokensresult_charsok
paper2one_shot213.63813.32612582640True
paper2page_loop212.46612.1732653True
paper5one_shot540.36739.596372212313True
paper5page_loop539.77539.01712318True
paper10one_shot10110.796109.191955031151True
paper10page_loop10104.142102.66431177True
paper14one_shot14159.078156.9131349339891True

可以看到,one-shot 确实能处理 14 页,但在 2/5/10 页上没有比 page-loop 快。10 页时,one-shot 慢了约 6.65 秒。

文本相似度

casestrategyexpected_charsresult_charsnorm_ratiotoken_coverage
paper2one_shot383526400.97990.9936
paper2page_loop383526530.98090.9936
paper5one_shot13583123130.98510.9921
paper5page_loop13583123180.98520.9921
paper10one_shot28947311510.94080.9879
paper10page_loop28947311770.94170.9885
paper14one_shot38455398910.95790.9902

文本覆盖率整体很好,说明没有明显漏页。10 页相似度下降,主要来自公式、引用、检测框标记、版面结构和文本顺序差异;不是 OCR 完全失败。

这是否证明它“像官方说的那么强”

只能说:部分证明。

这轮测试证明了:

  1. infer_multi() 可用,不是 README 里的纸面接口。
  2. 14 页 PDF one-shot 成功,没有中途断页、服务崩溃或明显重复失控。
  3. 输出质量可用,token coverage 接近 0.99。
  4. Web UI 可以把官方最强路径作为默认 PDF 路径。

但这轮测试没有证明:

  1. one-shot 比逐页循环更快。
  2. Unlimited-OCR 比 DeepSeek-OCR 原始标准注意力模型快 35%。
  3. 它在 40 页、100 页这种更长文档上仍然稳定。
  4. 它比 PaddleOCR、MinerU、Qwen-VL、Gemini 等系统更适合所有文档。

关键原因是:这次 baseline 是 same model + page_loop,而不是官方论文中的 DeepSeek-OCR full-attention baseline。Unlimited-OCR 的 R-SWA 优势主要体现在“长输出时 KV cache 不随生成长度增长”,不是必然体现在“同一模型 one-shot 比逐页循环快”。逐页循环每页都短,反而可能因为任务拆小而更稳。

我的使用判断

我会把它定位为:本地长 PDF 到 Markdown 的实验型工作台。

适合使用的场景:

不适合把它当默认万能 OCR 的场景:

后续值得补的测试

如果要继续判断它是不是真的强,下一步应该补三组测试:

  1. 对照 DeepSeek-OCR 原模型

    这是复现官方性能 claims 的关键。

  1. 对照 PaddleOCR / MinerU

    这能回答“作为普通文档 OCR 工具,它是不是更好用”。

  1. 跑 20 页 / 40 页 / 更长文档

    重点观察耗时曲线、重复输出、后半段质量下降、显存峰值。

当前这轮的结论已经足够指导使用:Web UI 默认走 one-shot 是合理的,因为这是官方最强路径;但 page-loop 必须保留,因为短文档上它并不弱,甚至略快。