Files
tech/微信公众平台/刘君杰/2026-07-31_深度解读百度Unlimited_OCR.md
arno 6ef0d3a091 文档(金鹏): 新增 2026-07-31 文章归档
- 汇总 2026-07-31 微信公众号 20 篇文章正文与摘要
- 金鹏.md 新增当日五大主题板块(AI办公、制造业AI、Agent自进化、OCR/TRIZ、AI治理)
- 配套 6 张主题配图
2026-07-31 13:07:41 +08:00

20 KiB
Raw Permalink Blame History

深度解读百度Unlimited OCR

来源:微信公众平台 作者:刘君杰 发布日期2026-07-31 原文链接https://mp.weixin.qq.com/s/_lHjaTgwRRMGY1bf_iMOxA


过去几年,OCR 看起来已经是一个很成熟的老问题了。

扫描件转文字、PDF 解析、合同识别、表格提取、公式识别,没一样是新鲜事。传统 OCR 时代,行业里最常见的做法是流水线:先检测版面区域,再识别文字,再解析表格和公式,最后靠各种规则把结果拼起来。这套系统很工程化,也确实能打,但毛病也明摆着,组件多、规则多、边界情况多,一碰上复杂 PDF、论文、杂志、PPT,问题就层出不穷。

后来,端到端 OCR 又火了。原因很简单:大模型来了。

既然大语言模型本来就擅长生成结构化文本,那能不能让视觉编码器先把页面压成视觉 token,再交给 LLM decoder 一口气吐出完整的解析结果?这么一来,检测、识别、阅读顺序、表格、公式,全都能塞进同一个生成过程里。

这条路的代表之一是 DeepSeek OCR。而百度最新推出的 Unlimited OCR 又往前迈了一步:它不满足于让模型识别一页 PDF,而是想让模型一次性读很多页,甚至几十页。论文给这个方向起了个名字:one-shot long-horizon parsing,也就是"一次前向的长程解析"。

听上去,好像把上下文窗口做长就完事了。

但这篇论文最有意思的地方,恰恰是它没走这条简单粗暴的路。它提出了一个很朴素、很像人的办法:不要什么都记住,只记该记的。

一、OCR 最大的瓶颈,已经从"看不清"变成"写不完"

传统 OCR 的核心问题,是看清楚页面上到底有什么。端到端 OCR 则多了一层:看清楚之后,还得把内容完整地生成出来。

如果只处理一页 PDF,这事问题不大。页面经视觉编码器压缩后,LLM decoder 慢慢生成文字、公式、表格结构,KV cache 虽然会变大,但还在可接受范围内。可一旦从"一页"变成"几十页",麻烦就来了。

假设要解析 20 到 30 页 PDF。论文给了个直观的估算:如果视觉 token 和输出文本 token 的比例约为 1:10,那 10K 个视觉 token 就可能对应 100K 以上的输出 token。对普通的 LLM-driven OCR 来说,这意味着巨大的 KV cache 存储和注意力计算压力。

这才是长文档 OCR 真正的难点:不是模型不会做 OCR,而是生成过程越拖越长,历史越攒越厚,KV cache 越积越多,推理速度自然越来越慢。

标准 Transformer 的注意力机制有个天生的毛病:每生成一个新 token,都得把前面生成过的 token 全留在 KV cache 里。输出越长,缓存越大;缓存越大,算得越慢。于是模型解析第 1 页还飞快,解析到第 20、30 页时,速度就肉眼可见地往下掉。

这跟人抄书完全不是一回事。人抄一页书,确实会看原文,也会瞄一眼刚写下的那几个字,确认自己没抄串行,但没人会每写一个字,就回头把前面抄完的几万字重读一遍。

人是持续工作的,但不是全量记忆的。

这篇论文的切入点正在这里:长程解析不一定需要完整历史,它更需要的是一种工作记忆。

二、R-SWA:原文永久保留,刚写过的内容滑动保留

Unlimited OCR 的核心改动叫Reference Sliding Window Attention,简称R-SWA。名字有点长,想法其实不复杂,它把模型解码时能看到的内容拆成了两部分。

