AI Prompt Engineering · Ders

Modeller Arasında Yük Dengeleme

Ucuz istemleri küçük modellere, zor istemleri büyük modellere yönlendirme.

3. ders / 413 adım

Modeller Arasında Yük Dengeleme, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 3. 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 Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

Neden Modeller Arasında Yönlendirme Yapılır?

Her görev en güçlü (ve pahalı) modeli gerektirmez. Basit bir selamlama yanıtı için GPT-4o gerekmez. Model yönlendirme, her isteği onu iyi bir şekilde işleyebilen en ucuz modele göndererek kaliteyi gerekli yerlerde korurken maliyeti %50-90 oranında azaltır.

Karmaşıklığa Dayalı Yönlendirme

API'yi çağırmadan önce görevin karmaşıklığını sınıflandırın. Basit görevleri ucuz modellere, karmaşık görevleri ise yetenekli modellere gönderin. Hafif bir sınıflandırıcı veya buluşsal yöntemler bu kararı hızlıca verebilir.

COMPLEXITY_CLASSIFIER_PROMPT = '''Classify the complexity of this user request.
Return ONLY one word: SIMPLE, MODERATE, or COMPLEX.

SIMPLE: greeting, factual lookup, single-step question, direct answer needed
MODERATE: multi-step explanation, comparison, short analysis, code snippet
COMPLEX: deep analysis, long code generation, reasoning chain, specialized domain

Request: {request}'''

import openai

client_mini = openai.OpenAI(api_key='YOUR_API_KEY')

def classify_complexity(request):
    response = client_mini.chat.completions.create(
        model='gpt-4o-mini',  # always use cheap model for classifier
        messages=[{'role': 'user', 'content':
            COMPLEXITY_CLASSIFIER_PROMPT.format(request=request)}],
        max_tokens=5,
        temperature=0
    )
    label = response.choices[0].message.content.strip().upper()
    if label not in ('SIMPLE', 'MODERATE', 'COMPLEX'):
        label = 'MODERATE'  # safe default
    return label

for req in ['Hi', 'Explain quicksort', 'Design a distributed systems architecture']:
    print(f'{req[:40]}: {classify_complexity(req)}')

Model Yönlendirici Sınıfı

Bir model yönlendiricisi, karmaşıklık etiketlerini modellerle eşleştirir ve her isteği buna göre yönlendirir. Yönlendirme kararı belirlenimlidir ve yapılandırılabilir eşiklere dayanır.

MODEL_ROUTES = {
    'SIMPLE': {
        'model': 'gpt-4o-mini',
        'max_tokens': 300,
        'cost_per_1k_input': 0.00015,
        'use_case': 'greetings, FAQ, simple factual questions'
    },
    'MODERATE': {
        'model': 'gpt-4o',
        'max_tokens': 1500,
        'cost_per_1k_input': 0.0025,
        'use_case': 'explanations, analysis, code snippets'
    },
    'COMPLEX': {
        'model': 'claude-opus-4-5',
        'max_tokens': 4096,
        'cost_per_1k_input': 0.015,
        'use_case': 'deep reasoning, long code, specialized domains'
    }
}

class ModelRouter:
    def __init__(self):
        self.routes = MODEL_ROUTES
        self.call_counts = {k: 0 for k in MODEL_ROUTES}

    def route(self, request, messages):
        complexity = classify_complexity(request)
        route = self.routes[complexity]
        self.call_counts[complexity] += 1
        print(f'Routing "{request[:40]}" -> {route["model"]} ({complexity})')
        return route['model'], route['max_tokens']

    def cost_report(self):
        total = sum(self.call_counts.values())
        for complexity, count in self.call_counts.items():
            pct = count / total * 100 if total else 0
            print(f'{complexity}: {count} calls ({pct:.0f}%)')

Maliyeti Dikkate Alan Yönlendirme

Karmaşıklığın yanı sıra maliyeti dikkate alan yönlendirme, tüm sistem genelinde maliyetin öngörülebilir olmasını sağlamak için belirteç bütçesini, kullanıcı katmanını (ücretsiz veya ücretli) ve günlük harcama sınırlarını hesaba katar.

