先 OCR 再喂给大模型,还是把整页直接交给模型?
从扫描件里取出结构化字段,有两条路。熟悉的那条:先做 OCR 得到文本,再把文本交给语言模型。较新的那条:把页面图像直接交给多模态模型,跳过文本这一步。
文献开始倾向第二条——2025 年的一项对比(arXiv:2509.04469)发现,在发票上多模态模型常常胜过 OCR→文本这条链,因为表格结构和签名的位置携带了 OCR 会丢弃的含义。我们在同一个产品里同时跑这两条路、按文件类型选择,而我们自己的实测远没有那么一边倒。本文讲我们测到了什么,包括代价最大的那一课:决定文件走哪条路的那个判据很容易做错,而且错得看起来毫无问题。
两条路各自真正丢掉的是什么
区别不在"准确率"。字符两边都读得好。区别在于:一切不是字符的东西会怎样。
OCR 把页面压平成文本流。表格变成一串单元格内容,某个值原本在哪一列,只能靠词序去推断。签名变成空无,或者一个垃圾词元。并排的两个格子变成一行。版式原本告诉你的一切,都得由模型从词序里重建。
视觉路径保住了页面。模型能看见某个值在表格第三列、印章压在某个栏位上、某个格子是空的而不是不存在。对一张表格——而正式文件就是表格——这是大量的信号。
视觉路径的代价是词元。以可用分辨率渲染的一页,其昂贵程度是一页文本所没有的,而且这个成本随你发送的页数增长。
我们完全没测出差别的地方
我们的不动产登记摘要——五页,电子出具,带真实文本层——过去因为一个开关被强制走视觉路径。
我们用同一个文件跑了两条分支,逐个叶子值比对:48 个值,零差异。 登记号、登记价值、面积、地址,以及两串 32 字符的签名证书哈希——最后这一对恰恰是当初设这个开关要读的小字——全部一致。
于是我们关掉了它。让这件事"安全"而不只是"更便宜"的,是两个事实:
- 扫描的摘要仍然走视觉路径。 路由器直接去问 PDF:你有没有自己的文本层。这是那个直接的问题。
- 图像预算本来也覆盖不了整份文件。 在五页的摘要上,每次请求的图像额度只够到第 1–2 页。第 3–5 页——权利与限制——无论开关如何都是以文本形式送达的。
第二点值得停一下:我们一直在为视觉付费,而在文件的大部分上拿到的恰恰是文本路径。
差别决定性的地方
同样的对比放到中国报关单上,结果反了过来,而且差距不小。在文本分支上:
- 发货人一行里的两个企业代码都消失了——那里是
(...)(...),两个代码,压平只留下了一个; - 一个在页面上是空白的格子,被编造出了一个出口日期。
第二种失效才应当决定你的架构。缺失的值是你看得见的缺口;给空格子填上一个合理的值,是一个能挺过你所有检查的缺陷,因为它看上去哪里都不像错的。视觉路径没有这么做,因为它看得见那个格子是空的。
密集的表格式表单,正是视觉路径挣回成本的地方:许多小格子、位置性含义,以及必须保持为空的空格子。
那个会骗你的判据
下面是代价最大的一课,本节因它而写。
自然的路由方式是:这份 PDF 有没有文本层?有就走文本路径,没有就走视觉。便宜、本地、正确——直到来了一份文件,它的文本层是别人放进去的。
我们就撞上一份:一张结婚证扫描件,带着发送方某个工具嵌入的 OCR 层。六百个字符的自信乱码——西里尔字母混着零星的韩文和中文字形,词被砸成毫无意义的碎片。对一个"有没有文本层"的检查来说,这份文件看上去就是干净的数字 PDF。而它其实是一张照片,外加一份钉在上面的糟糕转写。
两条教训:
- "有文本层"不等于"有可用文本"。 在信任它之前,先给找到的文本打分——文字体系是否一致、词典命中率、字母与垃圾的比例。
- 最便宜的判据,最可能在回答一个和你以为的不同的问题。 我们那条在回答"有没有人对它跑过 OCR",却被当成"这是不是一份数字文件"。
成本,以及其中让我们意外的部分
视觉路径的成本由你如何渲染页面决定,而不是由模型决定。我们此前把每页拆成若干小图块外加一张总览图发送——这是让模型读清小字的标准做法。
关掉分块、改为每页发送一张质量更好的总览图之后,图像词元在报关单上减少了 89%、在企业登记摘要上减少了 73%,同时把覆盖范围从两页提高到五页——预算能走得更远了。同样的账单,更多的文件。
大致格局:
| OCR → 文本 | 页面 → 视觉 | |
|---|---|---|
| 成本驱动 | 过 OCR 服务的页数 | 图像词元,由渲染配置决定 |
| 丢失什么 | 版式、表格结构、"空" | 结构上不丢 |
| 怎么坏 | 丢值、并格 | 成本与延迟 |
| 擅长 | 散文、长文档、数字 PDF | 密集表单、扫描件、表格 |
我们实际怎么路由
三个问题,按此顺序:
- 文件是否带有自己的文本层,且该文本是否可信? 两半都要。第二半是我们后来学会加上的。
- 这个文件类型是否密集且表格化? 报关单和多栏表单一律走视觉,因为文本路径在它们身上的失效方式是编造而非遗漏。
- 预算是否覆盖整份文件? 如果图像额度只够到 5 页中的第 2 页,你并不是在这份文件上跑视觉路径——你在跑一个混合方案却称之为视觉。要么提高预算,要么改渲染配置,要么承认自己在哪条路上。
其余一切走文本路径:更便宜,而且在我们测过的地方无法区分。
如果今天有人来问该怎么选
不要为整条流水线选一条路。按文件类型选,并且用你自己在自己的文件上跑出来的对比去选——逐个值比对,而不是看一个汇总分数。我们那次花了半天,改变了两个决定,方向还相反。
另外,要测"空"。我们知道的每一个质量指标都在奖励"给出一个合理的值"。而在表单上最要紧的失效,恰恰是在页面上什么都没有的地方给出一个值。
要点
- 这个选择关乎版式,而不是准确率。 OCR 压掉表格、位置和"空";视觉把它们留住。字符两边都读得好。
- 在一份数字摘要上,我们测得 48 个值零差异——那里的视觉开关是纯粹的额外成本。
- 在一份密集报关单上,文本路径为空格子编造了日期。 页面上没有东西却给出一个合理值,是下游任何检查都抓不到的失效。
- "有文本层"不等于"有可用文本"。 一层乱码的外来 OCR 能通过这个判据,把一张照片送上文本路径。
- 渲染配置主导视觉成本。 去掉分块让两类文件的图像词元分别减少 89% 和 73%,覆盖的页数反而更多。
FAQ
做文档抽取时,视觉模型总是优于 OCR 吗?
不是。在带有真实文本层、结构简单的文件上,我们完全没测出差别——48 个抽取值一致,视觉路径是纯粹的额外成本。它在密集表格式表单和扫描件上决定性地胜出,因为那里版式携带含义,而 OCR 会把它压掉。
怎么决定一份文件该走哪条路?
按顺序问三个问题:文件是否带有可信的自有文本;该文件类型是否密集且表格化;你的图像预算是否真的覆盖整份文件。第三个常被跳过,它会悄悄把"视觉"变成混合方案。
OCR-再-大模型这条路最大的风险是什么?
编造。当 OCR 把表单压平,空单元格可能是消失而不是以"空"的形式到达,模型就用一个合理的值补上空缺。我们正好见过——空格子上被编出的出口日期——而编造出的值能通过任何寻找缺失数据的检查。
为什么去掉图像分块能降本又不损质量?
因为分块把每次请求的图像预算花在了前几页而不是整份文件上。每页一张质量更好的总览图把图像词元削减了 73–89%,并让预算够到第五页而不是第二页。
PDF 的文本层可以信吗?
先打分再信。扫描件可能带着别人工具加上去的 OCR 层,满是乱码,而它会满足任何"这里有没有文本"的检查。在据此路由之前,先看文字体系是否一致、真实词汇与垃圾的比例如何。
结语
有意思的问题从来不是"OCR 还是视觉"。它是:页面上哪些部分携带的是非字符的含义,以及你的流水线能否区分"它读得懂的文件"与"仅仅带着文本的文件"。
在你自己的文件上做这个对比,比较数值而不是分数,并核实你的图像预算实际覆盖到哪里。在我们这里,它对两类文件给出了两个相反的决定——这是诚实的结果,而一个覆盖全流水线的单一选择会把它藏起来。
如果你想看看按文件类型决定路由的字段级抽取,试试 KTTC。