第一部分是Reference,参考信息。在 OCR 里主要就是视觉 token 和 prompt,它们代表原始页面,是模型必须自始至终看得见的东西。第二部分是Working Memory,工作记忆。它不是全部历史输出,而只是最近生成的 n个 token,论文默认 n=128。

换句话说,每生成一个新 token,模型能看见的是:原始 PDF 页面压缩后的视觉信息、任务 prompt、以及最近生成的 128 个输出 token。再往前那些已经生成的内容,它就看不见了。

这就像人抄书:眼睛一直盯着原书,手边只需扫一眼刚写过的一小段,确认自己写到哪儿了。

公式看着跟标准 attention 一样,关键差别只在于可见集合 N(t)。标准 attention 里,当前 token 看得见所有 prefix 加所有历史输出;R-SWA 里,当前 token 只看得见所有 reference 加最近 n个输出 token。

这个差别很要紧。如果只是普通的滑动窗口注意力,模型可能会把视觉 token 也一并滑出去,或者让视觉信息卷进某种状态递推里。这对 OCR 是有害的,因为视觉信息是"原稿",不是"记忆""原稿"不能随着生成过程被反复压缩、更新、模糊。R-SWA 的设计就一句话:原稿永远在,历史只留近处。

这也是它跟线性注意力的分野所在。线性注意力常常依赖某种 recurrent state,把历史压进一个状态里。但 OCR 的参考信息经不起这么递推:视觉 token 一旦被递推压缩,细节就可能被稀释。而对文档解析来说,少一个小数点、错一个公式符号、漏一条表格边界,都是实打实的错误。

所以 R-SWA 的结构相当克制:视觉 token 不动,输出 token 滑动。

三、真正省下来的,是 KV cache

R-SWA 最直接的收益,不在概念层面,而在 KV cache 上。

标准 MHA 的 KV cache 长度 = Lmprefix 长度)+ T(已生成输出 token 数)。随着 T 变大,KV cache 会线性膨胀。

R-SWA 不一样。它保留完整的 prefix,但输出侧只留最近 n 个 token,所以 KV cache 长度 = Lm + n。

也就是说,模型输出的内容再多,输出侧缓存最大也就是 n(论文默认 128)。

举个例子。假设 Lm = 10000(视觉 token 加 prompt 共一万个),窗口 n=128,输出长度 T=100000。

标准 MHA 的缓存长度是 10000 + 100000 = 110000。

R-SWA 的缓存长度是 10000 + 128 = 10128。

缓存比例约为 10128/110000 ≈ 9.2%。

也就是说,在这个例子里,R-SWA 只需要标准 attention 不到十分之一的 KV cache。要是把输出拉到 100 万 token,标准 MHA 得存 101 万长度的 cacheR-SWA 仍然守在 10,128 附近,比例会进一步压到约 1%。

这就是论文标题里 "Unlimited" 的底气所在。它不是说模型真有无限上下文,而是说在长输出场景里,输出侧的 KV cache 不再随生成长度无限膨胀。

四、别把"参考资料"和"工作记忆"混为一谈

论文图 1 画得很清楚。左边是 Vanilla Attention:模型不停生成,KV cache 越拖越长,每个新 token 都得面对越来越厚的历史,完整是完整,但也越来越笨重。右边是 R-SWA:视觉 token 作为 reference 一直保留,输出 token 只留最近一个窗口,新 token 一生成,旧的输出 token 就被挤出队列,整个队列容量固定在 Lm + n。

图 2 则把这套逻辑讲得更像人。人抄书时,注意力其实只落在三个点上:原书、刚写过的一小段、下一个要写的字。模型也照这个思路搭:DeepEncoder 把页面压成视觉 tokenMoE-LLM decoder 负责生成解析结果,R-SWA 则保证 decoder 既能一直看见原文,又不会被无穷无尽的历史输出拖死。

这个设计背后藏着一个挺大的启发:很多长任务,并不需要模型记住完整历史,它需要的是持续状态。

