← Semua pembelajaran / AI Engineer Nol → Production
Fase 1 · Interaksi Pertama dengan LLM

Panggilan API pertama & streaming

Panggilan API biasa menunggu sampai seluruh jawaban selesai baru mengembalikan hasil. Untuk jawaban panjang, itu terasa lambat di mata pengguna — streaming memecah masalah ini.

Sumber asli docs.claude.com Resmi Rangkuman ~7 menit baca

Intisari

  • Panggilan non-streaming menunggu model selesai generate seluruh jawaban baru mengembalikan respons — sederhana, tapi terasa lambat untuk jawaban panjang.
  • Streaming mengirim token demi token begitu dihasilkan, lewat server-sent events (SSE) — inilah efek 'mengetik' yang dilihat di ChatGPT/Claude.
  • Streaming tidak membuat model menghasilkan jawaban lebih cepat secara total — ia membuat waktu sampai token pertama terlihat (time-to-first-token) jauh lebih pendek.
  • Untuk proses latar belakang (batch job, ekstraksi data) yang tidak ada manusia menunggu di layar, non-streaming biasanya lebih sederhana dan cukup.
  • Streaming punya bentuk event terstruktur (message_start, content_block_delta, message_stop, dst) yang harus di-parse, bukan cuma teks mentah.

Non-streaming: sederhana, tapi menunggu

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Jelaskan apa itu RAG dalam 5 paragraf"}],
)
print(response.content[0].text)  # baru tercetak setelah SELURUH jawaban selesai

Kode ini menunggu sampai model selesai menghasilkan seluruh jawaban — bisa beberapa detik untuk jawaban panjang — baru mengembalikan apa pun. Untuk proses backend yang tidak ada manusia menonton layar (job batch, pipeline ekstraksi data), ini biasanya cukup dan lebih sederhana kodenya.

Streaming: token demi token

Untuk aplikasi yang berhadapan langsung dengan pengguna — chatbot, asisten menulis — pengguna tidak mau menatap layar kosong selama lima detik. Streaming mengirim jawaban token demi token begitu dihasilkan, lewat mekanisme HTTP bernama server-sent events (SSE): koneksi tetap terbuka, server mengirim potongan data satu per satu.

with client.messages.stream(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Jelaskan apa itu RAG dalam 5 paragraf"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)  # tercetak sepotong-sepotong, secara real-time

Streaming tidak mempercepat model. Total waktu sampai jawaban lengkap selesai kurang lebih sama. Yang berubah adalah persepsi kecepatan: pengguna melihat kata pertama muncul dalam <1 detik, bukan menunggu 5 detik layar kosong lalu semuanya muncul sekaligus. Metrik yang dipakai untuk mengukur ini disebut time-to-first-token (TTFT), dan ia jadi salah satu metrik observability penting yang dibahas lagi di Fase 7.

Bentuk event di balik streaming

Di level HTTP mentah, streaming bukan cuma "teks yang dipotong-potong" — ia deretan event terstruktur. Kalau kamu memakai SDK resmi, ini semua ditangani otomatis lewat stream.text_stream seperti di atas. Tapi penting tahu bentuknya untuk debugging atau saat membangun integrasi custom:

event: message_start
data: {"type": "message_start", "message": {...}}

event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "text_delta", "text": "RAG"}}

event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "text_delta", "text": " adalah"}}

event: message_stop
data: {"type": "message_stop"}
KebutuhanPakai
Chatbot, asisten interaktifStreaming — pengguna menunggu di layar
Job batch, pipeline data, ekstraksi terstrukturNon-streaming — tidak ada yang menonton, kodenya lebih sederhana
Tool use / agent dengan banyak langkahBergantung — sering non-streaming di tiap langkah internal, streaming hanya di respons final ke pengguna

Konsekuensi arsitektur di sisi backend: handler HTTP yang mem-proxy streaming dari provider LLM ke browser harus ikut mempertahankan koneksi terbuka selama proses berlangsung — ini memengaruhi pilihan timeout server, load balancer, dan bagaimana frontend menangani koneksi yang terputus di tengah jalan. Ini salah satu alasan arsitektur backend AI berbeda dari CRUD API biasa, dibahas lagi di Fase 2 dan 6.

Latihan: jalankan kedua versi kode di atas (streaming & non-streaming) dengan prompt yang sama, dan ukur dengan time.time(): (1) waktu sampai karakter pertama muncul di layar, dan (2) waktu sampai selesai total. Bandingkan angkanya antara dua pendekatan.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.