同样的文档,同样的模式,不同的答案: space-ocr vs Mistral
8份高难度文档、463个字段、每个引擎3轮的受控基准测试:字段读取率、多轮稳定性,以及分数表看不到的坐标差距。
每家OCR厂商的演示都能完美读出一张干净的打印发票,我们也不例外。但这对你的选型决策毫无信息量。真正重要的问题有三个:碰到难的文档会怎样?同一页跑两次,答案会不会变?不把每个值都人工复核一遍,怎么找出读错的值?
所以我们直接测了。从自家的回归语料里挑出最难的8份文档,给space-ocr和Mistral Document AI发送完全相同的请求,用同一个脚本评分。这篇文章就是结果,方法写得足够细,想反驳的人可以精确地反驳。
设置如下:8份真实文档(几张日文送货单、一张商品名和数量单价分打两行的超市小票、一张对着显示器拍摄的22行批发行情表、一张佣金明细),共463个可评分字段。三个测试组拿到完全相同的图片、字段模式和「按印刷原样提取」的指令:space-ocr生产环境的字段提取API、Mistral OCR加JSON模式注释(mistral-ocr-latest)、Mistral视觉大模型加结构化输出(mistral-medium)。每组跑3轮,按去空白后的精确匹配对照冻结的标准答案评分,72轮原始输出全部存档。2026年8月。

先说结果。space-ocr在463个字段中以精确匹配读出91.1%(3轮平均)。Mistral OCR注释是70.0%,视觉大模型是73.5%。为排除格式噪音,我们把只差分隔符或空格的不一致全部剔除,只数内容错误:每轮space-ocr约23个,Mistral两组分别是119个和93个。
在下结论之前有件事值得先说清楚:Mistral认字认得不错。在这组里最干净的文档,那张22行的打印行情表上,Mistral OCR以141中139和我们打平。差距是在文档结构变得棘手时拉开的。在那张商品名一行、数量和单价另起一行的小票上,Mistral每轮13个字段只拿到2.3个:它把合计区块卷进了商品行,配不上那两行。在杂乱的送货单上,数量跑进了规格列。字大多是对的,字落进的表格是错的。
稳定性本身就是一个发现。同样的输入跑3轮,我们的总分波动16个字段,Mistral OCR波动100个。一小时前还能读出72中58的文档,下一轮变成3,43行表格的每一列都被悄悄打乱。响应里没有任何信号告诉你,你刚付费的是哪一种轮次。

这张图才是真正的论点,而它在任何分数表里都看不到。那张行情表上,space-ocr返回了138个方框,每个字段一个,各自钉在读取它的像素上。Mistral给整张表返回了一个矩形,因为它的响应里根本不存在字段级坐标,任何文档都一样,区块轮廓就是极限。也没有任何校验信号。Mistral读错的时候是悄悄读错的,找出来的唯一办法是全部复核。
space-ocr的每个值都带着方框、说明框下文字是否吻合的text_verified、带原因的needs_review,这个版本起还有ocr_confidence分数,以及给页面上重复出现的值用的label锚点。这次基准测试的诚实总结不是Mistral不会读,干净的印刷品它读得挺好;而是一个API告诉你哪些答案可以信,另一个要求你全信。
校验的工作方式:语言模型只返回值和词元提示,从不生成坐标。引擎把每个返回值与OCR环节在页面上实际检测到的符号逐字符比对,以match_ratio打分(0.85以上算确信匹配),再让两个引擎互相核对,不一致就成为带原因的needs_review标记。方框是xmin/ymin/xmax/ymax,0到1000归一化。关于上面数字的一条公平性说明:标准答案是按我们管线的输出习惯冻结的,所以包括我们在内的所有实时引擎都会因边界切分差异被扣分。绝对值请当下限看,相对比较才是结论。完整方法和72轮原始输出都有存档。
价格也照基准测试文章的样子直说:每张成功扫描$0.05,失败自动退款,每月前100页免费,不用绑卡。在相信任何人的图表之前,包括这篇文章的,拿你自己的5份文档在两边都跑一遍。下面的步骤就是我们用的流程。
- 挑难啃的文档,不要演示样张选5到10页真正折磨人的:多行记录、重复的值、拍屏照片、密集表格。干净的样张分不出厂商高下。
- 固定一套模式和指令字段清单只写一次,用同样的名称和描述原样发给每个引擎。要求按印刷原样返回值。
- 先手写标准答案在跑任何东西之前,把每个字段的期望值抄下来,之后不再修改。
- 每个引擎至少跑3轮只跑一轮会掩盖不稳定。所有轮次用同一个脚本评分,看波动而不是只看平均。
- 单独统计无声的错误每个错误值都记下引擎是否给了标记。带标记的错值只花你一眼,没有信号的错值花的是你在它上面搭的整个流程。