有沒有試過這種情況:出差回來,銀包塞滿十幾張發票和收據,要一張一張打進 Excel 報銷;又或者老闆丟來一疊手寫菜單、舊報價單,叫你「整理成表格,明天要」。以前這種工作可以吃掉你整個下午,但現在有了 OCR(光學字元辨識)加 AI,這類苦工可以在幾分鐘內完成。

這篇教學會帶你由零開始,用開源 OCR 模型處理繁體中文文件。我會用近期在 HuggingFace 上熱度急升的 TeleOCR(Qwen2.5-VL 架構、一週內累積 764 個讚、超過 2.7 萬次下載)做示範,同時也會講解其他替代方案,讓你按自己情況選擇。整篇教學附有可直接複製的 Python 程式碼,就算你只學過一點點程式,都可以跟著做。

為什麼要用 AI OCR?跟傳統 OCR 有什麼分別?

傳統 OCR 工具(例如早期的 Tesseract)原理是「認字形」,它逐個字元去比對筆劃特徵。這在印刷清晰、排版工整的文件上表現不錯,但一遇到以下情況就會崩潰:手寫字、複雜表格、中英文混排、發票上那種歪斜又蓋了印章的細字。

AI OCR 的分別在於它用的是視覺語言模型(VLM)。它不只看字形,還會「理解」整張圖的版面結構——哪一區是標題、哪一欄是金額、哪個數字對應哪個項目。這就是為什麼新一代模型可以直接輸出結構化的 JSON 或 Markdown 表格,而不只是一堆散亂的文字。

對香港和台灣讀者來說,這一點特別重要。繁體中文的筆劃密度高,加上我們的文件經常中英夾雜(例如「Total: HK$1,280」),傳統 OCR 的辨識錯誤率往往高得令人放棄。AI OCR 在這種混排場景下的準確度,是明顯高一個檔次。

第一步:環境準備與安裝(15 分鐘)

先講最低門檻的做法。如果你完全不想碰程式碼,其實很多現成工具已經內建 AI OCR,例如 Google Lens、iPhone 的「實時文字」功能,或者微軟 OneNote 的圖片轉文字。日常偶爾用一次,這些絕對夠。

但如果你要批量處理、要自動整理成表格、或者文件涉及公司機密不想上傳雲端,那就值得花 15 分鐘建立自己的本地環境。以下是步驟:

第一步,安裝 Python 3.10 或以上版本。到 python.org 下載安裝檔,安裝時記得勾選「Add Python to PATH」。

第二步,開啟終端機(Windows 用 PowerShell,Mac 用 Terminal),建立一個虛擬環境,避免弄亂系統:

python -m venv ocr-env
# Windows
ocr-env\Scripts\activate
# Mac / Linux
source ocr-env/bin/activate

第三步,安裝核心套件。我們需要 transformers(載入模型)、torch(運算引擎)、pillow(讀圖)和 accelerate:

pip install transformers torch pillow accelerate qwen-vl-utils

這裡有個實用提醒:如果你沒有獨立顯卡,用 CPU 跑會慢,但對於一天處理幾十張圖來說仍然可接受。若有 NVIDIA 顯卡(8GB VRAM 以上),速度會快五到十倍。

第二步:用 TeleOCR 辨識繁體中文發票

環境好了,現在寫第一段程式。建立一個檔案叫 ocr_demo.py:

from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from PIL import Image
import torch

model_id = "XingChen-AGI/TeleOCR"

model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
processor = AutoProcessor.from_pretrained(model_id)

image = Image.open("invoice.jpg").convert("RGB")

messages = [{
    "role": "user",
    "content": [
        {"type": "image"},
        {"type": "text", "text": "請將這張發票的所有內容辨識出來,"
         "以JSON格式輸出,包含日期、商戶名稱、項目、數量、單價、總金額。"}
    ]
}]

text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)

with torch.no_grad():
    output = model.generate(**inputs, max_new_tokens=1024)

result = processor.batch_decode(
    output[:, inputs.input_ids.shape[1]:],
    skip_special_tokens=True
)[0]

print(result)

執行 python ocr_demo.py,你就會得到一段結構化的 JSON。關鍵在於那句提示詞(prompt)——你要求什麼格式,模型就盡量給你什麼格式。這正是 AI OCR 相對傳統工具最大的優勢。

