你把一張帳單交給視覺語言模型(VLM),它回傳一份排得整整齊齊的 JSON:日期、明細、總額都有。可是一個金額即使寫得很順,也可能抄錯一位數。帳單 OCR 驗收的難點,正是找出「看起來合理、其實不在原圖上」的值。
這篇寫給第一次要替掃描帳單建立檢查流程的讀者。你會用 10 張已有人工作答的繁中帳單,做出逐欄來源框、局部裁圖、算術規則與人工複核路徑;不必先懂機器學習,也能知道每個值為何可以放行。本文教的是小樣本驗收方法,不宣稱已替任何模型跑出準確率。
先說結論:帳單 OCR 驗收要看三張收據
一句話記住:可放行欄位=讀到的值+原圖位置+業務規則通過。就像核對包裹,模型給你的金額是收件人說「我收到了」;來源框是簽收照片;加總規則是核對箱內件數。三者各有用處,少一個就留下盲點。
- 值:帳單號碼、日期、明細、金額、幣別等結構化欄位。
- 證據:頁碼、座標、原文字與局部裁圖;看不見來源就標成待查。
- 規則:針對帳單型態檢查小計、稅、折扣、總額與日期;不符合就人工複核。
為什麼「模型很有信心」仍要驗證?
信心分數回答的是系統對自己輸出的估計,不等於該數字真的印在那張帳單。Google Document AI 的資料結構把欄位文字、confidence、pageAnchor 與正規化後的值分開保存;AWS Textract 的帳單/收據輸出也把明細與摘要欄位連到幾何位置。這兩份官方設計,說明「欄位值」與「來源位置」應被當成不同資料來檢查。Google 的 Document 物件說明;AWS 的帳單輸出說明。
學術評測也把讀字、文件結構、定位與關鍵資訊擷取拆開。CC-OCR V2 的作者提供五條不同測試軌道,其中包含 document grounding(把答案指回圖片位置)與 key information extraction(抽出欄位)。這是研究團隊的測試設計,不是本文 10 張繁中帳單的成績。CC-OCR V2 原始專案。
如果你還在處理「PDF 先變可搜尋文字」這一步,可先讀 OCR It 離線擷取教學;本篇從擷取結果出發,追問每個重要欄位是否有圖像證據。
帳單 OCR 驗收的 5 個零件
① 真值卡:先把「標準答案」寫清楚
挑 10 張你有權處理的繁中帳單,盡量包含不同版型、清晰與模糊掃描、含折扣或多頁的案例。每張由人對原圖填寫帳單號碼、日期、幣別、小計、稅額、折扣、應付總額與每列明細;另一人只覆核關鍵金額和日期,分歧回原圖裁定。記下檔案雜湊、頁數、裁定人和欄位定義,往後才能重跑同一份題目。10 張是流程冒煙測試,不是可推廣的模型準確率估計。
真值要保存兩層:printed_text 是原圖印的字;normalized_value 是比較用的標準形式。例如原圖印 1,240.00,比較時可以轉為十進位 1240.00,但不能把模型猜到、原圖沒印的號碼補進真值。
② 來源卡:每個欄位指回頁面的一小塊
抽取器輸出每個關鍵欄位時,要求同時給 page、box、raw_text、value。box 可採四個相對座標 [left,top,right,bottom],每個數字介於 0 與 1;裁圖時才乘上原始頁面的寬高。Google 官方文件說明 normalized vertices 的範圍與原圖座標的差別,頁碼也要和文件頁面索引對齊。Google 的回應與座標說明。
重點不是「模型給了框」,而是裁出來的圖真的包含同一個值。若框落在空白處、只框到欄位標籤、把隔壁明細的價格當成總額,或同一值跨兩頁卻沒標清頁碼,這欄就進人工複核。先看裁圖再讀 JSON,能減少流暢文字帶來的錯覺。
③ 算術卡:用帳單自己的規則核對
先問這張帳單是哪種計價法:稅外加、含稅、先折扣後課稅、分期、退款或多幣別。只有在規則適用、欄位齊全、幣別相同時,才檢查 小計+稅額-折扣=應付總額。明細若有數量與單價,再檢查 數量×單價=列金額,最後把列金額加起來和小計比。金額用十進位或最小貨幣單位計算,避免浮點小數造成假警報。
這種確定性規則有現成先例:Google Document AI 的驗證文件把 mention_text、normalized_value 與 bounding_poly 放在可檢查的欄位模型裡,也示範明細加總。你的業務規則仍要依帳單格式設定。Google 的文件驗證規則。
④ 停手機制:不確定就送人工
把「缺欄」、「框對不上值」、「總額不平」、「日期不可能」、「同一張出現兩種幣別」分成可記錄的原因碼。系統只自動放行所有必需欄位都有證據且適用規則通過的帳單;一旦不滿足,就保留原頁、裁圖、JSON 與原因碼給人看。人改正後留下修訂紀錄,下一次才知道是哪個環節需要修。
⑤ 成本卡:把誤放行和人工時間一起記
計算每張的模型/OCR 費用、重試次數、處理秒數與人工複核分鐘數。每張平均成本=(抽取費+重試費+人工分鐘×每分鐘成本)÷帳單張數。若只看 API 單價,容易忽略更昂貴的返工;若只追求少複核,也可能放過錯誤金額。
跟著一張示意帳單,走完驗收
以下是教學用的虛構帳單,方便你練習判斷;它不是我們跑出的 OCR 結果。原圖設定為兩列商品 800.00、400.00,小計 1,200.00、稅 60.00、折扣 20.00,應付 1,240.00。模型提案卻把應付寫成 1,248.00,並給出 0.96 的假設信心分數。

