AI Sözlüğü
Başlangıç· ~2 dk okuma#streaming#sse#ux

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.

CEVAP TOKEN TOKEN AKAR0.2sYapay0.4sYapay zeka0.6sYapay zeka geleceği0.9sYapay zeka geleceği şekillendiriyor.kullanıcı tüm cevabı beklemez — her token gelir gelmez UI günceller
Tanım

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.

Benzetme

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.

Gerçek dünyadan örnek

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.

Ne zaman kullan
  • 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
Ne zaman kullanma
  • 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
Sık yapılan hatalar

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.