完整历史和持续状态,是两码事。拿 OCR 来说,模型要知道自己解析到哪儿了,要保持阅读顺序,要把表格结构延续下去,要避免重复输出,但它真没必要在生成第 5 万个 token 的时候,还回头去看第 500 个 token 的具体内容。当一个任务的主要依据是外部 reference(图片、音频、源语言文本),那历史输出更像一根进度条,而不是一座知识库。

这正是 R-SWA 值得琢磨的地方。它没打算让模型"什么都记住",而是把记忆分成了两类:

记忆类型 在 OCR 里对应什么 是否长期保留 作用
Reference memory PDF 图像 token、prompt 保证模型一直看得到原文
Working memory 最近生成的 n 个 token 否,滑动保留 保证模型知道当前进度和局部格式
前几轮输出历史 很早之前生成的文字 大多数时候可以忘掉

这一点,和人类干活的方式几乎一模一样:我们从来不是靠无限记忆完成长任务,而是靠"参考物 + 当前进度 + 局部上下文"。

五、为什么少看历史,准确率反而更高?

按直觉,attention 看得越多、信息越完整,效果就该越好。但 OCR 不是开放式创作。

OCR 的核心任务,是把 reference 里的信息忠实地转写出来。模型最该盯着的,是原图和当前附近的上下文;太远的历史输出,很多时候不光帮不上忙,反而可能干扰判断。

论文的实验也支持这个判断。在 OmniDocBench v1.5 上,DeepSeek-OCR 的 Overall 是 87.01Unlimited-OCR 提升到 93.23,涨了 6.22 分;Text Edit Distance 从 0.073 降到 0.038Formula CDM 从 83.37 提升到 92.61Table TEDS 从 84.97 提升到 90.93,阅读顺序的 Edit Distance 也从 0.086 降到了 0.045。在 v1.6 上,Unlimited-OCR 的 Overall 达到 93.92,略高于 Qianfan-OCR 的 93.90,也高于 FireRed-OCR、Logics-Parsing-v2、dots.ocr 等一众同类端到端模型。

指标 DeepSeek-OCR Unlimited-OCR 变化
Overall 87.01 93.23 +6.22
Text Edit 0.073 0.038 -0.035
Formula CDM 83.37 92.61 +9.24
Table TEDS 84.97 90.93 +5.96
Read-order Edit 0.086 0.045 -0.041

这组数字有点反直觉。Unlimited-OCR 既没把模型做得更大,也没让 decoder 看更多历史,它干的恰恰相反,是把标准 attention 换成了更受限的 R-SWA。

那为什么还能涨?一个合理的解释是:R-SWA 给 OCR 注入了更强的任务归纳偏置。OCR 要的不是"自由联想",而是"忠实抄写"。Full attention 把所有历史输出一股脑摆在模型面前,反倒容易让它在长生成里被旧内容牵着走;R-SWA 则强行把模型按回到原始 reference 和当前局部进度上。

有点像考试抄题:你只需要看着题目和刚写过的几行,犯不着把整张答卷从头到尾再读一遍。看太多,反而容易分心。

六、真正要命的是延迟曲线

准确率是一方面,速度是更要命的另一面。

论文图 3 对比了 DeepSeek OCR 和 Unlimited OCR 在 Flash Attention v3 kernel 上的 per-call duration,趋势相当明显:DeepSeek OCR 的标准 MHA 随着 decode step 增加,单次调用延迟一路往上爬,中间还会冒出跳变;Unlimited OCR 的曲线则基本是平的。论文的解释是,DeepSeek OCR 那些 spike,来自 KV cache 长度跨过某些对齐边界后数据传输效率的骤降,而 R-SWA 因为缓存长度固定,压根没这个问题。

这张图一句话就能概括:标准 attention 越写越慢,R-SWA 一直匀速写。

这对长文档 OCR 太关键了。只解析一页,慢一点无所谓;可一旦要解析 40 页、100 页,速度稳不稳就成了产品体验问题。用户最怕的从来不是慢,而是越跑越慢,跑到后面像卡死了一样。

论文表 4 也佐证了这点:

输出长度 DeepSeek OCR TPS (每秒生成词数) Unlimited OCR TPS
256 7229.32 7229.52
1024 7422.50 7840.94
2048 7166.85 7881.11
4096 6430.21 7905.18
6144 5822.87 7847.71

