Kasus penggunaan yang sederhana namun bernilai
Selama dua dekade, ekstraksi data terstruktur dari dokumen tidak terstruktur merupakan proyek selama seperempat tahun: pipeline OCR, aturan regex, penanganan kasus tepi, dan template tata letak untuk setiap vendor. Dengan LLM yang dibatasi oleh skema JSON, pekerjaan itu menjadi 30 baris kode, akurat sejak percobaan pertama, dan dapat dikirim dalam sehari. Contoh di bawah berjalan di Kunavo, gateway independen yang kompatibel dengan OpenAI, tetapi polanya milik model dan bekerja sama terhadap model mana pun.
Hanya mengekstrak faktur? Halaman ini adalah ikhtisar lintas dokumen. Panduan khusus ekstraksi data faktur membahas lebih dalam satu jenis dokumen tersebut: perbandingan pendekatan template-dan-model lama dengan panggilan vision-LLM, tutorial Python lengkap yang dibatasi skema, guardrail aritmetika, perutean model dua tingkat, dan biaya per faktur.
Kategori yang bekerja sangat baik:
- Faktur, tanda terima, pesanan pembelian
- Kontrak, perjanjian hukum (ekstrak pihak, tanggal, kewajiban)
- Resume / CV (uraikan ke struktur yang ramah ATS)
- Pengayaan prospek dari tanda tangan email atau halaman web
- Rekam medis, laporan laboratorium (dengan penanganan PII)
- Listing real estat, katalog produk
- Triase email dan ingestion terstruktur
Pola inti dalam 30 baris
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)Dua alur: hanya teks (setelah langkah OCR terpisah) dan vision-direct (model vision membaca gambar dan menghasilkan JSON dalam satu panggilan). Jalur vision lebih cepat dibangun tetapi sedikit lebih mahal per panggilan; jalur OCR lalu LLM lebih murah dalam skala besar karena OCR hanya dikenakan sekali per halaman.
Benchmark akurasi
Pada dataset faktur publik (1.000 faktur dari 50 vendor), mode JSON dengan system prompt 200 kata:
- Claude Haiku 4.5: akurasi tingkat bidang 96%
- Claude Sonnet 4.6: akurasi tingkat bidang 98%
- Templating tradisional: 80–90% pada vendor yang dikenal, 0% pada vendor baru
LLM menangani tata letak vendor baru secara zero-shot. Tambahkan 2–3 pasangan contoh dalam system prompt (few-shot), dan Haiku mendekati akurasi Sonnet dengan sebagian kecil biayanya.
Biaya per dokumen
- Faktur (~2K token input, ~500 output): Haiku ~$0,003, Sonnet ~$0,02
- Kontrak satu halaman (~5K input): Haiku ~$0,005, Sonnet ~$0,04
- Kontrak 10 halaman (~50K input, ringkasan terstruktur sebagai output): Sonnet ~$0,30
- CV (~3K token masukan): Haiku ~$0,003
- Gambar tanda terima dengan vision: Haiku, sekitar biaya satu faktur—gambar dihitung sebagai kira-kira 1,5K token input
Memproses 10.000 faktur/bulan: ~$30 dengan Haiku. Alternatif komersial terdekat (Rossum, AWS Textract + pascapemrosesan) berbiaya sekitar $2.000–5.000/bulan untuk volume yang sama.
5 pola yang menjaga akurasi tetap tinggi
- Penanganan null secara eksplisit: beri tahu model untuk menggunakan
nullpada bidang yang hilang, bukan "N/A" atau string kosong. Kode downstream dapat membedakan "tidak ada" dari "sengaja dikosongkan" - Tanggal ISO 8601: nyatakan secara eksplisit. Jika tidak, model memilih format regional dan parsing downstream rusak
- Mata uang sebagai kode ISO: "USD", bukan "$"; "EUR", bukan "€". Hindari ambiguitas ($ untuk USD vs CAD vs AUD)
- Validasi JSON: gunakan Pydantic / Zod untuk menegakkan skema. Jika tidak valid, kirim ulang prompt dengan error tersebut
- Periksa manual 1% selama seminggu, lalu 0,1% secara berkelanjutan. Lacak akurasi tingkat bidang, bukan hanya tingkat record
Kapan menggunakan model yang mana
| Jenis dokumen | Model yang direkomendasikan |
|---|---|
| Terstruktur sederhana (faktur, tanda terima) | Claude Haiku 4.5 |
| Kontrak / perjanjian panjang | Claude Sonnet 5 (menangani konteks panjang) |
| Vision-direct (PDF tanpa OCR) | Claude Haiku 4.5, atau Claude Sonnet 5 untuk halaman besar |
| Risiko tinggi (hukum, medis) | Claude Sonnet 5 + verifikasi manusia |
| Ingestion massal (100K+/hari) | Haiku 4.5 + contoh few-shot + caching |
Pertimbangan kepatuhan
Untuk dokumen yang berisi PII (faktur memiliki nama dan alamat; rekam medis memiliki semuanya), lakukan pseudonimisasi sebelum ekstraksi atau gunakan Zero Data Retention di upstream. Lihat panduan kepatuhan untuk pola khusus wilayah dan pembahasan mendalam DSGVO untuk panduan Jerman.
Mulai: /app/signup—bayar sesuai pemakaian; isi ulang $10 mencakup ~3.000 ekstraksi faktur, dan saldo Anda tidak pernah kedaluwarsa. Baca dokumentasi chat di /docs/chat untuk mengetahui apa yang diberlakukan response_format pada setiap keluarga model dan untuk pola penggunaan alat.
Pertanyaan umum
Berapa biaya ekstraksi data dari dokumen menggunakan LLM?
Sekitar $0,003–$0,005 per dokumen dengan Claude Haiku 4.5 dan sekitar $0,02–$0,04 dengan Claude Sonnet 4.6. Memproses 10.000 faktur per bulan berbiaya sekitar $30, dibandingkan $2,000–$5,000 untuk layanan ekstraksi komersial.
Seberapa akurat ekstraksi data LLM tanpa contoh?
Akurasi per bidang sebesar 95–98% tanpa contoh, dengan sekitar 30 baris kode — cukup akurat untuk menggantikan alur kerja OCR-plus-regex.
Model mana yang sebaiknya saya gunakan untuk ekstraksi dokumen?
Dokumen terstruktur sederhana seperti faktur dan kuitansi diproses dengan Claude Haiku 4.5. Kontrak panjang diproses dengan Claude Sonnet 4.6. Dokumen yang dibaca langsung sebagai gambar diproses dengan Claude Haiku 4.5, atau Sonnet 4.6 untuk halaman besar.
Bagaimana cara menjaga akurasi ekstraksi di lingkungan produksi?
Lima pola: penanganan null yang eksplisit, tanggal ISO 8601, kode mata uang ISO, validasi skema dengan permintaan ulang jika keluaran tidak valid, dan pemeriksaan sampel manual — 1% keluaran pada minggu pertama, lalu 0,1% secara berkelanjutan. Pantau akurasi per bidang, bukan per rekaman.