v1.0.0-007 : Perbaikan Hallucination OCR (Prompt Bleed) & Akurasi NLP Jurnal
Menganalisis fenomena Prompt Bleed pada LLM yang memicu halusinasi OCR, memperketat aturan parsing "=" dan tanggal jatuh tempo, serta menyempurnakan logika penjurnalan Utang Usaha pada frontend.
Pembaruan kali ini berfokus pada resolusi dari dua masalah utama yang ditemukan selama masa pengujian: Halusinasi OCR (teks fiktif yang tidak ada di gambar muncul di hasil) dan kegagalan NLP Parser dalam menerjemahkan beberapa simbol serta logika penjurnalan (Utang Usaha vs Kas).
Dokumentasi ini juga memuat aturan-aturan arsitektur penting (Guardrails) yang telah diterapkan agar tidak tertimpa/terhapus di pengembangan berikutnya.
- Masalah Test ke-2: AI secara konsisten menghasilkan output fiktif (seperti nama toko “INDOMARCO”, tanggal 2023, dsb.) padahal gambar aslinya sama sekali tidak memuat teks tersebut, melanggar instruksi ketat untuk jujur (readability_status).
- Analisa “Prompt Bleed”: Fenomena ini disebut sebagai Prompt Bleed atau Pink Elephant Effect. Sebelumnya, prompt untuk OCR (di
mcp-server/src/tools/ocrTool.ts) mengandung instruksi negatif:"Dilarang menggunakan nama dummy seperti 'INDOMARCO' atau 'Bisnis' jika tidak benar-benar ada di gambar.". Alih-alih menghindarinya, parameter ‘INDOMARCO’ justru menjadi anchor atensi pada latent space LLM, sehingga LLM memuntahkan persis nama tersebut saat ia kebingungan membaca gambar buram. - Penyelesaian: Referensi kata spesifik dihapus seluruhnya dari kalimat negatif. Kalimat diubah menjadi:
"Dilarang keras menggunakan data fiktif atau menebak nama jika tidak ada di gambar."
- Masalah: Pada prompt
parseTransactionSystemPrompt, input pengguna sepertiCHITATO 20PCS = 33700disalahartikan AI. Angka33700dianggap sebagai harga satuan, sehingga ditotal menjadi674.000(20 x 33.700). - Penyelesaian: Penambahan aturan mutlak pada baris prompt:
“TANDA SAMA DENGAN (=): Jika ada tanda sama dengan (=) setelah nama barang dan qty, maka angka setelah ‘=’ adalah HARGA TOTAL (total). Harga satuan (unit_price) HARUS Anda hitung sendiri dengan membagi total / qty. KECUALI teks menggunakan lambang ‘@’ yang menandakan harga satuan.”
- Aturan Bertahan: Aturan ini wajib ada pada setiap versi system prompt transaksi ke depan untuk mencegah regresi logika.
- Masalah: Meskipun pengguna menyebutkan jatuh tempo (misal: “JATUH TEMPO PADA TANGGAL 03/08/2026”), AI sering membuangnya dari JSON akhir. Di antarmuka pengguna (Blonjo), kolom untuk melihat tanggal ini juga tidak tersedia sehingga sulit dikoreksi.
- Penyelesaian:
- Mengubah struktur contoh output di dalam system prompt agar memuat
due_date: "YYYY-MM-DD". Tanpa contoh skema, LLM kerap berasumsi field tersebut tidak dibutuhkan. - Memperbarui
ParsePreview.tsx(Frontend Blonjo) untuk memunculkan kolom input Metode Pembayaran dan Jatuh Tempo (Jika Tempo) di layar pratinjau transaksi, sejajar dengan field Total Nominal.
- Mengubah struktur contoh output di dalam system prompt agar memuat
- Masalah: Transaksi pembelian dengan metode pembayaran “Tempo” tetap dijurnal otomatis dengan kredit pada akun Kas, bukan Utang Usaha.
- Penyelesaian: Pada file
useSmartConfirm.ts(fungsibuildDefaultEntries), logika yang sebelumnya melakukan hardcode pengkreditan ke['kas', 'bank']diubah menjadi kondisional. Jika parameterpayment_methodmemuat kata"tempo","hutang", atau"kredit", maka sisi jurnal pembiayaan otomatis diarahkan untuk mencari akun dengan keyword['hutang', 'utang'](untuk purchase) atau['piutang'](untuk sales).
Catatan Historis: Seluruh logika parsing ini pernah dibuat sebelumnya pada iterasi lama, namun sering tertimpa (overwritten) seiring pengujian OCR murni ke RAG. Keberadaan file changelog ini berfungsi sebagai pengingat sistem bahwa aturan =, due_date, dan Prompt Bleed sangat krusial dan dilarang dihapus pada refaktor di masa depan.