AI Infrastructure

Kullanıcı Deneyimini Optimize Etmek: LLM'ler İçin Token Akışına Derin Bir Bakış

Büyük Dil Modelleri (LLM'ler) üretim uygulamalarına giderek daha fazla entegre edilirken, anında yanıt beklentisi hiç olmadığı kadar yüksek. İstemcinin herhangi bir çıktı göstermeden önce tüm oluşturmanın tamamlanmasını beklediği geleneksel istek-yanıt kalıpları genellikle kabul edilemeyecek şekilde yüksek gecikmeye neden olur. Bu "ilk tokena kadar geçen süre" sorunu, uzun formatlı içerik oluşturması için özellikle akut bir hal alır. Çözüm ne? Token Akışı.

Token akışı, tüm yanıtın bitmesini beklemek yerine, oluşturulan tokenların (kelimeler veya kelimelerin parçaları) istemciye üretildikleri anda gönderilmesini sağlayan bir tekniktir. Bu kalıbı uygulayarak geliştiriciler algılanan gecikmeyi önemli ölçüde azaltabilir ve kullanıcıların AI hala son kısmı düşünürken yanıtın başını okumaya başlayabilmesini sağlayabilir. Bu blog yazısı, sağlam bir token akışı altyapısı oluşturmak için mimariyi, uygulama detaylarını ve en iyi uygulamaları incelemektedir.

Akışın Mimarisi

Yüksek düzeyde, token akışı istemci ile sunucu arasında kalıcı bir bağlantı gerektirir. Web bağlamlarında bunun için en yaygın protokol Sunucu Tarafından Gönderilen Olaylar (SSE)'dir. İki yönlü olan WebSockets'in aksine, SSE sunucudan istemciye veri itme için ideal olan tek yönlü bir kanaldır. HTTP'nin üzerinde inşa edildiği için, ek yapılandırma yükü olmadan standart güvenlik duvarlarından ve yük dengeleyicilerden kolayca proxylenebilir.

LLM bir yanıt oluşturduğunda, tüm metni tek seferde üretmez. Bunun yerine, otoregresif bir şekilde tokenları tek tek üretir. Sunucunun rolü, bu tokenları modelin çıktı akışından yakalamak ve bağlı olan istemciye hemen itmektir. Bu işlem, tek bir engelleme (blocking) HTTP isteğini sürekli bir veri akışına dönüştürür.

Python'da Sunucu Tarafından Gönderilen Olayların (SSE) Uygulanması

SSE uygulaması, FastAPI gibi modern asenkron çerçeveler kullanılarak oldukça basittir. Aşağıda, hayali bir LLM istemciden gelen yanıtları akışa alan bir uç nokta oluşturmanın pratik bir örneği yer almaktadır.


import asyncio
from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()

async def generate_stream(prompt: str):
    """
    Bir LLM'nin tokenları tek tek oluşturmasını simüle eder.
    Üretim ortamında bu, modelin çıktısı üzerinde bir asenkron yinelleyici (iterator) olurdu.
    """
    # Simüle edilmiş tokenlar
    tokens = [
        "Gelecek ",
        "yapay ",
        "zeka ",
        "alanında ",
        "şimdi ",
        "burada.",
        "\n\n",
        "Akış ",
        "gecikmeyi ",
        "azaltır."
    ]
    
    for token in tokens:
        # Tokenı SSE formatında gönder
        yield f"data: {token}\n\n"
        # Ağ veya model işleme gecikmesini simüle et
        await asyncio.sleep(0.1)

@app.post("/chat/stream")
async def stream_response(prompt: str):
    return StreamingResponse(
        generate_stream(prompt),
        media_type="text/event-stream"
    )

Bağlantı Kararlılığı ve Hata Kurtarma İşleme

Akış, kullanıcı deneyimini iyileştirse de, bağlantı kararlılığı konusunda karmaşıklık getirir. Ağ kesintileri akışı bozabilir ve kullanıcının kısmi içerikle karşılaşmasına neden olabilir. Bunu azaltmak için SSE mesajlarınızda her zaman bir id alanı bulun. Bu, istemcinin belirli bir noktadan itibaren yalnızca yeni tokenları talep etmesini sağlar ve veri kaybı olmadan yeniden bağlantıyı kolaylaştırır.

Ayrıca, istemci tarafında geri çekilme (backoff) stratejileri uygulamayı düşünün. Bağlantı koptuğunda istemci hemen yeniden denememelidir; bunun yerine, kararsızlık dönemlerinde sunucuyu aşırı yüklememek için üssel geri çekilme (exponential backoff) kullanmalıdır. Uzun süren oluşturma işlemleri için, istemci erken ayrıldığında sunucuda kullanılmayan kaynakları temizleyen bir zaman aşımı mekanizması da uygulamak isteyebilirsiniz.

Sonuç

Token akışı artık modern AI uygulamaları için bir lüks değil, bir zorunluluktur. Sunucu Tarafından Gönderilen Olayları ve asenkron programlamadan yararlanarak geliştiriciler, kullanıcılarına yanıt veren, ChatGPT benzeri deneyimler sunabilir. Altyapı olgunlaştıkça, akışın entegrasyonunu daha da erişilebilir hale getirecek daha standart kütüphanelerin ve en iyi uygulamaların ortaya çıkmasını bekliyoruz. Kullanıcıların beklediği gerçek zamanlı etkileşimi sağlamak için bugün akış uygulamaya başlayın.

Share: