Ekstraksi Data Dokumen dengan Multimodal LLM

Foto oleh jurvetson on flickr
OCR tradisional mengubah halaman menjadi rangkaian karakter datar dan membuang tata letak, sehingga total pada sel tabel terlihat sama dengan nomor halaman yang tersasar. Multimodal LLM bernalar langsung atas gambar yang dirender, sehingga perataan kolom, garis tabel, dan ketebalan huruf tetap tersedia sebagai bukti. Ini membuatnya jauh lebih tangguh pada hasil pindai miring, tata letak multi-kolom, dan anotasi tulisan tangan yang biasa merusak pipeline OCR berbasis template.
Tentukan skema JSON yang ketat di awal dan paksa model mengisinya melalui pemanggilan tool, alih-alih meminta model mendeskripsikan dokumen dalam prosa. Ini mengubah ekstraksi menjadi pemanggilan fungsi bertipe, di mana model mengembalikan nilai yang sesuai skema atau tidak mengembalikan sama sekali, menghilangkan seluruh kategori bug parsing akibat format teks bebas yang tidak konsisten.
Grounding berarti model mengembalikan kotak pembatas atau wilayah halaman bersama setiap kolom yang diekstrak, bukan hanya nilai mentahnya. Antarmuka tinjauan kemudian dapat menyorot tepat di mana pada halaman sumber sebuah total atau nama vendor berasal, mengubah pembacaan ulang manual selama beberapa menit atas seluruh dokumen menjadi sekilas pandang dua detik pada satu wilayah yang disorot. Ini penting agar data hasil ekstraksi dapat diaudit.
Hanya untuk sebagian rekaman. Meminta model melaporkan sendiri skor keyakinan per kolom memungkinkan pipeline menyetujui otomatis dokumen yang semua kolom wajibnya berkeyakinan tinggi dan lolos validasi dasar, sambil mengarahkan yang tidak pasti ke antrean tinjauan manusia. Tim yang mengadopsi pola ini biasanya menyetujui otomatis sebagian besar dokumen yang terbentuk baik sambil tetap menangkap kasus yang benar-benar ambigu.
Lacak akurasi per kolom terhadap kumpulan dokumen tersisih yang sudah diberi label manual oleh manusia, bukan mengandalkan satu angka akurasi agregat. Sebuah pipeline bisa sangat baik pada nama vendor namun lemah pada total item baris, dan setiap pola kegagalan butuh perbaikan berbeda. Jalankan ulang evaluasi ini setiap kali prompt, skema, atau versi model berubah, karena peningkatan yang memperbaiki satu kolom bisa memperburuk kolom lain.

