- 汇总 2026-07-31 微信公众号 20 篇文章正文与摘要 - 金鹏.md 新增当日五大主题板块(AI办公、制造业AI、Agent自进化、OCR/TRIZ、AI治理) - 配套 6 张主题配图
20 KiB
深度解读百度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 长度 = Lm(prefix 长度)+ 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 万长度的 cache,R-SWA 仍然守在 10,128 附近,比例会进一步压到约 1%。
这就是论文标题里 "Unlimited" 的底气所在。它不是说模型真有无限上下文,而是说在长输出场景里,输出侧的 KV cache 不再随生成长度无限膨胀。
四、别把"参考资料"和"工作记忆"混为一谈
论文图 1 画得很清楚。左边是 Vanilla Attention:模型不停生成,KV cache 越拖越长,每个新 token 都得面对越来越厚的历史,完整是完整,但也越来越笨重。右边是 R-SWA:视觉 token 作为 reference 一直保留,输出 token 只留最近一个窗口,新 token 一生成,旧的输出 token 就被挤出队列,整个队列容量固定在 Lm + n。
图 2 则把这套逻辑讲得更像人。人抄书时,注意力其实只落在三个点上:原书、刚写过的一小段、下一个要写的字。模型也照这个思路搭:DeepEncoder 把页面压成视觉 token,MoE-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.01,Unlimited-OCR 提升到 93.23,涨了 6.22 分;Text Edit Distance 从 0.073 降到 0.038,Formula CDM 从 83.37 提升到 92.61,Table 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 token,DeepSeek OCR 掉到了 5822.87 TPS,Unlimited 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.0572,Distinct-35 仍接近 99.89%。二是到了 40+ 页,错误明显增多,但没有崩:Edit Distance 升到 0.1069,Distinct-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 是一次架构优化,对长程多模态任务,则可能是一个更大的信号:未来的模型,未必都得背着越来越沉的历史往前挪。它们更可能像人一样:看着参考资料,攥着工作记忆,边做边忘,持续向前。