不必盲信的 AI OCR
space-ocr 用模型把文档结构化,再把每个值与页面上 OCR 检测到的文字比对。data.cells[path] 返回 box、quad、verified 与 review,data.review.flagged 就是待复核清单。
AI OCR 听起来像是杂乱文档的答案:把一张票据或发票交给模型,拿回干净的结构化字段。问题在于模型出错时会怎样。语言模型不论是否真的从页面上读到,都会返回一个自信、格式工整的值,而大多数工具把这个值交给你时,没有让你分辨真假的办法。
space-ocr 把职责分开。结构化由多模态模型来做,但模型不产生坐标;坐标只来自读取页面的 OCR 环节。抽取出的值随后与该环节检测到的文字逐字比对。返回的数据也这样分开:业务数据按你声明的 schema 放在 data.values,同一条路径的 box、quad、判定 verified、review 理由与佐证 evidence 放在 data.cells[path]。底层具体用哪套 OCR 与模型实现属于可变的实现细节,保持稳定的是响应结构。
看一次被核对过的 AI 输出
把鼠标悬停在下方任意字段上——票据上的框是这个值在页面上真正被找到的位置,而不是模型声称的位置。这里的每个值、框与验证标记,都直接读自一次真实的解析结果,而不是摆拍。

Each value with a box carries a verified on-page location — in data.cells[path], that is box + 4-point quad + evidence.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 里的 AI OCR 如何工作
把图片发到 POST /ocr/fields,imageType 取 url 或 base64。先由 OCR 环节读取页面,这是坐标的唯一来源。多模态模型再按你声明的 schema 读这份文档,并且只返回值。把每个值与检测到的文字逐字比对,才产生 data.cells[path] 里的 box、quad 与 evidence。
verified 是判定,不是字符分数。只要该单元格带有任何类型的 review 理由就是 false;比对跑过且没有任何标记时是 true;没有可比对的对象时是 null。字符比对本身在 evidence.text_match。所以 verified: false 与 text_match: true 同时出现并不矛盾,而是「字对上了,但你声明的规则拦下了它」这一正常组合。
这样能让原本悄悄溜过去的不一致浮出来,但并不承诺抓住所有错误。模型与 OCR 环节彼此独立,仍可能在同一处误读上取得一致。坐标是值来自何处的证据,而不是值正确的证明,所以业务侧的校验请继续保留。
你不必写 schema:声明 fields,或打开 autoFields 让模型提出结构。Web 应用会先把 PDF 逐页栅格化再读取,公开 API 直接接收栅格图像。
curl -s https://api.space-ocr.com/ocr/fields \
-H "Authorization: Bearer $SPACE_OCR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "https://example.com/receipt.jpg",
"imageType": "url",
"fields": [
{ "name": "store_name", "type": "string", "required": true },
{ "name": "date", "type": "date", "required": true },
{ "name": "total", "type": "number", "required": true, "min": 0 },
{
"name": "items",
"type": "array",
"children": [
{ "name": "name", "type": "string" },
{ "name": "amount", "type": "number" }
]
}
]
}'如何运行可验证的 AI OCR
- 发送一份文档把图片发送到 /ocr/fields(imageType 取 url 或 base64)。在应用里你可以拖入 PDF,每一页会先被栅格化。公开 API 接收栅格图像。
- 声明 schema传入带 name、type、children 的 fields,或打开 autoFields 让模型提出结构。需要规则的地方补上 required、pattern、min、max、enum 或 near。
- 读取被核对过的结果业务数据在 data.values,box、quad、verified、review、evidence 在 data.cells[path],已声明标量类型的解析值在 data.normalized,换算像素的基准面在 data.image。
- 处理复核队列遍历 data.review.flagged,把 reasons[0] 当作主要理由,并把该单元格的 box 或 quad 画到页面上,让复核的人看到这个值的来处。
- 存储与查询用 POST /create 和 POST /upload 把结果留在表格里,再用 GET /view 配合 where、sort、select、limit 读回来。这些读取不收费,也不会重跑 OCR。
简单、可预期的定价
1 点数 = 处理 1 页 = $0.05(含税),每月 100 点数免费,无需信用卡。失败不计费。读取已存数据的 GET /space、GET /view、GET /jobs 不收费。套餐计划增加每月点数、更多表格与存储空间。