Kursus → Modul 10: Batch Processing & Skala
Sesi 3 dari 8

Masalah Kecepatan

Satu API call butuh 3 sampai 15 detik tergantung model, panjang prompt, dan panjang output. Chain tiga agent butuh 9 sampai 45 detik. Jalanin 100 chain secara sequential, dan kamu nunggu 15 sampai 75 menit. Itu bukan bottleneck kualitas konten, tapi bottleneck waktu kamu. Kamu duduk nganggur, nonton progress bar, padahal bisa review output.

Concurrency menyelesaikan ini. Daripada jalanin satu chain pada satu waktu, kamu jalanin beberapa chain bersamaan. Total waktu processing turun dari N * waktu_per_chain ke kira-kira N / concurrency_limit * waktu_per_chain.

Cara Kerja asyncio

Library asyncio Python memungkinkan kamu jalanin beberapa task secara concurrent tanpa thread atau process. Konsep intinya: waktu satu task nunggu respons API (yang butuh detik-an), task lain bisa mulai API call-nya. Ga ada task yang nge-block yang lain.

Tiga komponen yang bikin ini jalan:

Komponen Fungsinya Analogi
async def Mendeklarasikan fungsi yang bisa pause dan resume Stasiun dapur yang bisa pause di tengah resep sambil nunggu oven
await Pause fungsi sampai hasil datang "Tunggu oven" tanpa nge-block stasiun lain
asyncio.gather Jalanin beberapa async function secara concurrent Jalanin 5 stasiun dapur sekaligus, masing-masing masak hidangan beda

Pola Semaphore

Jalanin 100 API call bersamaan bakal trigger rate limit dan bisa overwhelm sistem kamu. Semaphore membatasi jumlah operasi concurrent.

flowchart TD A["100 Task Mengantri"] --> B["Gerbang Semaphore
(maks 10 concurrent)"] B --> C["10 task berjalan"] C --> D["Task selesai"] D --> E["Semaphore lepas slot"] E --> F["Task antrian berikutnya masuk"] F --> C D --> G["Hasil disimpan"] style A fill:#222221,stroke:#c8a882,color:#ede9e3 style B fill:#222221,stroke:#c47a5a,color:#ede9e3 style C fill:#222221,stroke:#6b8f71,color:#ede9e3 style D fill:#222221,stroke:#8a8478,color:#ede9e3 style E fill:#222221,stroke:#c8a882,color:#ede9e3 style F fill:#222221,stroke:#6b8f71,color:#ede9e3 style G fill:#222221,stroke:#8a8478,color:#ede9e3

Nilai semaphore tergantung rate limit API kamu. Kalo provider kamu mengizinkan 60 request per menit dan setiap chain bikin 3 request, semaphore 10 menjaga kamu di sekitar 30 active request, jauh di dalam batas.

Angka Performa Nyata

Diuji dengan chain tiga agent (research, write, edit) yang generate artikel 1.000 kata. Rata-rata waktu chain: 25 detik.

Ukuran Batch Sequential 5 Concurrent 10 Concurrent 25 Concurrent
10 artikel 4 mnt 10d 1 mnt 15d 40d 30d
25 artikel 10 mnt 25d 2 mnt 45d 1 mnt 30d 40d
50 artikel 20 mnt 50d 5 mnt 25d 2 mnt 55d 1 mnt 15d
100 artikel 41 mnt 40d 10 mnt 50d 5 mnt 45d 2 mnt 30d

Di 25 concurrent chain, 100 artikel selesai di-generate dalam waktu kurang dari 3 menit. Bottleneck berpindah sepenuhnya dari generation ke human review, yang emang seharusnya begitu.

Error Handling di Batch Concurrent

Waktu satu chain gagal di batch concurrent, ga boleh ikut menjatuhkan chain lain. Bungkus setiap chain dalam blok try/except. Waktu gagal, log error-nya dan ID baris yang gagal. Setelah batch selesai, retry cuma baris yang gagal.

async def safe_chain(topic, semaphore):
    async with semaphore:
        try:
            return await run_chain(topic)
        except Exception as e:
            log_error(topic, e)
            return {"id": topic.id, "status": "failed", "error": str(e)}

Setelah batch selesai, filter hasil untuk status "failed" dan jalanin ulang cuma baris itu. Ini memberikan kamu batch lengkap dengan komputasi terbuang yang minimal.

Connection Pooling

Setiap API call membuka koneksi HTTP. Membuka 25 koneksi bersamaan dan menutupnya setelah setiap call itu boros. Connection pooling me-reuse koneksi antar call, mengurangi overhead. Library aiohttp Python menangani ini otomatis dengan session object.

Buat satu session di awal batch. Passing ke semua chain. Tutup waktu batch selesai. Perubahan tunggal ini bisa mengurangi latency per call sebesar 100 sampai 200 milidetik, yang menumpuk di ratusan call.

Concurrency itu throughput multiplier, bukan quality multiplier. Pipeline kamu menghasilkan output yang sama entah kamu jalanin satu chain atau 25. Concurrency cuma berarti kamu nunggu 2 menit bukan 40. Gunakan waktu yang dihemat untuk tahap yang beneran penting: human review.

Bacaan Lanjutan

Tugas

Tulis (atau minta AI coding assistant kamu tulis) script yang mendemonstrasikan concurrency:

  1. Buat 10 API call secara sequential. Catat total waktu.
  2. Buat 10 API call secara concurrent dengan semaphore yang membatasi 5 call bersamaan. Catat total waktu.
  3. Hitung faktor speedup-nya.

Lalu terapkan ke pipeline kamu yang sesungguhnya: jalanin batch manifest dari Sesi 10.2 dengan concurrent processing. Bandingkan total waktu batch dengan sequential processing. Dokumentasikan masalah apa pun: rate limit error, connection timeout, atau perbedaan kualitas antara output sequential dan concurrent.