- 對位置:把「應付」框裁出來,讀到
1,240.00。提案1,248.00與裁圖不同,來源檢查失敗。 - 對算術:
1,200.00+60.00-20.00=1,240.00。提案總額多了8.00,算術檢查也失敗。 - 決策:這張帳單進人工複核;在真值表標記「金額抄錯」及「誤放行風險」。假設信心
0.96只用來示範:高分門檻本身不能替代原圖與加總。
另一種情況更棘手:若模型錯把另一欄同樣是 1,240.00 的金額當應付,算術仍可能通過,所以還要核對標籤、位置與頁碼。反過來,合法的含稅帳單可能不適用上面的加法;不適用的規則應標 not_applicable,再按該版型的規則審查,不能硬判錯。
10 張帳單怎麼做 A/B:同題、同模型、不同放行規則
先凍結 10 張圖片、人工真值、抽取模型版本、提示詞、影像尺寸與預算。A 組只看抽取器提供的信心分數,例如示範門檻 confidence ≥ 0.90;B 組沿用同一批抽取輸出,再加上來源框核對和適用的算術/日期規則。這樣比較的是放行策略,而不是偷換模型。若抽取器不提供可比信心分數,A 組只能用你事先定義的代理分數,並清楚標示它的來源。
每張記四個結果:truth_correct(對照人工真值,所有必需欄位是否正確)、auto_release_A、auto_release_B、review_minutes。把漏掉一列明細也算「不正確」,不要只檢查最後總額。兩組都不能事後替自己改門檻;想調門檻,就另留一批沒看過的帳單作下一輪測試。
- 誤放行數:必需欄位有錯,系統卻自動放行的張數。這是最應優先降低的量。
- 人工複核量:被擋下送人的張數,以及實際花費分鐘數;兩者一起看。
- 漏列數與金額錯欄數:分開計,不讓同一張只記成單一「失敗」。
- 每張成本:抽取與重試費用加人工時間成本,再除以 10;所有假設單價都寫在私有工作表。
用 10 張只能抓流程的明顯失效,不能宣稱「B 組提升 X%」可代表未來所有帳單。真正要上線,還要依供應商、版型、拍攝品質和異常案例擴大保留樣本,並持續觀察新資料。若你想學「如何避免驗收題被系統提前看過」,可接著讀 Agent 規則污染與新試卷教學。
新手照做:一份工作表與一段判斷式
用 Excel、Google 試算表或 CSV 都可以。每一列放一個欄位,欄名先定成:doc_id, page, field, printed_text, truth_value, predicted_value, box, crop_match, rule_status, review_reason, review_minutes。框座標與裁圖連結可以另外放欄位。保存圖片時先做權限控管與去識別;真實帳號、地址與付款資訊不應拿來做公開示例。
最小判斷式可以寫成:必需欄位齊全 AND 每欄裁圖對得上 AND 適用算術通過 AND 日期規則通過 → 可放行;否則 → 人工複核。這是語言無關的流程,不是某個 SDK 的現成 API。真正寫成程式時,還要處理裁圖超出頁面、多頁旋轉、貨幣小數位、退款負號及重試失敗;若採 Google Document AI,欄位與座標格式先對照它的 Document API 物件。
日期檢查也要對應文件種類。可先檢查日期是否能解析、到期日是否早於開立日;若帳單有更正、補開或跨時區記載,交由人判定。把「無法解析」和「解析後違反規則」分成不同原因,日後才知道是 OCR 還是業務邏輯的問題。
最常踩的 5 個坑
- 拿同一張帳單調規則又報成測試:留出未參與調整的新圖,避免題目被背熟。
- 只有總額正確就放行:明細漏列、帳號或日期錯誤仍可能害後續對帳出錯;先定義必需欄位。
- 把每張都套同一條加總公式:含稅、折扣順序、退款與多幣別要各有規則或人工處理。
- 把低信心當成唯一複核條件:高信心的錯字與抄錯欄仍需來源框和規則驗收。
- 只記 API 價格:重試與人工分鐘都進成本,才能看出真正的取捨。
帳單 OCR 驗收常見問題
1. 10 張夠不夠判斷哪個模型最好?
不夠。10 張適合先把欄位、錯誤分類與放行路徑跑通;模型選型要涵蓋更多版型與未見過的文件。
2. 算術過了,就能直接付款嗎?
不能只靠算術。還要核對收款對象、帳號、幣別、日期和各欄來源。實際付款的授權流程另有權限與覆核要求。
3. 沒有座標輸出的 VLM 怎麼辦?
改用能提供定位的擷取步驟,或把該欄送人工。不要把模型自己編出的座標當證據;裁圖必須回到原始頁面核對。
4. 繁中帳單上的民國年怎麼比?
先保留原字,再按你文件的曆法規則正規化。在真值卡同時保存印刷日期與標準日期,讓轉換錯誤可以追查。
5. 為何不能直接用浮點數加金額?
小數精度會製造不必要的差額。把金額轉成十進位或最小貨幣單位,再依該幣別的規則處理四捨五入。
6. 一張有好幾頁,框要怎麼存?
每個框都存頁碼。不同頁上的相同數字不是同一個證據;頁面旋轉後的座標也要按同一版本影像換算。
7. A/B 的誤放行數為零,就能上線嗎?
還不能只憑這一輪。零可能只是樣本太小或太乾淨;加入新供應商、低畫質、折扣與退款案例後再觀察。
8. 哪些欄位最該先人工核對?
從會直接改變付款或對帳結果的欄位開始:收款對象、帳號、幣別、應付額與到期日。再按你的業務損失排序擴充。
給新手的 3 個重點
- 先有人工真值,再談模型分數;原圖和裁定記錄要能重看。
- 每個關鍵值都留頁碼、座標和局部裁圖,無法對位就送人。
- 把誤放行、複核分鐘與總成本一起看,選一條能承受的放行線。
接著閱讀
左右滑動查看更多推薦
結語:從一張帳單開始建立證據鏈
今天先拿一張有權使用的帳單,手工填出 應付額 的原字、標準值、頁碼和框;裁出那一格,再把小計、稅與折扣算一次。能向另一個人展示「值在哪裡、為何算得通」,才算完成第一張帳單 OCR 驗收。接著複製同一張真值卡,擴到 10 張,觀察誤放行和人工時間。若你希望把這種檢查串進自己的 AI 工作流,也可從 Agent Harness 實作教學 和 Agent Harness 基礎觀念 接著學,或到 AlphaLab 課程 規劃完整學習路線。