输出 256 token 时,两者几乎一样。但输出长度增加到 6144 tokenDeepSeek OCR 掉到了 5822.87 TPSUnlimited OCR 还稳在 7847.71 TPS。论文的结论是,在 6000 token 附近,DeepSeek OCR 比 Unlimited OCR 慢了约 35%。而且这个差距,会随着输出继续拉长而越拉越大。

七、长程解析:40 页不是终点,但已经说明问题

Unlimited OCR 最想证明的能力,是多页 one-shot OCR。

论文自己构造了一个长文档测试集,选了小说、文档、论文等材料,按 2、5、10、20、40+ 页分档测试,评价指标用了 Edit Distance 和 Distinct-n。Distinct-n 可以理解成生成文本中不同 n-gram 的占比,越高说明模型越没陷进重复输出的坑里。结果如下:

页数 Distinct-20 Distinct-35 Edit Distance
2 99.76% 99.87% 0.0362
5 99.78% 99.98% 0.0452
10 97.49% 99.83% 0.0526
15 99.92% 99.99% 0.0787
20 98.73% 99.89% 0.0572
40+ 96.08% 96.90% 0.1069

这张表说明两件事。一是模型在 20 页以内相当稳,20 页时 Edit Distance 还只有 0.0572Distinct-35 仍接近 99.89%。二是到了 40+ 页,错误明显增多,但没有崩:Edit Distance 升到 0.1069Distinct-35 还有 96.90%。论文认为,这些重复错误主要来自多页条件下用了 1024 x 1024 的 Base 分辨率,有些小字本身就难辨认,而不是 R-SWA 在长程解析里把方向跑丢了。

这点很重要。长程 OCR 最怕两类失败:一类是越到后面越慢,一类是越到后面越乱,重复输出、漏页、串页、阅读顺序崩盘。R-SWA 至少证明了一件事:把历史输出掐到 128 token,并不会让模型在多页 OCR 里天然迷路。只要 reference 一直在视野里,模型靠一个短窗口就能撑住解析进度。

八、训练成本并不夸张,具有工程学意义

这篇论文还有个值得留意的地方:它不是纯理论脑洞,工程味很足。

Unlimited OCR 是基于 DeepSeek OCR 模型进行增强预训练的。训练数据约 200 万条文档 OCR 样本,单页和多页比例 9:1;多页数据约 20 万条,由单页数据拼接合成,每条含 2 到 50 页,页与页之间用分隔符隔开;所有数据被打包进 32K 的训练长度里。Unlimited OCR 在训练过程中将 DeepEncoder(视觉编码器)冻结,仅针对 LLM 参数进行训练。训练过程共持续 4000 steps,全局批大小设为 256,最大支持 32K 的上下文序列长度。硬件是 8x16 张 A800。推理侧则在 Transformers 和 SGLang 里实现了 R-SWA 的 KV cache 管理,让模型能在恒定 TPS 和恒定 GPU memory 下跑。

这说明作者并没有从零训一个 OCR 大模型,而是在现成的 DeepSeek OCR 架构上把 decoder attention 一换,再做继续训练。

这恰恰让 R-SWA 的意义更突出。要是连模型、数据、训练规模一起换,那提升到底来自哪儿就说不清了;而这里的关键变量相对干净:DeepEncoder 保留,基础模型保留,核心改动就是把标准 MHA 换成 R-SWA。当然得承认,论文也用了 200 万 PDF 文档数据继续训练,所以不能把全部提升都简单算到 R-SWA 头上。但单看长程推理的 cache 曲线和延迟曲线,R-SWA 确实把标准 attention 那个核心瓶颈给解掉了。

九、这不是"无限 OCR",至少现在还不是

标题虽然叫 Unlimited OCR,但论文自己也老实承认:它还不是真正的 unlimited。

原因在于,R-SWA 解决的是输出侧 KV cache 的增长问题,没解决输入侧 prefix 的无限增长问题:视觉 token 终归还是要 prefill 的。虽然 DeepEncoder 已经能把 1024 x 1024 的 PDF 图片压到 256 个 token,但页数一多,prefix 还是会变长。几十页设备内存扛得住,上百页、上千页就会撞上上下文长度的天花板。