class CostAwareRouter(ModelRouter):
    def __init__(self, daily_budget_usd=100.0):
        super().__init__()
        self.daily_budget = daily_budget_usd
        self.daily_spent = 0.0

    def estimate_cost(self, model, input_tokens, max_output_tokens):
        route = next((r for r in self.routes.values() if r['model'] == model), None)
        if not route:
            return 0.0
        return (
            (input_tokens / 1000) * route['cost_per_1k_input'] +
            (max_output_tokens / 1000) * route['cost_per_1k_input'] * 3
        )

    def route_with_budget(self, request, messages, user_tier='free'):
        complexity = classify_complexity(request)

        # Downgrade if budget is exhausted or user is on free tier
        budget_remaining = self.daily_budget - self.daily_spent
        if budget_remaining < 0.01 or user_tier == 'free':
            complexity = 'SIMPLE'  # downgrade to cheapest model
            print('Budget constraint: routing to SIMPLE model')

        route = self.routes[complexity]
        input_tokens = sum(len(m['content'].split()) for m in messages) * 1.3
        cost = self.estimate_cost(route['model'], input_tokens, route['max_tokens'])
        self.daily_spent += cost
        return route['model'], route['max_tokens']

Gecikmeyi Dikkate Alan Yönlendirme

Farklı modellerin gecikme profilleri farklıdır. Zaman baskısı altında (örneğin 3 saniyelik SLA'ya sahip bir sohbet robotunda), daha az yetenekli olsalar bile daha hızlı modellere yönlendirme yapın.

import time

# Model latency profiles (approximate P95 values)
MODEL_LATENCY_P95 = {
    'gpt-4o-mini': 1.5,       # seconds
    'gpt-4o': 4.0,
    'claude-haiku-4-5': 1.2,
    'claude-sonnet-4-5': 3.0,
    'claude-opus-4-5': 6.0
}

SLA_LATENCY_BUDGET = 3.0  # seconds

def route_with_latency_constraint(complexity, sla_seconds=SLA_LATENCY_BUDGET):
    route = MODEL_ROUTES[complexity]
    p95_latency = MODEL_LATENCY_P95.get(route['model'], 5.0)

    if p95_latency > sla_seconds:
        # Find fastest model under SLA
        affordable_models = [
            (lat, m) for m, lat in MODEL_LATENCY_P95.items()
            if lat <= sla_seconds
        ]
        if affordable_models:
            fastest = min(affordable_models)[1]
            print(f'Latency constraint: downgrading from {route["model"]} to {fastest}')
            return fastest
    return route['model']

print('COMPLEX request under 3s SLA:', route_with_latency_constraint('COMPLEX'))

Yetenekleri Dikkate Alan Yönlendirme

Bazı görevler belirli model yetenekleri gerektirir: görüntü işleme, işlev çağırma, uzun bağlam veya kod yorumlayıcı. Yetenekleri dikkate alan yönlendirme, seçilen modelin görevi gerçekten işleyebilmesini sağlar.

MODEL_CAPABILITIES = {
    'gpt-4o-mini': {
        'vision': True,
        'function_calling': True,
        'context_window': 128000,
        'code_interpreter': False
    },
    'gpt-4o': {
        'vision': True,
        'function_calling': True,
        'context_window': 128000,
        'code_interpreter': True
    },
    'claude-opus-4-5': {
        'vision': True,
        'function_calling': True,
        'context_window': 200000,
        'code_interpreter': False
    }
}

def capability_aware_route(required_capabilities, context_length=0):
    candidates = []
    for model, caps in MODEL_CAPABILITIES.items():
        if context_length > caps['context_window']:
            continue
        if all(caps.get(cap, False) for cap in required_capabilities):
            candidates.append(model)

    if not candidates:
        raise ValueError(f'No model supports: {required_capabilities}')

    # Among capable models, pick cheapest
    cost_rank = ['gpt-4o-mini', 'claude-opus-4-5', 'gpt-4o']
    for model in cost_rank:
        if model in candidates:
            return model
    return candidates[0]

print(capability_aware_route(['vision', 'function_calling'], context_length=5000))

Yedekleme Zincirleri

Bir yedekleme zinciri, birincil model başarısız olduğunda denenecek modellerin sırasını tanımlar. Bu, tek tek sağlayıcılarda kesintiler veya hız sınırı sorunları yaşandığında bile yüksek kullanılabilirlik sağlar.

FALLBACK_CHAINS = {
    'primary': 'claude-opus-4-5',
    'fallback': 'gpt-4o',
    'emergency': 'gpt-4o-mini'
}

def call_with_fallback(messages, chain=FALLBACK_CHAINS):
    providers = [
        ('anthropic', chain['primary']),
        ('openai', chain['fallback']),
        ('openai', chain['emergency'])
    ]

    for provider, model in providers:
        try:
            print(f'Trying {model}...')
            if provider == 'anthropic':
                import anthropic
                ac = anthropic.Anthropic(api_key='YOUR_KEY')
                resp = ac.messages.create(
                    model=model, max_tokens=500, messages=messages
                )
                return resp.content[0].text
            else:
                import openai
                oc = openai.OpenAI(api_key='YOUR_KEY')
                resp = oc.chat.completions.create(
                    model=model, messages=messages, max_tokens=500
                )
                return resp.choices[0].message.content
        except Exception as e:
            print(f'{model} failed: {e}. Trying next...')

    raise RuntimeError('All models in fallback chain failed')

Yönlendirme Kararlarının Günlüğe Kaydedilmesi

Her yönlendirme kararını denetlemeye, eşikleri ayarlamaya ve maliyet dağılımını anlamaya yetecek bağlamla günlüğe kaydedin. Bu veriler, yönlendirme mantığını zaman içinde en iyi duruma getirmek için gereklidir.

import json
from datetime import datetime

ROUTING_LOG_FILE = 'routing_decisions.jsonl'

def log_routing_decision(request_id, request_text, complexity,
                          model_selected, cost_estimate, latency_ms,
                          user_tier='free'):
    entry = {
        'timestamp': datetime.utcnow().isoformat(),
        'request_id': request_id,
        'request_preview': request_text[:50],
        'complexity': complexity,
        'model': model_selected,
        'cost_estimate_usd': round(cost_estimate, 6),
        'latency_ms': round(latency_ms),
        'user_tier': user_tier
    }
    with open(ROUTING_LOG_FILE, 'a') as f:
        f.write(json.dumps(entry) + '\n')

# Analyze routing log to tune thresholds
def analyze_routing_log():
    from collections import Counter
    model_counts = Counter()
    total_cost = 0.0
    with open(ROUTING_LOG_FILE) as f:
        for line in f:
            e = json.loads(line)
            model_counts[e['model']] += 1
            total_cost += e['cost_estimate_usd']
    print('Model distribution:', dict(model_counts))
    print(f'Total estimated cost: ${total_cost:.4f}')

Üretimde Modelleri A/B Sınamasına Tabi Tutma

Model yönlendirme, yeni bir modelle kaliteyi tam kullanıma sunmadan önce karşılaştırmak için trafiğin belirli bir yüzdesini bu modele göndererek A/B sınamaları da uygulayabilir. Veriye dayalı model seçimi kararları almak için bunu izlemeyle birleştirin.

import random

class ABModelRouter:
    def __init__(self, control_model, treatment_model, treatment_pct=10):
        self.control = control_model
        self.treatment = treatment_model
        self.treatment_pct = treatment_pct
        self.assignment_log = {}  # request_id: 'control' | 'treatment'

    def route(self, request_id):
        if request_id in self.assignment_log:
            # Sticky assignment: same user always gets same model
            return self.assignment_log[request_id]

        if random.random() * 100 < self.treatment_pct:
            assignment = 'treatment'
            model = self.treatment
        else:
            assignment = 'control'
            model = self.control

        self.assignment_log[request_id] = assignment
        return model, assignment

# Usage
ab_router = ABModelRouter(
    control_model='gpt-4o',
    treatment_model='claude-opus-4-5',
    treatment_pct=10  # 10% get new model
)

for user_id in range(5):
    result = ab_router.route(f'user_{user_id}')
    print(f'user_{user_id}: {result}')

Model Sağlık Denetimleri

Trafiği bir modele yönlendirmeden önce modelin doğru yanıt verdiğini doğrulayın. Bir sağlık denetimi, sağlayıcının kullanılabilir olduğunu doğrulamak için bilinen bir istemle modele istek gönderir ve yanıtı doğrular.

import time

def health_check(model, provider='openai', timeout=5):
    '''
    Returns True if model is healthy, False if timed out or errored.
    '''
    test_prompt = 'Reply with exactly: OK'
    try:
        start = time.time()
        if provider == 'openai':
            import openai
            client = openai.OpenAI(api_key='YOUR_API_KEY')
            resp = client.chat.completions.create(
                model=model,
                messages=[{'role': 'user', 'content': test_prompt}],
                max_tokens=5,
                timeout=timeout
            )
            text = resp.choices[0].message.content.strip()
        elif provider == 'anthropic':
            import anthropic
            client = anthropic.Anthropic(api_key='YOUR_API_KEY')
            resp = client.messages.create(
                model=model, max_tokens=5,
                messages=[{'role': 'user', 'content': test_prompt}],
            )
            text = resp.content[0].text.strip()
        latency = (time.time() - start) * 1000
        healthy = 'ok' in text.lower()
        print(f'{model}: {"HEALTHY" if healthy else "DEGRADED"} ({latency:.0f}ms)')
        return healthy
    except Exception as e:
        print(f'{model}: UNHEALTHY ({e})')
        return False

# Run health checks before routing critical traffic
# health_check('gpt-4o-mini', provider='openai')
# health_check('claude-haiku-4-5', provider='anthropic')

Maliyet Etkisi Analizi

Model yönlendirmesinden elde edilen maliyet tasarrufunu ölçün. Trafiğin %60'ı SIMPLE, %30'u MODERATE ve %10'u COMPLEX olduğunda akıllı yönlendirme, her şey için en iyi modeli kullanmaya kıyasla maliyetleri %70-80 oranında azaltabilir.

def cost_impact_analysis(daily_requests=10000):
    # Traffic distribution
    traffic = {'SIMPLE': 0.60, 'MODERATE': 0.30, 'COMPLEX': 0.10}

    # Avg tokens per request (input + output)
    avg_tokens = {'SIMPLE': 500, 'MODERATE': 2000, 'COMPLEX': 5000}

    # Pricing per 1K tokens (blended input+output)
    pricing = {'SIMPLE': 0.00030, 'MODERATE': 0.01000, 'COMPLEX': 0.04500}
    premium_price = 0.04500  # if we used COMPLEX model for everything

    routed_cost = 0.0
    premium_cost = 0.0

    for complexity, pct in traffic.items():
        requests = daily_requests * pct
        tokens = avg_tokens[complexity]
        routed_cost += requests * (tokens / 1000) * pricing[complexity]
        premium_cost += requests * (tokens / 1000) * premium_price

    savings_pct = (1 - routed_cost / premium_cost) * 100
    print(f'Daily requests: {daily_requests:,}')
    print(f'With routing:  ${routed_cost:,.2f}/day')
    print(f'Without routing: ${premium_cost:,.2f}/day')
    print(f'Savings: {savings_pct:.0f}% (${premium_cost - routed_cost:,.2f}/day)')

cost_impact_analysis()

Kısa Kontrol

Bir kullanıcı şöyle soruyor: 'Merhaba, nasılsınız?' Model yönlendiriciniz bunu SIMPLE olarak sınıflandırıyor. Bunu gpt-4o yerine gpt-4o-mini modeline yönlendirmek neden doğru karardır?

Model Yönlendirme Özeti

Modeller arasında yük dengeleme, maliyeti azaltır ve yeteneklerin göreve uygun olmasını sağlar:

  • Karmaşıklığa dayalı yönlendirme: görevi SIMPLE/MODERATE/COMPLEX olarak sınıflandırır ve eşleşen model seviyesine yönlendirir
  • Maliyeti dikkate alan yönlendirme: bütçe tükendiğinde veya kullanıcı ücretsiz katmandayken daha alt bir modele geçer
  • Gecikmeyi dikkate alan yönlendirme: SLA sıkı olduğunda daha hızlı modeli kullanır
  • Yetenek yönlendirmesi: seçilen modelin gerekli özellikleri desteklediğinden emin olur (görüntü işleme, işlev çağrıları)
  • Yedekleme zincirleri: yüksek kullanılabilirlik için birincil → yedek → acil durum modeli
  • A/B sınaması: yeni modelleri tam kullanıma sunmadan önce trafiğin bir bölümünde sınar
  • Maliyet etkisi: yönlendirme, her zaman en iyi modeli kullanmaya kıyasla maliyetleri %70-80 oranında azaltabilir
Başlamak ücretsiz

Yapay zeka eğitmeniyle AI Prompt Engineering öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
53
Dersler
199

Sıkça Sorulan Sorular

“Modeller Arasında Yük Dengeleme” dersi ücretsiz mi?

Evet — “Modeller Arasında Yük Dengeleme” 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 Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

“Modeller Arasında Yük Dengeleme” dersinde ne öğreneceğim?

Ucuz istemleri küçük modellere, zor istemleri büyük modellere yönlendirme. AI Prompt Engineering 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 Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, 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 3. dersidir.

“Modeller Arasında Yük Dengeleme” 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 Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Prompt Engineering 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. İstemler İçin Önbellekleme Stratejileri
  2. Toplu İşleme ve Eşzamansız Yürütme
  3. Modeller Arasında Yük Dengeleme
  4. İstem İş Akışlarını İzleme ve Uyarı Verme
← AI Prompt Engineering Sayfasına Dön