0Pricing
AI Engineering Academy · Ders

Zaman Aşımı Bütçeleri ve Zarif Bozulma

İş akışınızın her katmanında sıkı zaman aşımı bütçeleri belirleyin ve LLM bütçesini aştığında önbelleğe alınmış veya basitleştirilmiş yanıtlar sunan zarif bozulmayı uygulayın.

Zaman Aşımı Bütçeleri ve Zarif Bozulma, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Zaman Aşımı Bütçesi Nedir?

Zaman aşımı bütçesi, bir isteğin işlem hattınızın tüm aşamalarında tamamlanması için ayrılan toplam en uzun süredir. Her bir API çağrısına rastgele bir zaman aşımı koymak yerine, kullanıcıya sunulan işlemin baştan sona bütçesini tanımlar ve bunu alma, LLM üretimi ve işlem sonrası adımlar arasında dağıtırsınız. Böylece bazı aşamalar yavaş olsa bile her zaman kabul edilebilir bir süre içinde yanıt verirsiniz.

Bütçeyi İşlem Hattı Aşamaları Arasında Dağıtma

Tipik bir RAG sohbet işlem hattının üç aşaması vardır: alma, LLM üretimi ve yanıt biçimlendirme. Her birinin normalde ne kadar sürdüğüne ve kullanıcıların ne kadar gecikmeyi tolere ettiğine göre her aşamaya bir zaman dilimi ayırın. Kalan esneklik payı gerileme arabelleğinizdir — herhangi bir aşama kendisine ayrılan sürenin tamamını kullanırsa genel bütçe içinde kalmak için sonraki aşamalarda bazı işlemleri azaltmaya başlarsınız.

# Total user-facing SLA: 8000ms
BUDGET_TOTAL_MS = 8000

BUDGET_STAGES = {
    'retrieval':   1500,  # vector search + rerank
    'llm_call':    5500,  # token streaming
    'formatting':  500,   # post-processing
    'slack':       500,   # buffer for overhead
}

assert sum(BUDGET_STAGES.values()) == BUDGET_TOTAL_MS

Bütçe Tüketimini İzleme

Başlangıç zamanını kaydeden ve her aşama geçişinde kalan bütçeyi kontrol eden bir BudgetTracker kullanın. Bir aşamayı başlatmadan önce yeterli bütçe kaldığını doğrulayın. Bu, sonraki aşamaların uyum sağlamasına olanak tanır — 1500 ms’lik bütçesinin 1200 ms’sini kullanan bir alma adımı yalnızca 300 ms esneklik payı bırakır; bu da daha basit bir LLM istemini tetiklemeli veya yeniden sıralama adımını atlamalıdır.

import time

class BudgetTracker:
    def __init__(self, total_ms: float):
        self.start = time.perf_counter()
        self.total_ms = total_ms

    def elapsed_ms(self) -> float:
        return (time.perf_counter() - self.start) * 1000

    def remaining_ms(self) -> float:
        return self.total_ms - self.elapsed_ms()

    def check(self, stage: str, required_ms: float = 0) -> bool:
        remaining = self.remaining_ms()
        if remaining < required_ms:
            print(f'Budget exhausted before {stage}: {remaining:.0f}ms left, need {required_ms}ms')
            return False
        return True

Zarif Gerilemenin Tanımı

Zarif gerileme, işlem hattının tamamı bütçe içinde tamamlanamadığında hata döndürmek yerine daha düşük kaliteli ancak yine de yararlı bir yanıt sunmak anlamına gelir. Örnekler arasında önbelleğe alınmış bir yanıt döndürmek, yeniden sıralamayı atlamak, bağlam penceresini kısaltmak, daha hızlı ancak daha az isabetli bir model kullanmak veya önceden yazılmış bir yedek mesaj döndürmek yer alır. Amaç her zaman kullanıcıya hiçbir şey yerine bir şey sunmaktır.

# Degradation ladder for a RAG chat endpoint:
# Level 0 (normal):  retrieve 10 chunks + rerank + GPT-4o   -- 8000ms budget
# Level 1 (fast):    retrieve 5 chunks + skip rerank + GPT-4o -- 5000ms budget
# Level 2 (minimal): retrieve 3 chunks + GPT-4o-mini          -- 3000ms budget
# Level 3 (cached):  return semantic cache hit                 -- 100ms
# Level 4 (sorry):   return static 'Try again in a moment'    -- 1ms

Gerileme Merdivenini Uygulama

Her işlem hattı karar noktasında kalan bütçeyi kontrol edin ve uygun kalite düzeyini seçin. Aşağıdaki kod, kalan bütçeye göre alma derinliğini ve modeli seçer. Böylece normal yük altında kullanıcılar en iyi kaliteyi alırken, yüksek gecikme dönemlerinde de zaman aşımı hatası yerine yararlı bir yanıt alırlar.

