Streaming
Token Akışı
LLM'in cevabını bütünüyle değil, üretildiği gibi token token akıtması. Kullanıcı tüm cevabı beklemeden ilk kelimeleri görmeye başlar.
Bir LLM bir cevabı oluştururken token'ı tek tek üretir. Klasik HTTP response'da tüm cevap tamamlandıktan sonra kullanıcıya gönderilir (~1-30 saniye bekleme). Streaming ile her üretilen token anında kullanıcıya gönderilir — UI'da harf harf yazılıyor gibi görünür.
Teknik altyapı: Server-Sent Events (SSE) standardı yaygındır.
OpenAI, Anthropic, Google API'leri stream: true parametresiyle SSE
chunk akışı döner. Her chunk bir veya birkaç token içerir.
Avantaj: algılanan latency dramatik düşer. İlk token (TTFT — Time-To-First-Token) genelde 200-500ms, ama tüm cevap 5-10 saniye olabilir. Streaming ile kullanıcı 200ms içinde "model çalışıyor" görür, beklemez.
Kasapta sıra beklemek gibi düşün. Klasik: kasap tüm sosisleri arkaya gizler, hepsi paketlenince teslim eder. Streaming: her sosis hazırlanır hazırlanmaz tezgaha koyar — sen ilkini almaya başlarsın, son sosis gelirken birinciyi yiyorsundur.
ChatGPT'ye uzun bir analiz sordun. Streaming yoksa: 8 saniye boş ekran, sonra hep birden 300 kelime düşer. Kullanıcı dener "donmuş mu?" diye. Streaming ile: 200ms'de ilk kelime, sonra saniyede 50-80 token akışı. Kullanıcı okumaya başlar, beklediğini hissetmez.
OpenAI Python SDK ile minimum implementasyon:
``
stream = client.chat.completions.create(
model="gpt-4o",
messages=[...],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)
``
Frontend'de fetch + ReadableStream API ya da SSE EventSource kullanılır.
- Chat arayüzleri — kullanıcı bekleme algısını azaltır
- Uzun cevap üreten endpoint'ler (özet, makale, kod)
- Reasoning model'ler — düşünme süreleri uzun, akış olmadan UX kötü
- Mobile UI — yavaş ağda kullanıcıyı kaybetmemek
- Yapılandırılmış JSON çıktısı şartsa (parse edilemeyebilir parça parça)
- Function calling cevabı — tek atomic response gerekiyor
- Çok kısa cevaplar — overhead'e değmez
- Backend-to-backend entegrasyon — kullanıcı yok, akış gereksiz
Hata yönetimi karmaşıklaşır
Stream yarıda kesilirse ne olacak? Yarım cevap mı saklanacak? Retry yapılınca baştan mı başlayacak? Klasik request/response'tan daha çok edge case.
Token sayma ve fatura
Stream'i client tarafında durdurabilirsin (cancel) ama backend o ana kadar üretilen token'ları yine ücretlendirebilir. AbortController doğru kullan.
JSON'u akış sırasında parse etmeye kalkma
JSON çıktısı stream'lenirse parça parça gelir. Satır bazlı JSONL ise sorun yok; ama tek büyük JSON nesnesini parça parça parse etmeye kalkma — özel bir incremental JSON parser gerekir.