Catatan Harian Mas Andri

Silahkan digunakan dengan bijaksana

back

Membangun AI Payment Receipt Extractor dengan Google Gemini: Solusi Otomatisasi Keuangan Modern

12 Agustus 2025 || 23:07:17 WIB || ClassyID

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.

 Latar Belakang Masalah

Sebagai developer yang sering bekerja dengan sistem keuangan, saya menemukan beberapa pain points umum:

1. Manual Data Entry yang Memakan Waktu

Tim keuangan menghabiskan berjam-jam untuk menginput data dari bukti transfer. Untuk 100 transaksi, bisa memakan waktu 3-4 jam kerja manual.

2. Human Error yang Tinggi

Ketika lelah, kesalahan pengetikan nominal atau nomor referensi sering terjadi. Satu digit salah bisa berakibat fatal untuk rekonsiliasi.

3. Inkonsistensi Format

Setiap bank memiliki format bukti transfer yang berbeda. BCA, BNI, BRI, Mandiri, BSI - semuanya unik.

4. Scalability Issues

Ketika volume transaksi meningkat, metode manual tidak lagi sustainable.

 Solution: AI-Powered Document Processing

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

 Arsitektur System

Tech Stack

System Flow

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]

 Implementation Deep Dive

1. Smart Prompt Engineering

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%.

2. Load Balancing & Resilience

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

3. Data Validation & Parsing

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}

 Performance Results

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

Breakdown Accuracy per Bank:

 Real-World Use Cases

1. Sekolah/Universitas

Otomatisasi verifikasi pembayaran SPP. Yang tadinya butuh 2 jam manual checking, sekarang cuma 10 menit.

2. E-commerce

Konfirmasi pembayaran manual bank transfer. Customer upload bukti, system auto-verify.

3. Accounting Firms

Bulk processing receipt untuk client. 1000 receipt diproses dalam 30 menit.

4. UMKM

Tracking pembayaran supplier dengan akurat tanpa hire additional staff.

 Lessons Learned

 What Worked Well:

  1. Prompt Engineering is King

    • Specific instructions menghasilkan output lebih konsisten
    • Contoh format output sangat membantu
    • Handling edge cases dalam prompt crucial
  2. Error Handling Strategy

    • Multiple API keys essential untuk uptime
    • Graceful degradation better than hard failures
    • Logging everything untuk debugging
  3. Image Quality Matters

    • Resolution minimum 300 DPI
    • Good lighting pada foto
    • Minimal blur/distortion

❌Challenges Faced:

  1. Inconsistent Bank Formats

    • Setiap bank punya layout beda
    • Mobile banking vs web banking format beda
    • Update UI bank bisa break parsing
  2. Edge Cases

    • Bukti transfer dengan logo blur
    • Screenshot dari screenshot (quality loss)
    • Partial receipts atau terpotong
  3. Scale Considerations

    • Gemini API rate limits
    • File storage management
    • Database optimization untuk volume tinggi

 Business Impact

Dari pilot testing dengan 3 client:

Client A (Sekolah Swasta):

Client B (E-commerce):

Client C (Accounting Firm):

 Getting Started

Tertarik mencoba? Ini step-by-step implementation:

1. Setup Environment

git clone https://github.com/classyid/payment-receipt-extractor-ai
cd payment-receipt-extractor-ai
pip install -r requirements.txt

2. Configure API Keys

GEMINI_API_KEYS = [
    'your_gemini_api_key_here',
    # Add more for load balancing
]

3. Run & Test

python app.py
# Server runs on http://localhost:5579

4. API Call Example

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']}")

Repository: 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