论文目前是在标准 32K 的最大长度下做长程解析。短期方向是训练 128K 这类更长上下文的模型,支撑更多页面的 prefill。长期方向就更有意思了:构建一个 prefill pool,让模型学会自己去取需要的 prefill KV chunk,模拟人翻书的动作。

这才是真正逼近"无限"的路线。人读书也从不是把整本摊在眼前:人会翻页、会回看、会按章节定位。模型要是也能在 reference pool 里主动取用相关页面,那它就不再只是个固定长上下文,而是一套带检索和工作记忆的长程解析系统了。

换句话说,R-SWA 解决的是第一步:生成过程别越写越重。下一步要解决的是:参考资料别一次性全塞进上下文。这两步都迈过去,OCR 才算真的逼近 unlimited。

十、为什么这篇论文,不只关于 OCR

这篇论文最容易被低估的,就是大家可能只把它当成一次 OCR 模型优化。但 R-SWA 的思路,其实泛化得多。

它适合一整类 "reference-based generation" 任务:模型生成的内容主要依赖某个固定的参考源,而生成历史只负责维持局部连贯和进度。

OCR 是这样。ASR 大概也是这样:reference 是音频特征,输出是转写文本;长音频转写时,模型未必要回看完整的历史 transcript,有音频 reference 加最近的文本上下文就够了。翻译可能也是这样:reference 是源语言文本,输出是目标语言文本;长文档翻译时,模型需要一直够得着源文档,但目标侧的历史也许只需保留局部上下文。论文也明说了,R-SWA 将来可以迁到 ASR、translation 这些 reference-based 任务上。

更大的启发是:很多长任务的瓶颈,不一定非得靠"更长上下文"来解。

更长上下文当然有价值,但它从来不是免费的:上下文越长,KV cache 越大,延迟越高,显存越紧,调度越复杂。R-SWA 给的是另一条路:让模型自己去分"长期参考"和"短期工作记忆"。该一直看的,一直看;该忘的,果断忘。

这比单纯堆上下文,更像一个真实的智能系统该有的样子。

十一、这篇论文真正值得记住的一句话

Unlimited OCR 的核心,其实不是 OCR。它真正想说的是:长程任务不一定需要无限记忆,它需要的是正确的记忆结构。

标准 full attention 像一个过分认真的人:每写一个字,都要把前面写过的所有字重新翻一遍。普通 sliding window attention 又像一个健忘的人:写着写着,连原文都看不见了。R-SWA 卡在这两者之间:让模型始终看得见原文,同时只留最近的输出。原文是 reference,最近输出是 working memory,更早的输出则自然淡出。

这就是论文里反复强调的 "soft forgetting"。

遗忘不是缺陷。在长程解析里,遗忘反而是一种能力:只有学会忘掉那些不必要的历史,模型才能把宝贵的注意力和显存,留给真正重要的信息。

十二、最后的判断

这篇论文的价值,可以分三层看。

第一层,是 OCR 的产品价值。Unlimited OCR 证明了,端到端 VLM OCR 不一定只能一页一页啃:只要 attention 设计得当,多页 one-shot parsing 是可行的。对合同批量解析、论文 PDF 解析、档案数字化、财报识别这类场景,这会直接影响吞吐和体验。

第二层,是推理效率的价值。R-SWA 把输出侧的 KV cache 从 Lm + T 变成了 Lm + n。这不是小修小补,而是复杂度结构上的改变:输出越长,优势越大。长文档、长音频、长翻译,都能从这种结构里受益。

第三层,是模型架构上的启发。过去大家谈长上下文,默认方向几乎都是把窗口往大里做,32K 到 128K,再到 1M。但这篇论文提醒我们,真正的长程能力不只是"看得多",还包括"知道哪些该一直看、哪些该暂时看、哪些可以忘"。

这对 OCR 是一次架构优化,对长程多模态任务,则可能是一个更大的信号:未来的模型,未必都得背着越来越沉的历史往前挪。它们更可能像人一样:看着参考资料,攥着工作记忆,边做边忘,持续向前。