Membuka rekening koran bukanlah hal yang menyenangkan bagi siapa pun. Dokumen-dokumen ini datang dalam bentuk PDF hasil pemindaian, ekspor CSV, atau file XML yang dipenuhi dengan akronim rumit seperti OFX. Bagi akuntan, pemegang buku, dan pengembang fintech, mengubah dokumen-dokumen ini menjadi data terstruktur yang bersih adalah sakit kepala yang terus-menerus. Ketika model bahasa besar (LLM) muncul ke permukaan, mereka tampak menawarkan jalan keluar. Cukup masukkan PDF ke mesin dan minta JSON. Apa yang bisa salah?

Saya mempelajari dengan tepat apa yang bisa salah saat membangun StatementDecoder, sebuah alat yang dirancang untuk mengubah rekening koran menjadi data yang dapat digunakan. Seperti banyak pengembang lainnya, saya berasumsi bagian tersulit adalah mengajari sistem untuk membaca berbagai tata letak dokumen. Saya salah. Membaca dokumen hampir terasa sepele. Mimpi buruk yang sebenarnya adalah mengenali saat mesin secara diam-diam mengarang angka atau menukar dua digit dalam jumlah transaksi.

Demo yang Berhasil Terlalu Baik

Upaya pertama saya sangat sederhana dan menggoda. Saya memasukkan rekening koran langsung ke dalam LLM dan meminta JSON terstruktur sebagai balasannya. Hasilnya terasa seperti sihir. Model tersebut menangani berbagai tata letak dengan mudah. Ia membaca PDF hasil pemindaian yang membuat parser standar gagal. Ia tampak memahami tabel, header, dan laporan multi-halaman tanpa instruksi eksplisit. Selama beberapa jam yang menyenangkan, saya pikir masalahnya sudah selesai.

Kemudian saya mengujinya dengan data pelanggan asli, dan sihir itu pun menguap. Bank-bank di Inggris masing-masing menggunakan desain laporan mereka sendiri, dan perbedaannya bukan sekadar kosmetik. Laporan Wise memiliki keunikan formatnya sendiri. Ekspor CSV Revolut terlihat sederhana sampai Anda menyadari bagaimana mereka menangani transaksi multi-mata uang dan kolom metadata. File OFX lama, format yang benar-benar terlihat seperti berasal dari tahun 1990-an, melemparkan struktur tag kuno dan masalah pengodean ke parser mana pun yang mengharapkan markup modern.

Model tersebut masih mengekstrak data jauh lebih baik daripada sistem templat siap pakai mana pun. Namun, "jauh lebih baik" saja tidak cukup ketika uang yang terlibat.

Ketika Akurasi 99% Adalah Sebuah Kegagalan

Inilah masalah mendasar dalam menggunakan AI untuk ekstraksi data keuangan. Jika sebuah model memproses dua ratus baris transaksi dan mendapatkan seratus sembilan puluh sembilan yang benar, hasilnya tampak sempurna. JSON-nya terbentuk dengan baik. Kunci dan nilainya selaras. Peninjauan sekilas mungkin tidak menunjukkan sesuatu yang mencurigakan. Namun, jika satu kesalahan itu menukar dua digit dalam jumlah, mengubah setoran menjadi penarikan, atau menggeser titik desimal, pembukuan Anda akan rusak. Anda tidak akan bisa menangkapnya hanya dengan melihat sekilas tumpukan data terstruktur.

Manusia yang meninjau JSON mentah jarang menyadari digit yang tertukar dalam jumlah transaksi. Formatnya sempurna, yang secara paradoks justru membuat kesalahan tersebut lebih berbahaya. Anda tidak bisa merilis alat keuangan yang benar sebagian besar waktu. Alat tersebut harus benar, atau harus menyatakan dengan jelas bahwa ia tidak yakin.

Reaksi awal saya dapat diprediksi. Saya merancang prompt yang lebih baik. Saya beralih ke model yang lebih mumpuni. Saya bereksperimen dengan penalaran chain-of-thought agar model menunjukkan proses kerjanya. Tidak ada satu pun dari hal ini yang memperbaiki masalah inti. Saya meminta sistem probabilistik yang sama untuk menghasilkan jawaban, lalu meminta sistem yang identik itu untuk mensertifikasi bahwa jawaban tersebut benar. Itu bukan verifikasi. Itu hanyalah teater konsistensi diri (self-consistency theater).

Biarkan Matematika yang Menentukan

Rekening koran memiliki fitur yang tidak dimiliki sebagian besar dokumen: batasan aritmatika bawaan. Saldo awal ditambah jumlah semua transaksi harus sama dengan saldo akhir. Saldo berjalan, jika ada, harus selaras baris demi baris. Ini bukan sekadar preferensi gaya. Ini adalah aturan baku.

Saya membangun kembali arsitekturnya berdasarkan wawasan ini. Sekarang, setiap ekstraksi, terlepas dari asalnya, melewati lapisan validasi sebelum dilihat oleh pengguna. Tidak peduli apakah data tersebut berasal dari LLM yang menginterpretasikan PDF yang buram, mesin OCR yang membaca halaman hasil pemindaian, atau penguraian CSV langsung. Validator memperlakukan semua sumber dengan tingkat kecurigaan yang sama.

Pemeriksaannya sangat sederhana. Tambahkan setiap transaksi ke saldo awal. Bandingkan hasilnya dengan saldo akhir yang tertera. Jika angka-angkanya tidak cocok, ada yang salah. Tandai laporan tersebut untuk ditinjau. Tolak ekstraksinya. Jangan biarkan data tersebut sampai ke pengguna.

Perubahan tunggal ini mengubah seluruh karakter produk tersebut. Model bahasa tidak lagi perlu menjadi sempurna. Ia hanya perlu cukup baik untuk menghasilkan output yang dapat lolos uji matematika. Tekanannya bergeser dari upaya mencapai akurasi yang mustahil dalam domain yang tidak terikat, menjadi membangun loop umpan balik yang ketat antara pembuatan (generation) dan verifikasi.

Validator tersebut juga mengungkap pola dalam kesalahan yang terjadi. Jenis dokumen tertentu secara konsisten gagal dalam pemeriksaan matematika, yang memberi tahu saya dengan tepat di mana harus mencurahkan upaya. Alih-alih meningkatkan prompt engineering secara membabi buta di seluruh bagian, saya bisa melihat bahwa tata letak bank tertentu menyebabkan kesalahan sistematis.

Kode di Tempat yang Seharusnya, AI di Tempat Ia Bersinar

Mungkin pelajaran yang paling merendahkan hati adalah menyadari betapa banyak bagian dari pipeline yang sama sekali tidak membutuhkan AI. Ketika saya menemukan file OFX Australia yang berantakan, insting saya adalah melemparkan token ke masalah tersebut. Saya sempat mempertimbangkan untuk memasukkan XML yang rusak ke dalam model dan memintanya untuk memperbaiki strukturnya sebelum melakukan parsing. Sebaliknya, saya menulis dua puluh baris kode deterministik. Kode tersebut memperbaiki keanehan encoding dan tag yang salah format secara instan, dengan biaya nol per file dan reproduksibilitas yang sempurna.

Pengalaman tersebut memperjelas bagaimana pipeline ekstraksi seharusnya diatur. Ada tiga tugas yang berbeda, dan ketiganya tidak boleh dicampuradukkan.

  • Model memahami dokumen yang berantakan. PDF hasil pemindaian dengan tabel yang melengkung, campuran font, dan tulisan tangan