async def smart_rag_query(question: str, budget_ms: float = 8000) -> str:
    tracker = BudgetTracker(budget_ms)

    # Retrieval stage
    if tracker.remaining_ms() > 5000:
        chunks = await retrieve_and_rerank(question, top_k=10)
    elif tracker.remaining_ms() > 3000:
        chunks = await retrieve(question, top_k=5)  # skip rerank
    elif tracker.remaining_ms() > 1500:
        chunks = await retrieve(question, top_k=3)  # minimal retrieval
    else:
        return await get_cached_or_static(question)

    # LLM stage
    if tracker.remaining_ms() > 4000:
        model = 'gpt-4o'
    else:
        model = 'gpt-4o-mini'  # faster fallback

    timeout = tracker.remaining_ms() / 1000 - 0.5
    return await generate_answer(question, chunks, model, timeout)

API Çağrısı Düzeyinde Zaman Aşımlarını Ayarlama

Her harici API çağrısında her zaman açık zaman aşımı değerleri ayarlayın. OpenAI Python SDK’sı saniye cinsinden bir timeout parametresini kabul eder. İstisnayı ele alıp genel yanıt süresi sınırından önce zarif gerileme uygulayabilmek için bu değeri kalan bütçeden biraz daha kısa ayarlayın. SDK’nın varsayılan zaman aşımına asla güvenmeyin — bu değer kullanıcıya sunulan istekler için çok uzun olabilir.

async def generate_answer(question: str, chunks: list, model: str, timeout_sec: float) -> str:
    context = '\n\n'.join(chunks)
    prompt = f'Answer using this context:\n{context}\n\nQuestion: {question}'
    try:
        resp = await client.chat.completions.create(
            model=model,
            messages=[{'role': 'user', 'content': prompt}],
            max_tokens=500,
            timeout=max(timeout_sec, 1.0)  # minimum 1 second
        )
        return resp.choices[0].message.content
    except openai.APITimeoutError:
        return 'I was unable to generate a response in time. Please try again.'

Kısmi Akış Yanıtları Döndürme

Akış kullanırken bütçe dolmadan önce üretilmiş kısmi yanıtları döndürebilirsiniz. Akışın ortasında zaman aşımı oluştuğunda yeni belirteçleri okumayı durdurun, üç nokta veya kısa bir devam istemi ekleyin ve akışı kapatın. Kullanıcı, boş bir hata yerine düzgün biçimde kesilen bir yanıt görür. Bu yalnızca akış kullanıldığında mümkündür — akışsız çağrılar ya hep ya hiç şeklindedir.

async def stream_with_budget(question: str, budget_ms: float):
    tracker = BudgetTracker(budget_ms)
    collected = []
    stream = await client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': question}],
        stream=True
    )
    async for chunk in stream:
        if tracker.remaining_ms() < 200:  # 200ms safety margin
            collected.append(' [response truncated]')
            break
        delta = chunk.choices[0].delta.content or ''
        collected.append(delta)
        yield delta
    # Ensure stream is closed even if budget exceeded
    await stream.close()

Gerileme Katmanı Olarak Anlamsal Önbellek

Anlamsal önbellek, neredeyse sıfır gecikmeye sahip olduğu için mükemmel bir gerileme katmanıdır. LLM’yi çağırmadan önce benzer geçmiş sorular için anlamsal önbelleğinizi sorgulayın. Benzerlik oranı yüksek bir önbellek isabeti (0,92 kosinüs benzerliğinin üzerinde) bulunursa önbelleğe alınmış yanıtı hemen döndürün. Bu hem yanıtları hızlandırır hem de LLM yavaş olduğunda veya kullanılamadığında anında bir yedek sağlar.

async def query_with_cache_fallback(question: str, budget_ms: float = 8000) -> str:
    # Try semantic cache first (fast)
    cached = await semantic_cache.lookup(question, threshold=0.92)
    if cached:
        return cached.response

    tracker = BudgetTracker(budget_ms)
    # Try full pipeline
    if tracker.remaining_ms() > 3000:
        try:
            return await smart_rag_query(question, tracker.remaining_ms())
        except Exception:
            pass  # fall through to static response

    # Last resort
    return 'I am experiencing high load right now. Please try again in a moment.'

Gerileme Olaylarını Günlüğe Kaydetme