Foto oleh jurvetson on flickr
Ringkasan Utama
Model bahasa multimodal menggantikan template OCR khusus per vendor dengan satu pemanggilan tool berskema ketat: paksa keluaran JSON terstruktur, tautkan setiap nilai ke lokasinya di halaman, tampilkan skor keyakinan per kolom, dan arahkan hanya kolom berkeyakinan rendah ke peninjau manusia agar pipeline ekstraksi bisa berskala tanpa menjadi hambatan manual.
Selama satu dekade, mengekstrak data terstruktur dari dokumen berarti melatih pipeline OCR khusus, menyetel manual pencocok template, dan menerima kenyataan bahwa apa pun di luar distribusi pelatihan akan gagal secara diam-diam. Model bahasa besar multimodal mengubah ekonomi masalah ini. Model yang bisa membaca halaman layaknya manusia, tata letak, tabel, tulisan tangan, stempel, dan semuanya, dapat berpindah dari format faktur yang belum pernah dilihat menjadi rekaman JSON yang tervalidasi hanya dalam satu panggilan API, tanpa perlu template per vendor.
Tulisan ini membahas sisi praktis membangun pipeline tersebut: cara membingkai tugas ekstraksi sebagai pemanggilan tool yang dibatasi skema alih-alih prosa bebas, cara menautkan setiap nilai yang diekstrak ke lokasi tertentu di halaman sehingga peninjau dapat memverifikasinya dalam hitungan detik, cara menampilkan tingkat keyakinan model alih-alih menyembunyikannya, dan cara merancang tahap tinjauan manusia agar dapat berskala, bukan malah menjadi hambatan.
OCR tradisional mengubah piksel menjadi rangkaian karakter datar dan membuang tata letak dua dimensi yang justru memberi makna pada karakter tersebut. Total yang berada di sel kanan bawah sebuah tabel, sebagai string, terlihat identik dengan nomor halaman yang tersasar. Multimodal LLM sebaliknya bernalar langsung atas gambar yang dirender, sehingga perataan kolom, garis sel, indentasi, dan ketebalan huruf tetap tersedia sebagai bukti. Ini paling terasa pada dokumen yang biasa merusak pipeline klasik: hasil pindai yang miring, tata letak multi-kolom, anotasi tulisan tangan di atas teks cetak, serta stempel atau tanda tangan yang menumpuk sebuah kolom.
Mulailah dengan hasil pindai beresolusi setinggi mungkin yang bisa didapat. Multimodal LLM memproses dokumen sebagai gambar secara internal, sehingga pindaian buram beresolusi 150 dpi benar-benar kehilangan informasi yang tidak bisa dipulihkan model, sebagus apa pun prompt yang dipakai.
Peningkatan keandalan terbesar dalam pipeline ekstraksi produksi bukan berasal dari prompt yang cerdik, melainkan dari menolak menerima prosa bebas sebagai format keluaran sama sekali. Alih-alih meminta model mendeskripsikan sebuah faktur lalu mengurai deskripsi itu dengan ekspresi reguler, tentukan skema JSON yang ketat di awal dan paksa model mengisinya melalui pemanggilan tool. Ini mengubah ekstraksi menjadi pemanggilan fungsi bertipe: model mengembalikan nilai yang memenuhi skema atau tidak mengembalikan apa pun sama sekali, yang menghilangkan seluruh kategori bug parsing di hilir.
// invoice-extraction-tool.ts
const invoiceTool = {
name: "record_invoice_fields",
description: "Record extracted invoice fields with page-relative bounding boxes",
input_schema: {
type: "object",
properties: {
vendor_name: { type: "string" },
invoice_number: { type: "string" },
invoice_date: { type: "string", format: "date" },
total_amount: { type: "number" },
currency: { type: "string" },
line_items: {
type: "array",
items: {
type: "object",
properties: {
description: { type: "string" },
quantity: { type: "number" },
unit_price: { type: "number" },
bbox: {
type: "array",
items: { type: "number" },
minItems: 4,
maxItems: 4,
},
},
required: ["description", "unit_price"],
},
},
confidence: {
type: "object",
properties: {
vendor_name: { type: "number" },
total_amount: { type: "number" },
},
},
},
required: ["vendor_name", "invoice_number", "total_amount"],
},
}
// Force the model to call this tool instead of replying in prose
const response = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 2048,
tools: [invoiceTool],
tool_choice: { type: "tool", name: "record_invoice_fields" },
messages: [
{
role: "user",
content: [
{ type: "document", source: { type: "base64", media_type: "application/pdf", data: pdfBase64 } },
{ type: "text", text: "Extract every field defined in the tool schema. If a field is unreadable, omit it rather than guessing." },
],
},
],
})Dua detail membuat ini andal dalam praktik. Pertama, tandai kolom yang memang bersifat opsional sebagai opsional dalam skema, dan instruksikan model secara eksplisit untuk melewatkan kolom tersebut alih-alih mengarang nilai yang terlihat masuk akal ketika ia tidak bisa membaca sesuatu dengan jelas, karena nilai kosong jauh lebih murah untuk ditangkap dibandingkan angka hasil halusinasi. Kedua, jaga agar skema itu sendiri ditulis dalam bahasa bisnis yang sederhana, deskripsi kolom mata uang yang menyebutkan kode mata uang ISO tiga huruf dibaca lebih dapat diprediksi oleh model dibandingkan enum polos tanpa deskripsi sama sekali.
Objek JSON penuh angka yang terlihat benar nilainya sangat kecil bagi peninjau yang tidak bisa memverifikasi asal setiap angka tersebut. Grounding menutup celah ini dengan meminta model mengembalikan kotak pembatas, atau minimal nomor halaman dan wilayah perkiraan, bersama setiap kolom yang diekstrak. Ketika peninjau membuka rekaman tersebut, antarmuka menyorot persegi panjang tepat pada gambar sumber yang menghasilkan jumlah total atau nama vendor, mengubah pembacaan ulang manual selama lima menit atas seluruh faktur menjadi sekilas pandang dua detik pada satu wilayah yang disorot.
| Pendekatan | Apa yang ditautkan | Upaya peninjau |
|---|---|---|
| Tanpa grounding | Tidak ada apa pun selain nilai mentah | Membaca ulang seluruh dokumen untuk verifikasi |
| Hanya nomor halaman | Halaman asal nilai tersebut | Memindai satu halaman, bukan seluruh berkas |
| Kotak pembatas per kolom | Persegi panjang yang tepat di halaman | Sekilas pandang pada wilayah yang disorot |
| Kotak pembatas plus tingkat keyakinan | Persegi panjang dan seberapa yakin model | Hanya sorotan berkeyakinan rendah yang perlu dilihat |
Kotak pembatas yang dikembalikan oleh model bahasa bersifat perkiraan, bukan koordinat presisi piksel dari detektor tata letak. Perlakukan sebagai petunjuk kuat tentang di mana harus melihat, bukan sebagai nilai yang bisa langsung dimasukkan ke pipeline pemotongan atau penyamaran otomatis tanpa margin toleransi.
Model yang mengembalikan jumlah total tanpa indikasi kepastian memaksa setiap kolom masuk ke jalur tinjauan yang sama, entah itu tercetak jelas atau kabur di bawah noda kopi. Meminta model melaporkan sendiri tingkat keyakinan per kolom, bersama nilai yang diekstrak, memungkinkan pipeline mengarahkan rekaman secara otomatis alih-alih mengirim setiap satu rekaman ke manusia. Dalam praktik, ini berbentuk alur singkat bertahap.
Tim yang mengadopsi perutean berbasis keyakinan biasanya melihat delapan puluh hingga sembilan puluh persen dokumen yang terbentuk dengan baik disetujui otomatis, artinya peninjau manusia menghabiskan waktu hanya untuk kasus yang benar-benar ambigu, tepat di titik penilaian mereka memberi nilai tambah terbesar.
Antarmuka tinjauan bukan pemikiran belakangan yang ditempelkan pada pipeline ekstraksi, ia adalah komponen yang menentukan apakah seluruh sistem cukup dapat dipercaya untuk berjalan tanpa pengawasan sebagian besar waktu. Layar tinjauan yang baik menampilkan gambar dokumen sumber di satu sisi dan kolom hasil ekstraksi yang dapat disunting di sisi lain, dengan wilayah yang ditautkan tersorot begitu peninjau memfokuskan sebuah kolom. Koreksi harus mengalir kembali ke evaluasi, bukan menghilang setelah rekaman disetujui.
Akurasi ekstraksi bukan satu angka tunggal, melainkan tingkat akurasi per kolom yang diukur terhadap kumpulan dokumen tersisih yang sudah diberi label manual oleh manusia. Lacak per kolom, bukan sebagai satu agregat tunggal, karena pipeline yang benar sembilan puluh sembilan persen pada nama vendor namun hanya delapan puluh persen pada total item baris memiliki pola kegagalan yang sangat berbeda dari pipeline yang seluruh kolomnya berada di sembilan puluh persen, dan perbaikan untuk masing-masing pun berbeda. Jalankan ulang evaluasi ini setiap kali prompt, skema, atau versi model diubah, karena peningkatan versi yang memperbaiki satu kolom bisa secara diam-diam memperburuk kolom lain.
Simpan kumpulan evaluasi tetap yang kecil, sekitar empat puluh hingga enam puluh dokumen, yang mencakup kasus tersulit Anda, hasil pindai miring, total tulisan tangan, faktur multi-halaman, dan jalankan ulang setiap kali ada perubahan prompt atau model sebelum dirilis. Ini menangkap regresi yang luput dari pemeriksaan sekilas.
Multimodal LLM tidak menghilangkan kebutuhan akan rekayasa yang cermat pada pipeline ekstraksi dokumen, ia mengubah ke mana upaya rekayasa itu diarahkan. Alih-alih memelihara pencocok template per vendor, upaya bergeser ke desain skema, grounding, perutean berbasis keyakinan, dan kumpulan evaluasi yang menjaga kejujuran seluruh sistem seiring dokumen dan model yang terus berubah.