Modeller Arasında Yük Dengeleme
Ucuz istemleri küçük modellere, zor istemleri büyük modellere yönlendirme.
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
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
- İstemler İçin Önbellekleme Stratejileri
- Toplu İşleme ve Eşzamansız Yürütme
- Modeller Arasında Yük Dengeleme
- İstem İş Akışlarını İzleme ve Uyarı Verme