無聊但有價值的使用案例
二十年來,從非結構化文件擷取結構化資料一直是耗時一季的專案:OCR 管線、正規表示式規則、邊界案例處理,以及為每個供應商建立版面範本。讓 LLM 受 JSON Schema 約束後,只需 30 行程式碼,第一次執行就很準確,而且一天內即可上線。以下範例在 Kunavo(一個獨立的 OpenAI 相容閘道)上執行,但這套模式屬於模型本身,對任何模型的使用方式都相同。
專門要擷取發票嗎? 本頁提供跨文件概覽。專門的發票資料擷取指南會深入介紹這一種文件:較舊的範本與模型方法如何與視覺 LLM 呼叫比較、完整的受 Schema 約束 Python 教學、算術防護機制、雙層模型路由,以及每張發票的成本。
特別適合這種方法的類別:
- 發票、收據、採購訂單
- 合約、法律協議(擷取當事人、日期、義務)
- 履歷/CV(解析為適合 ATS 的結構)
- 從電子郵件簽名或網頁豐富潛在客戶資料
- 病歷、實驗室報告(需處理個人識別資訊)
- 房地產刊登資料、產品目錄
- 電子郵件分流與結構化匯入
30 行程式碼的核心模式
import json
from openai import OpenAI
client = OpenAI(api_key="sk-kn-...", base_url="https://api.kunavo.com/v1")
# The schema is the output contract. Claude enforces a json_schema
# response_format (json_object it does not), so the reply has this shape
# unless max_tokens cuts it off (finish_reason == "length").
STR = {"type": ["string", "null"]}
NUM = {"type": ["number", "null"]}
INVOICE = {
"type": "object",
"properties": {
"vendor": {"type": "string"},
"invoice_number": STR, "date_iso": STR, "due_date_iso": STR,
"currency": STR, "subtotal": NUM, "tax": NUM, "total": NUM,
"line_items": {"type": "array", "items": {
"type": "object",
"properties": {"description": {"type": "string"},
"qty": NUM, "unit_price": NUM, "amount": NUM},
"required": ["description", "qty", "unit_price", "amount"],
"additionalProperties": False,
}},
},
"required": ["vendor", "invoice_number", "date_iso", "due_date_iso",
"currency", "subtotal", "tax", "total", "line_items"],
"additionalProperties": False,
}
RESPONSE_FORMAT = {"type": "json_schema",
"json_schema": {"name": "invoice", "schema": INVOICE}}
RULES = "Extract the invoice. Use null for missing fields. Dates in ISO 8601."
# Extract structured fields from an invoice PDF (after OCR)
def extract_invoice(ocr_text: str) -> dict:
resp = client.chat.completions.create(
model="claude-haiku-4-5",
messages=[
{"role": "system", "content": RULES},
{"role": "user", "content": ocr_text},
],
response_format=RESPONSE_FORMAT,
max_tokens=1200,
)
return json.loads(resp.choices[0].message.content)
# Extract from an image directly (no OCR step needed)
def extract_invoice_from_image(image_url: str) -> dict:
resp = client.chat.completions.create(
model="claude-haiku-4-5", # vision + an enforced schema
messages=[
{"role": "system", "content": RULES},
{"role": "user", "content": [
{"type": "text", "text": "Extract this invoice:"},
{"type": "image_url", "image_url": {"url": image_url}},
]},
],
response_format=RESPONSE_FORMAT,
max_tokens=1200,
)
return json.loads(resp.choices[0].message.content)兩種流程:純文字流程(先另外執行 OCR)與直接視覺流程(視覺模型讀取影像,並在一次呼叫中輸出 JSON)。視覺流程建置速度較快,但每次呼叫的成本略高;OCR 再交給 LLM 的流程在大規模使用時更便宜,因為 OCR 是每頁只需支付一次的成本。
準確率基準
在公開發票資料集(來自 50 家供應商的 1,000 張發票)上,使用 JSON 模式與 200 個詞的系統提示:
- Claude Haiku 4.5:欄位層級準確率 96%
- Claude Sonnet 4.6:欄位層級準確率 98%
- 傳統範本化:已知供應商達 80–90%,新供應商為 0%
LLM 可零樣本處理新供應商的版面配置。在系統提示中加入 2–3 組範例配對(少樣本),Haiku 就能以一小部分成本接近 Sonnet 的準確率。
每份文件的成本
- 發票(約 2K 個輸入 token、約 500 個輸出 token):Haiku 約 $0.003,Sonnet 約 $0.02
- 一頁合約(約 5K 個輸入 token):Haiku 約 $0.005,Sonnet 約 $0.04
- 10 頁合約(約 50K 個輸入 token,輸出結構化摘要):Sonnet 約 $0.30
- 履歷(約 3K 個輸入 token):Haiku 約 $0.003
- 含視覺的收據影像:Haiku,約等於一張發票的成本——影像約計為 1.5K 個輸入 token
每月處理 10,000 張發票:使用 Haiku 約 $30。最接近的商業替代方案(Rossum、AWS Textract + 後處理)處理相同數量時每月約 $2,000–5,000。
維持高準確率的 5 種模式
- 明確處理 null:告訴模型,缺少欄位時使用
null,不要使用「N/A」或空字串。下游程式碼就能區分「不存在」與「刻意留白」 - ISO 8601 日期:明確指定。否則模型會選用地區格式,導致下游解析失敗
- 使用 ISO 貨幣代碼:「USD」而非「$」;「EUR」而非「€」。避免歧義($ 可能代表 USD、CAD 或 AUD)
- 驗證 JSON:使用 Pydantic/Zod 強制套用 Schema。若無效,帶著錯誤重新提示
- 連續一週人工抽查 1%,之後持續抽查 0.1%。追蹤欄位層級準確率,而不只是整筆記錄的準確率
何時使用哪個模型
| 文件類型 | 建議模型 |
|---|---|
| 簡單結構化(發票、收據) | Claude Haiku 4.5 |
| 長篇合約/協議 | Claude Sonnet 5(可處理長上下文) |
| 直接視覺(未經 OCR 的 PDF) | Claude Haiku 4.5;大型頁面則使用 Claude Sonnet 5 |
| 高風險(法律、醫療) | Claude Sonnet 5 + 人工驗證 |
| 大量匯入(每天 100K+) | Haiku 4.5 + 少樣本範例 + 快取 |
合規考量
對包含個人識別資訊的文件(發票含有姓名、地址;病歷包含所有資訊),請在擷取前先進行假名化,或在上游使用 Zero Data Retention。請參閱合規指南,了解各地區專用模式;德國做法請參閱DSGVO 深入解析。
開始使用:/app/signup——最低 $10 儲值即可採隨用隨付,約涵蓋 3,000 次發票擷取,餘額永不過期。請閱讀聊天文件 /docs/chat,了解 response_format 對各模型系列強制執行的內容,以及工具使用模式。
常見問題
How much does it cost to extract data from a document with an LLM?
About $0.003–$0.005 per document on Claude Haiku 4.5 and about $0.02–$0.04 on Claude Sonnet 4.6. Processing 10,000 invoices a month costs roughly $30, against $2,000–$5,000 for commercial extraction services.
How accurate is zero-shot LLM data extraction?
95–98% field-level accuracy zero-shot, in about 30 lines of code — accurate enough to replace an OCR-plus-regex pipeline.
Which model should I use for document extraction?
Simple structured documents such as invoices and receipts go to Claude Haiku 4.5. Long contracts go to Claude Sonnet 4.6. Documents read directly as images go to Claude Haiku 4.5, or Sonnet 4.6 for large pages.
How do I keep extraction accurate in production?
Five patterns: explicit null handling, ISO 8601 dates, ISO currency codes, schema validation with a re-prompt on invalid output, and a manual spot-check — 1% of outputs in the first week, 0.1% ongoing. Track field-level accuracy rather than record-level.