带审计追溯的文档 OCR
大多数 OCR 只丢给你一堆得照单全收的文字。space-ocr 则为每个值附上一处经过核验的页面定位——包围框、顶点和匹配率——让任何字段都能回溯到它所来自的那几个像素。
从文档里提取数据,做个演示很容易,要让人放心却很难。模型读了一张发票,返回 total: 2,045,于是你面对一个再高的置信度分数也答不上来的问题:这到底是页面上真正印着的数字,还是模型自己生成出来的? 如果只是临时查一下,那无所谓。但换成记账、理赔、合规,或任何会被审计的场景,“相信模型就好”根本算不上一道控制。
审计追溯正是为此而生。每个字段返回的不再是一个孤零零的值,而是连同一处经过核验的页面定位一起返回——这样一个人(或另一套系统)就能直接跳到这个值被读取的那几个像素上去确认。这就是“一个答案”和“一个你拿得出去、站得住脚的答案”之间的区别。
亲眼看看:每个值都能追溯回原文
把鼠标悬停到下面任意字段上。小票上的方框就是这个值被读取的位置——而且每个字段都带着自己的匹配率。

Each value with a box carries a verified on-page location — bbox + 4-point vertices + match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.
“经过核验的定位”到底指什么
space-ocr 会在每个提取值旁边返回三样东西:
bbox——一个轴对齐矩形{ xmin, ymin, xmax, ymax },位于一张 0–1000 归一化网格上(0,0 = 左上角,1000,1000 = 右下角),与图片实际像素尺寸无关。vertices——四个有序顶点{x, y}(左上 → 右上 → 右下 → 左下),构成一个带方向的方框,会跟随文档的倾斜角度,所以即使是拍歪了的手机照片也能框得干干净净。match_ratio——这个值的字符里,实际在页面上被定位到的比例(0–1)。当字段达到 ≥ 0.85 时即视为已可信匹配;1.0表示每一个字符都被找到了。
因为定位是跟着值一起走的,结果就不再是个黑盒。你可以把方框画出来、引用坐标,或者重新核查一个被标记的字段,全程都不必重新跑一遍 OCR。
这些坐标可不是模型说了算。 语言模型只返回每个值的文本——以及它用了哪些词元(word token)的提示——但从不返回方框本身。随后引擎会把这段文本与视觉 OCR 在页面上实际检测到的符号逐字符匹配,于是方框落在这些字符真正被找到的像素上,每个值也随之得到一个匹配率:它的字符里实际被定位到的那一份比例。模型给的词元提示可能带噪声——它有时会在重复的行之间把提示弄混——因此系统用列一致性和行一致性检查去验证这些提示,而不是盲目信任。重点不在于 AI 不会出错;而在于每个值都会拿回页面去对照核验,并附带一个分数告诉你它匹配得有多好。
点一下值,就落到对应像素上
在应用里,这变成了一种交互:点击任意单元格,原图就会高亮出这个值所来自的那个方框,配上放大的局部裁切和一条连接线。这是抽查一整批结果最快的方式——你的目光直奔那个位置,而不用把整份文档从头扫一遍。
人工修改也同样可审计
审计追溯不只关乎机器的输出——它还关乎人改了什么。当你编辑一个单元格时,space-ocr 会把你的修改与原始 OCR 值分开存储。一个原始值(Original)提示框始终显示引擎最初读到的内容,这样审核者就能把机器值和人工覆盖值并排对照着看。
这就在 API 里,覆盖每一个值
这不是一个只在 UI 上才有的功能。POST /ocr/fields 会在每个提取值上返回同样的 bbox、vertices、match_ratio 和 bbox_source,并附带一个 field_bboxes 映射,逐字段给出坐标。当你用 GET /view 查询一张已存储的表时,这些方框默认会一并返回——只有当你想要更精简的负载时,才加上 boxes=0。
{
"status": "success",
"data": {
"total": "2,045",
"field_bboxes": {
"total": {
"bbox": { "xmin": 595, "ymin": 974, "xmax": 781, "ymax": 1000 },
"vertices": [
{ "x": 594, "y": 975 }, { "x": 781, "y": 972 },
{ "x": 781, "y": 998 }, { "x": 595, "y": 1000 }
],
"match_ratio": 0.93,
"bbox_source": "vision_symbol_match"
}
}
}
}bbox_source 告诉你每个坐标是怎么得来的——vision_symbol_match 是常规的逐字符匹配路径(携带它真实的 match_ratio),token_id 表示用到了某个词元提示,而 low_confidence 则标记出一个值得复查的弱匹配。这是一份你可以记录、过滤,或呈现给审核者看的元数据。
实际操作中如何核验一个值
- 打开提取结果打开表格,或调用 GET /view——每个值都带着它的 bbox、vertices 和 match_ratio。
- 点击该值点击单元格,高亮出它在原图上被读取的确切区域。
- 查看匹配率match_ratio 为 1.0 表示每个字符都被定位到了;低于 0.85 则标记出一个值得仔细看看的值。
- 需要时进行修正编辑单元格以覆盖它——为留下审计追溯,原始 OCR 值会被保留在 Original 提示框里。