space ocr
指南文章价格文档
AI OCR

不必盲信的 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 输出

把鼠标悬停在下方任意字段上——票据上的框是这个值在页面上真正被找到的位置,而不是模型声称的位置。这里的每个值、框与验证标记,都直接读自一次真实的解析结果,而不是摆拍。

Receipts with extracted-field bounding boxes
Verified fields
KINSHO · 合計 2,045
ライフ · 合計 4,286

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.

三种形态,同一份契约
同一页可以取成声明好的字段(`POST /ocr/fields`)、保留版式的 Markdown(`POST /ocr/markdown`),或还原了阅读顺序的纯文本(`POST /ocr/text`)。三者都以 `data.values`、`data.cells`、`data.review`、`data.image` 这同一个信封返回,因此一套复核界面就够用。Markdown 默认包含元素;在 `/ocr/text` 上要拿到按块划分的 cells,需设置 `includeBlocks: true`。
坐标不由模型产生
值来自模型,坐标来自 OCR 环节以及针对它的逐字比对。是哪套机制定下了这个框,记录在 `evidence.source`;在 `/ocr/fields` 上,`evidence.printed_text` 会原样返回那处坐标上印着的文字,方便你自己与值对照。
每个值都能按路径取用
`data.cells` 的键(如 `total`、`items[0].amount`)与 `data.review.flagged` 使用同一套路径文法。`box` 是 0–1000 归一化网格上的轴对齐矩形,`quad` 是随页面倾斜的四个点,换算像素的基准面是 `data.image` 的宽高。
自己声明字段,或让模型提出
传入带 `name`、`type`、`children` 的 `fields`,或打开 `autoFields` 让模型提出结构。`required`、`pattern`、`min`/`max`、`enum`、`near` 这类声明不会传给模型,而是在抽取之后核对,因此违规不会改写值,只会成为 `review` 的理由。声明标量类型还会额外得到 `data.normalized` 这一层确定性解析结果。
审计轨迹:原始与修改并存
抽取要经过模型,每次运行未必完全一致,因此值得留存的记录是响应 JSON。在应用里修正单元格时,你的值会保存在原始 OCR 值旁边而不是覆盖它——模型读到了什么、人改了什么,都还看得见。
明细行逐行核对
在 `array` 字段里,每一行都有自己的路径(`items[0].amount`),行本身还带一个合并框。重复值扎堆的列正是模型的 token 提示最不可靠的地方,所以引擎更依赖列与行的一致性,并给出 `ambiguous_occurrence` 之类的理由,而不是直接采信这一行。
无需设置语言
日语、韩语、中文、英文在同一个引擎里处理,混合文字也包含在内。公开 API 没有语言参数,也不必逐份文档配置。

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 直接接收栅格图像。

声明字段——每个值都带着位置与复核结果返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

  1. 发送一份文档
    把图片发送到 /ocr/fields(imageType 取 url 或 base64)。在应用里你可以拖入 PDF,每一页会先被栅格化。公开 API 接收栅格图像。
  2. 声明 schema
    传入带 name、type、children 的 fields,或打开 autoFields 让模型提出结构。需要规则的地方补上 required、pattern、min、max、enum 或 near。
  3. 读取被核对过的结果
    业务数据在 data.values,box、quad、verified、review、evidence 在 data.cells[path],已声明标量类型的解析值在 data.normalized,换算像素的基准面在 data.image。
  4. 处理复核队列
    遍历 data.review.flagged,把 reasons[0] 当作主要理由,并把该单元格的 box 或 quad 画到页面上,让复核的人看到这个值的来处。
  5. 存储与查询
    用 POST /create 和 POST /upload 把结果留在表格里,再用 GET /view 配合 where、sort、select、limit 读回来。这些读取不收费,也不会重跑 OCR。

简单、可预期的定价

1 点数 = 处理 1 页 = $0.05(含税),每月 100 点数免费,无需信用卡。失败不计费。读取已存数据的 GET /space、GET /view、GET /jobs 不收费。套餐计划增加每月点数、更多表格与存储空间。

Free
$0
  • 100 点数/月
  • 3 表格
  • 1 GB 存储
免费 — 无需信用卡
Starter
$19/月
  • 500 点数/月
  • 15 表格
  • 10 GB 存储
免费开始
最受欢迎
Pro
$39/月
  • 1,100 点数/月
  • 无限表格
  • 100 GB 存储
免费开始
这套 AI OCR 和一个只返回 JSON 的模型有什么不同?
结构化由模型来做,但它说了不算。业务数据回到 data.values,data.cells[path] 则带着这个值被定位到的 box 与 quad、判定 verified、review 理由以及佐证 evidence。需要人看的路径列在 data.review.flagged,所以你是在复核模型的输出,而不是照单全收。
坐标是 AI 返回的吗?
不是。模型只返回值。坐标来自读取页面的 OCR 环节,以及针对其检测文字的逐字比对。是哪套机制定下了框记录在 evidence.source;在 /ocr/fields 上,evidence.printed_text 会返回那处坐标上印着的文字。
我怎么判断某个值能不能信?
读 data.review.flagged,而不是某个固定分数。每一项都有 path 和一个按重要性排序、首位为主要理由的 reasons 数组,待复核数量就是 flagged.length。用该路径打开 data.cells[path] 即可看到判定、坐标与 evidence。其中 evidence.match_ratio 描述字符覆盖率,是佐证,而不是通过与否的判据。
可以让 AI 替我提出字段吗?
可以。打开 autoFields,模型会为文档提出一个 schema;你也可以自己声明 fields——明细行用带 children 的 array 字段。required、pattern、min、max、enum、near 这类声明不会传给模型,而是在抽取之后核对,因此它们增加的是复核理由与坐标锚点,而不是改动抽取值。
我修改 AI 的输出后,原始值会怎样?
在应用里,你的修改会保存在原始 OCR 值旁边而不是覆盖它,模型的读取与人的修正都留在记录里。由于抽取要经过模型、每次运行未必相同,真正值得留存以备审计的是响应 JSON;确定性的部分是坐标比对与 normalized 解析。
多少钱?
1 点数 = 处理 1 页 = $0.05(含税),每月 100 点数免费,无需信用卡。失败不计费,用 GET /space、GET /view、GET /jobs 读取已存数据也不收费。Starter 与 Pro 增加每月点数、更多表格与存储——见上方的计划。

把 AI 用在你的文档上,但不盲信它

免费额度——每月 100 点数,无需信用卡。每个值都连同坐标、复核判定和它背后的证据一起返回。

相关