Mistral OCR vs space-ocr 第二回合:没人拿来做基准的照片
space-ocr 与 Mistral OCR 的受控基准扩展到 15 个用例、14 份文档、769 个字段:字段准确率、多次运行的稳定性、视觉大模型在旋转文档上的崩溃,以及一张把 ¥711 印了四行的小票。
本月早些时候,我们发布了与 Mistral Document AI 的受控基准。当时选的是难读的"文档";但生产环境送来的是难读的"照片"——旋转的、揉皱的、叠着的、盖着章的、深夜单手拍的。
于是我们补了 7 个正是这种照片的用例,把一切重测了一遍:15 个用例、14 份文档、769 个字段、每方各跑 3 次,所有参赛方同模式、同评分。这次 space-ocr 一方走的是公开 API——任何账号都在调用的那个 POST /ocr/fields。
| 769 字段 · 3 次运行 | space-ocr | Mistral OCR | 视觉大模型 (mistral-medium) |
|---|---|---|---|
| 字段准确率(精确匹配) | 89.2% | 69.3% | 66.8% |
| 同一输入 3 次运行的总分波动 | 6 个字段 | 106 个字段 | 53 个字段 |
两条阅读须知。标准答案固定了一种写法,所以每一方的绝对分都是下限——要看的是差距。而波动那一行比看上去重要:同样的输入跑两遍,一边给你能审的 diff,另一边给你噪声。
差距在哪里拉开
在最干净的文档上两边几乎打平。差距全部来自结构和拍摄条件变差的地方:
| 分条件得分 | space-ocr | Mistral OCR | 视觉大模型 |
|---|---|---|---|
| 干净的高密度印刷表格 | 1.000 | 0.986 | 0.960 |
| 两行明细的小票 | 0.718 | 0.179 | 0.077 |
| 针式打印单(横躺拍摄) | 0.872 | 0.778 | 0.217 |
| 复写联堆(横躺+盖章) | 0.833 | 0.611 | 0.130 |
| 深夜·写字板上 | 0.831 | 0.488 | 0.441 |
| 暗光·揉皱的配送单 | 0.912 | 0.898 | 0.830 |
表里最锋利的一行:视觉大模型在旋转面前崩溃——两份横躺文档上 0.217 和 0.130,而带 OCR 前端的参赛方读到 0.611–0.872。OCR 在读取前检测并归正方向;裸的视觉通路收到的就是旋转的像素。两份文档不构成定律,所以只说窄结论:在本语料里,3 次运行 3 次如此。
一张小票,四个 ¥711
最后一个新用例把抽象论证变成实物。这张 7-Eleven 小票上,711 出现在八个地方——合计、iD 支付、销售联金额、税额行都是 ¥711,电话号码、07:11 的时间、日期、单号里也藏着 711。
请求 total、id_payment、amount,读对的引擎会把同样三个字符返回三次。值与值无法自我区分,能说清来自哪一行的只有坐标。3 次运行里,三个字段每次都带着落在各自正确行上的框回来,坐标每次相同。只返回值的响应,连表达"读的是哪一行"的界面都没有——对与错,看起来一样。
一个画廊看完整个语料
这次测量用到的全部新照片。从列表里挑一张看——绿色框全部是引擎真实返回的坐标,交易方信息由我们打码。

仍然会漏过去的东西
这个 API 自带的校验层验证的是出处:框与文本在两个独立读取器之间逐字符一致。这批难拍的照片上残留的错误,大多正是我们一直明文列为范围之外的那类——两个读取器对同一个误读达成一致:被眩光烧白的字、被模糊化开的字。交叉校验抓不住共识错误。所以复核标记是把人的注意力路由过去的信号,不是替代;模式校验和业务规则仍要压在上面。
本文所有数字的统一标注:15 个用例 · 14 份文档 · 769 个字段 · 各 3 次运行 · 2026 年 8 月 · 所有参赛方同图同模式同评分 · space-ocr 经公开 API 测得。语料偏向高密度日文商业单据。新照片印有真实交易方信息,仅以上文打码版发布。只测字段抽取,不涉及 markdown 转换、速度或价格。