İşlem hattınız her daha düşük bir kalite düzeyine gerilediğinde bunu yapılandırılmış bir olay olarak günlüğe kaydedin. Ulaşılan gerileme düzeyini, her aşamada kalan bütçeyi ve nihai gecikmeyi ekleyin. Bu günlükleri analiz etmek, her gerileme düzeyinin ne sıklıkta tetiklendiğini gösterir; böylece bütçeleri ayarlayabilir, sürekli olarak bütçeyi aşan aşamaları belirleyebilir ve altyapı yatırımlarını gerekçelendirebilirsiniz.

import structlog

log = structlog.get_logger()

def log_degradation(level: int, stage: str, remaining_ms: float, total_ms: float):
    log.warning(
        'pipeline_degradation',
        degradation_level=level,
        triggered_at_stage=stage,
        remaining_budget_ms=round(remaining_ms),
        total_budget_ms=total_ms,
        budget_consumed_pct=round((total_ms - remaining_ms) / total_ms * 100)
    )

Kullanıcı Beklentilerini Arayüz Sinyalleriyle Yönetme

Gerilemiş bir yanıt sunarken kalite düzeyinin normalden düşük olabileceğini kullanıcıya bildirin. Bir sohbet arayüzünde “Hızlı yanıt modu — bazı ayrıntılar sınırlı olabilir.” gibi göze batmayan bir gösterge görüntüleyin. Bir çıkarma API’si için JSON yanıtına degraded: true alanını ekleyerek sonraki tüketicilerin gerilemiş sonuçları farklı biçimde ele almasını sağlayın. Şeffaflık, kesintiler sırasında bile kullanıcı güvenini korur.

from pydantic import BaseModel
from typing import Optional

class ChatResponse(BaseModel):
    content: str
    degraded: bool = False
    degradation_level: Optional[int] = None  # 0=full, 1=fast, 2=minimal, 3=cached
    latency_ms: int

# API response when degraded:
# {
#   'content': 'Here is a brief answer...',
#   'degraded': true,
#   'degradation_level': 2,
#   'latency_ms': 2800
# }

Bütçe Dağılımlarını Zaman İçinde Ayarlama

İlk bütçe dağılımları tahmin niteliğindedir. Üretimde bir hafta çalıştıktan sonra izleme verilerinizi kullanarak her aşamada harcanan sürelerin dağılımını analiz edin. Alma işlemi kendisine ayrılan 1500 ms yerine sürekli olarak 800 ms sürüyorsa bu esneklik payını LLM aşamasına aktarın; böylece daha fazla çıktı belirteci veya daha geniş bir bağlam penceresi kullanılabilir. Bütçe ayarlama, tek seferlik bir yapılandırma değil, sürekli yürütülen bir operasyon faaliyetidir.

# Budget tuning based on production p95 data:
ACTUAL_P95 = {
    'retrieval': 780,    # vs budget 1500ms -> 720ms headroom
    'llm_call':  4200,   # vs budget 5500ms -> 1300ms headroom
    'formatting': 120,   # vs budget 500ms  -> 380ms headroom
}

TOTAL_HEADROOM = sum(
    BUDGET_STAGES[k] - ACTUAL_P95[k] for k in ACTUAL_P95
)
print(f'Total headroom: {TOTAL_HEADROOM}ms')
# Reallocate headroom to allow longer LLM responses

Kısa Kontrol

Zaman aşımı bütçeleri ve zarif gerileme hakkındaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: zaman aşımı bütçeleri, her zaman kabul edilebilir bir süre içinde yanıt verebilmeniz için zamanı işlem hattı aşamalarına dağıtır; gerileme merdivenleri, süre tükendiğinde hata vermek yerine giderek daha düşük kaliteli yanıtlar sunar; gerileme olaylarını günlüğe kaydetmek ise sürekli darboğazları belirleyip düzeltmenize yardımcı olur. Sırada otomatik kalite değerlendirmesi için LLM-as-judge desenini inceleyeceğiz.

Sıkça Sorulan Sorular

“Zaman Aşımı Bütçeleri ve Zarif Bozulma” dersi ücretsiz mi?

Evet — “Zaman Aşımı Bütçeleri ve Zarif Bozulma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Zaman Aşımı Bütçeleri ve Zarif Bozulma” dersinde ne öğreneceğim?

İş akışınızın her katmanında sıkı zaman aşımı bütçeleri belirleyin ve LLM bütçesini aştığında önbelleğe alınmış veya basitleştirilmiş yanıtlar sunan zarif bozulmayı uygulayın. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Zaman Aşımı Bütçeleri ve Zarif Bozulma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. LLM Gecikmesini Ölçme: TTFT ve TPOT
  2. Yük Dengeleme ve Birden Çok Anahtar Stratejileri
  3. Geri Dönüş Sağlayıcıları ve Devre Kesiciler
  4. Zaman Aşımı Bütçeleri ve Zarif Bozulma
← AI Engineering Academy Sayfasına Dön