Dipublikasikan pada 12 Agustus 2025
Pernahkah Anda merasa lelah harus manual menginput data dari puluhan bahkan ratusan bukti transfer untuk keperluan akuntansi? Atau sebagai pemilik bisnis, Anda sering kesulitan memverifikasi pembayaran pelanggan satu per satu?
Hari ini saya akan membagikan pengalaman membangun Payment Receipt Extractor AI - sebuah API yang dapat mengekstrak data dari bukti pembayaran secara otomatis menggunakan kecerdasan buatan Google Gemini.
Sebagai developer yang sering bekerja dengan sistem keuangan, saya menemukan beberapa pain points umum:
Tim keuangan menghabiskan berjam-jam untuk menginput data dari bukti transfer. Untuk 100 transaksi, bisa memakan waktu 3-4 jam kerja manual.
Ketika lelah, kesalahan pengetikan nominal atau nomor referensi sering terjadi. Satu digit salah bisa berakibat fatal untuk rekonsiliasi.
Setiap bank memiliki format bukti transfer yang berbeda. BCA, BNI, BRI, Mandiri, BSI - semuanya unik.
Ketika volume transaksi meningkat, metode manual tidak lagi sustainable.
Setelah riset, saya memutuskan menggunakan Google Gemini 2.0 Flash karena:
Multimodal capabilities - Bisa memproses text dan image sekaligus
Bahasa Indonesia support - Excellent untuk teks berbahasa Indonesia
Fast response time - < 3 detik untuk most cases
Cost effective - Lebih murah dibanding OCR tradisional + NLP terpisah
graph TD
A[Upload Image] --> B[Base64 Encoding]
B --> C[Flask API]
C --> D[File Validation]
D --> E[Gemini AI Processing]
E --> F[Data Parsing]
F --> G[Database Storage]
G --> H[JSON Response]
Kunci sukses ada di prompt engineering. Saya menggunakan prompt yang sangat spesifik:
PAYMENT_RECEIPT_PROMPT_TEMPLATE = """
Fokus HANYA pada dokumen yang terlihat seperti bukti pembayaran/transfer bank.
Jika bukan bukti pembayaran, jawab "Dokumen ini bukan bukti pembayaran".
Ekstrak data berikut dalam format JSON:
- Transaction info (status, amount, reference number)
- Sender info (name, bank, account)
- Receiver info (name, bank, account)
- Additional info (description, method, terminal)
"""
Pro tip: Saya menemukan bahwa memberikan contoh format output yang diinginkan meningkatkan akurasi hingga 40%.
Untuk production readiness, sistem menggunakan multiple API keys:
class APIKeyManager:
def __init__(self, api_keys: List[str]):
self.api_keys = api_keys
self.current_index = 0
self.error_count = {key: 0 for key in api_keys}
def get_next_key(self) -> str:
# Round-robin with error tracking
# If error rate > 50%, skip to next key
Response dari Gemini bisa bervariasi. Saya implementasikan robust parsing:
def parse_payment_data(response_text: str) -> Dict:
try:
# Try to extract JSON from response
json_match = re.search(r'\{.*\}', response_text, re.DOTALL)
if json_match:
return json.loads(json_match.group(0))
else:
return {"status": "raw_text", "raw_response": response_text}
except json.JSONDecodeError:
return {"status": "parse_error", "raw_response": response_text}
Setelah testing dengan 500+ sample bukti transfer dari berbagai bank:
Metric | Result |
---|---|
Accuracy | 96.2% untuk format standar |
Response Time | 2.8 detik rata-rata |
Success Rate | 98.6% (dengan retry logic) |
Supported Banks | 15+ bank major Indonesia |
Otomatisasi verifikasi pembayaran SPP. Yang tadinya butuh 2 jam manual checking, sekarang cuma 10 menit.
Konfirmasi pembayaran manual bank transfer. Customer upload bukti, system auto-verify.
Bulk processing receipt untuk client. 1000 receipt diproses dalam 30 menit.
Tracking pembayaran supplier dengan akurat tanpa hire additional staff.
Prompt Engineering is King
Error Handling Strategy
Image Quality Matters
Inconsistent Bank Formats
Edge Cases
Scale Considerations
Dari pilot testing dengan 3 client:
Client A (Sekolah Swasta):
Client B (E-commerce):
Client C (Accounting Firm):
Tertarik mencoba? Ini step-by-step implementation:
git clone https://github.com/classyid/payment-receipt-extractor-ai
cd payment-receipt-extractor-ai
pip install -r requirements.txt
GEMINI_API_KEYS = [
'your_gemini_api_key_here',
# Add more for load balancing
]
python app.py
# Server runs on http://localhost:5579
import requests
import base64
with open('receipt.jpg', 'rb') as f:
file_data = base64.b64encode(f.read()).decode('utf-8')
response = requests.post('http://localhost:5579/api/process-payment', json={
"fileData": file_data,
"fileName": "receipt.jpg",
"mimeType": "image/jpeg"
})
result = response.json()
print(f"Amount: {result['data']['analysis']['parsed']['transaction']['amount']}")
https://github.com/classyid/payment-receipt-extractor-ai
Terima kasih sudah membaca! Jangan lupa star repository-nya jika artikel ini bermanfaat. Happy coding!
Tags: #AI #MachineLearning #Python #Flask #GeminiAI #FinTech #OCR #DocumentProcessing #Automation #Indonesia