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 點數,免信用卡。每個值都連同座標、複核判定與它背後的證據一起回傳。

相關