實際測試時,我建議第一次先用一張清晰的印刷發票,確認流程跑得通,再逐步挑戰手寫單據或複雜表格。這種「先易後難」的節奏,可以避免一開始就被挫敗感劝退。

第三步:批量處理+自動匯出 Excel

單張辨識只是玩具,真正省時間的是批量處理。以下是一個實用版本,會掃描整個資料夾的圖片,並把結果寫進 Excel:

import os, json
import pandas as pd
from PIL import Image

folder = "./receipts"
rows = []

for filename in os.listdir(folder):
    if not filename.lower().endswith((".jpg", ".png", ".jpeg")):
        continue
    img = Image.open(os.path.join(folder, filename)).convert("RGB")
    # ...(重複上面的推論流程)
    try:
        data = json.loads(result)
        data["來源檔案"] = filename
        rows.append(data)
    except json.JSONDecodeError:
        print(f"解析失敗:{filename},請手動檢查")

df = pd.DataFrame(rows)
df.to_excel("報銷總表.xlsx", index=False)
print(f"完成,共處理 {len(rows)} 張")

這段程式有兩個實戰細節值得留意。第一,一定要加 try/except。AI 模型偶爾會多講幾句廢話,導致 JSON 格式跑掉,這時候程式不應該整個崩潰,而是記錄下來讓你自己補救。第二,保留「來源檔案」欄位。日後核對帳目時,你會需要知道哪一筆來自哪張圖,這是很多教學文章不會提醒你的細節。

常見錯誤與排解技巧

第一個常見問題是「記憶體不足」(CUDA out of memory)。解法是加上 load_in_4bit=True 參數做量化,或者把圖片先縮小到 1280 像素寬再輸入。大部分發票在這個解析度下已經足夠清晰。

第二個問題是辨識結果出現簡體字。這是因為模型訓練資料以簡體為主。解法是在提示詞明確寫「請使用繁體中文輸出」,通常就能修正。若仍然出錯,可以在後處理階段用 OpenCC 做一次簡轉繁。

第三個問題是手寫字辨識率低。這是目前所有 OCR 模型的共同弱點。實務建議是:手寫單據先用「拍照+提高對比度」預處理,或者考慮用更大的模型(例如 30B 級別)換取準確度,代價是速度變慢。

這套技能可以怎麼用?

學會之後,應用場景比你想像中多。會計同事可以用它處理每月幾百張單據;做電商的朋友可以用它把供應商的手寫報價單轉成可比價的表格;學生可以用它把課本重點拍照轉成可搜尋的文字筆記。甚至連整理舊相簿裡的名片,都可以用同一套流程搞定。

重點不是「AI 很神奇」,而是你現在有能力把一件重複性苦工,變成一個按下去就自動跑完的流程。這才是真正的生產力提升。

延伸閱讀

常見問題

Q: 我完全不懂程式,有更簡單的替代方案嗎?

A: 有。如果只是偶爾使用,iPhone 的「實時文字」、Google Lens、微軟 OneNote 都內建 OCR,拍照就能複製文字。若需要批量處理,可以考慮 ABBYY FineReader 這類商業軟體,介面友善但需付費。自己架設的價值在於免費、可批量、資料不出本地。

Q: 為什麼要用開源模型,不用 ChatGPT 或 Claude 直接辨識?

A: 兩者都可行,ChatGPT 和 Claude 的視覺能力其實相當強。差別在於三點:成本(大量處理時 API 費用可觀)、隱私(發票含公司資料,未必適合上傳)、以及自動化(本地模型可無縫接進你自己的流程)。小量使用用 API 更方便,大量或敏感資料建議本地處理。

Q: 辨識一張發票大概要多久?

A: 用 NVIDIA 顯卡(例如 RTX 3060 以上)大約 3 至 8 秒一張;純 CPU 則約 30 秒至 1 分鐘。如果一天要處理上百張,建議用顯卡或考慮雲端 GPU 服務。

Q: 支援哪些檔案格式?

A: 常見的 JPG、PNG 都沒問題。PDF 需要先用 pdf2image 套件轉成圖片再處理。掃描品質建議至少 200 DPI,太低會明顯影響準確度。

Q: 如果辨識結果有錯,可以怎麼補救?

A: 三個做法。第一,在提示詞加入「若某欄位看不清,請標註為『待確認』」,讓模型主動示警。第二,設定信心度門檻,只自動接受高信心結果。第三,人工抽查——建議每次批量處理後隨機抽 10% 核對,這是最務實的品質控制方式。