Üretimde İstem Performansını İzleme
Her istem sürümü için gecikmeyi, maliyeti, kalite puanlarını ve başarısızlık oranlarını izleme.
Üretimde İstem Performansını İzleme, CoddyKit'te ücretsiz bir AI Prompt Engineering 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 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.
İstem Performansı Neden İzlenmeli?
Üretim ortamına dağıtılan bir istem “tamamlanmış” değildir. Güncellemelerle model davranışı değişir, kullanıcı girdileri zaman içinde farklılaşır ve maliyet beklenmedik şekilde artabilir. Sürekli izleme, gerilemeleri kullanıcılara zarar vermeden önce tespit eder ve harcamaların öngörülebilir kalmasını sağlar.
İstem Sürümü Başına Temel Ölçümler
Üretim ortamında her istem sürümü için şu beş ölçümü izleyin:
- Ortalama gecikme: istekten tam yanıtın alınmasına kadar geçen süre (P50, P95, P99)
- Çağrı başına maliyet: girdi belirteçleri × fiyat + çıktı belirteçleri × fiyat
- Kalite puanı: otomatik değerlendirme (LLM-as-judge veya görev ölçümü)
- Hata oranı: API hataları + hatalı çıktı ayrıştırma başarısızlıkları
- Kullanıcı memnuniyeti: beğeni puanı, yeniden deneme oranı, oturumdan ayrılma
Ölçümleme: Ölçümleri Kaydetme
Daha sonra analiz etmek ve uyarı oluşturmak üzere tüm temel ölçümleri bir zaman serisi deposuna veya veritabanına kaydeden ölçümlemeyi her LLM çağrısının etrafına ekleyin.
import time
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def instrumented_call(prompt_id, version, messages, model):
start = time.time()
error = False
response = None
try:
response = client.chat.completions.create(
model=model,
messages=messages
)
except Exception as e:
error = True
raise
finally:
latency_ms = (time.time() - start) * 1000
usage = response.usage if response else None
record_metric({
'prompt_id': prompt_id,
'version': version,
'latency_ms': latency_ms,
'input_tokens': usage.prompt_tokens if usage else 0,
'output_tokens': usage.completion_tokens if usage else 0,
'error': error,
'timestamp': time.time()
})
return responseÇağrı Başına Maliyeti Hesaplama
Çağrı başına maliyet = girdi belirteçleri × girdi fiyatı + çıktı belirteçleri × çıktı fiyatı. Ham belirteç sayılarını saklamak, fiyatlandırma değiştiğinde maliyeti yeniden hesaplamanıza olanak tanır.
# pricing.py — model pricing table (per 1M tokens)
PRICING = {
'gpt-4o': {'input': 2.50, 'output': 10.00},
'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
'claude-3-5-sonnet-20241022': {'input': 3.00, 'output': 15.00},
}
def cost_usd(model, input_tokens, output_tokens):
p = PRICING.get(model)
if not p:
return None
cost = (input_tokens / 1_000_000) * p['input'] \
+ (output_tokens / 1_000_000) * p['output']
return round(cost, 6)
# Example
c = cost_usd('gpt-4o-mini', input_tokens=800, output_tokens=200)
print(f'Cost per call: ${c}') # Cost per call: $0.000240
# Daily cost estimate
calls_per_day = 50_000
print(f'Daily cost: ${round(c * calls_per_day, 2)}') # $12.00Otomatik Kalite Puanlama
Üretim ölçeğinde çıktı kalitesini otomatik olarak puanlamak için bir LLM değerlendiricisi kullanın. Maliyetleri yönetilebilir tutmak için çağrıların %5-10'unu kalite puanlamasına ayırın.
import random
JUDGE_SAMPLE_RATE = 0.05 # score 5% of calls
JUDGE_PROMPT = '''Rate the quality of this AI response on a scale of 1-5.
1=Very poor, 3=Acceptable, 5=Excellent.
Return only the integer score.
User input: {input}
AI response: {output}'''
def maybe_score_quality(user_input, ai_output, model='gpt-4o-mini'):
if random.random() > JUDGE_SAMPLE_RATE:
return None # not sampled
judge_messages = [{'role': 'user', 'content':
JUDGE_PROMPT.format(input=user_input, output=ai_output)}]
response = client.chat.completions.create(
model=model, messages=judge_messages, max_tokens=5
)
try:
score = int(response.choices[0].message.content.strip())
return max(1, min(5, score)) # clamp to 1-5
except ValueError:
return NoneÖlçümleri Zaman Serisi Veritabanında Saklama
Zaman serisi veritabanları (InfluxDB, TimescaleDB veya zaman damgası dizinine sahip basit bir PostgreSQL tablosu bile) çağrı başına ölçümleri verimli şekilde saklar ve gösterge panelleri için toplulaştırma sorgularını destekler.
-- TimescaleDB / PostgreSQL schema for prompt metrics
CREATE TABLE prompt_metrics (
ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
prompt_id VARCHAR(100),
version VARCHAR(20),
model VARCHAR(50),
latency_ms FLOAT,
input_tokens INT,
output_tokens INT,
cost_usd FLOAT,
quality_score FLOAT, -- NULL if not sampled
error BOOLEAN DEFAULT FALSE
);
-- Convert to hypertable (TimescaleDB)
SELECT create_hypertable('prompt_metrics', 'ts');
-- Query: hourly P95 latency by version
SELECT
date_trunc('hour', ts) AS hour,
version,
PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency_ms) AS p95_latency
FROM prompt_metrics
WHERE prompt_id = 'summarize-article'
AND ts > NOW() - INTERVAL '24 hours'
GROUP BY 1, 2
ORDER BY 1;Ölçüm Gösterge Paneli Oluşturma
Gösterge panelleri beş temel ölçümü gerçek zamanlı olarak görünür hâle getirir. Grafana'yı (TimescaleDB veri kaynağıyla) veya özel bir web gösterge panelini kullanın. Temel paneller:
- Sürüme göre zaman içindeki P50/P95/P99 gecikmesi
- Çağrı başına maliyet eğilimi (günlük/haftalık)
- Hata oranı yüzdesi
- Hareketli ortalama kalite puanı
- Kullanıcı memnuniyeti puanı
# Simple dashboard query aggregation in Python
def get_dashboard_stats(conn, prompt_id, hours=24):
with conn.cursor() as cur:
cur.execute('''
SELECT
version,
COUNT(*) AS calls,
AVG(latency_ms) AS avg_latency,
PERCENTILE_CONT(0.95)
WITHIN GROUP (ORDER BY latency_ms) AS p95_latency,
AVG(cost_usd) AS avg_cost,
AVG(quality_score) FILTER (WHERE quality_score IS NOT NULL) AS avg_quality,
SUM(error::int)::float / COUNT(*) AS error_rate
FROM prompt_metrics
WHERE prompt_id = %s
AND ts > NOW() - INTERVAL %s
GROUP BY version
ORDER BY MAX(ts) DESC
''', (prompt_id, f'{hours} hours'))
return cur.fetchall()İstem Gerilemeleri için Anomali Algılama
Gösterge panelini manuel olarak incelemek, yavaş ilerleyen gerilemeleri gözden kaçırır. Otomatik anomali algılama, hareketli bir pencereyi geçmişteki temel değerle karşılaştırır ve sapma bir eşiği aştığında uyarı gönderir.
import statistics
def detect_anomaly(recent_values, baseline_values, threshold_std=2.0):
if len(baseline_values) < 10:
return False # not enough data
baseline_mean = statistics.mean(baseline_values)
baseline_std = statistics.stdev(baseline_values)
recent_mean = statistics.mean(recent_values)
if baseline_std == 0:
return False
z_score = abs(recent_mean - baseline_mean) / baseline_std
return z_score > threshold_std
# Example: detect quality regression
baseline_quality = [4.1, 4.0, 4.2, 4.1, 4.0, 3.9, 4.1, 4.2, 4.0, 4.1]
recent_quality = [3.2, 3.1, 3.4, 3.0]
if detect_anomaly(recent_quality, baseline_quality):
print('ALERT: Quality score anomaly detected!')
# fire_pagerduty_alert(...)
else:
print('Quality within normal range')Uyarı Kuralları ve Eşikler
Uyarı kurallarını kod olarak tanımlayın; böylece sürüm denetimi altında tutulabilir ve incelenebilirler. Yaygın istem izleme uyarıları:
- Hata oranı > 5% ve 5 dakika boyunca art arda devam ederse
- P95 gecikmesi > 10s ve 3 dakika boyunca devam ederse
- Günlük maliyet > haftalık ortalamanın 2 katıysa (maliyet artışı)
- Kalite puanı temel değere göre > 20% düşerse
# alerts.yaml (Grafana alerting or custom)
alerts:
- name: HighErrorRate
condition: error_rate > 0.05
for: 5m
severity: critical
message: 'Prompt {prompt_id} error rate {error_rate:.1%} exceeds 5%'
- name: HighLatencyP95
condition: p95_latency_ms > 10000
for: 3m
severity: warning
message: 'P95 latency {p95_latency_ms}ms exceeds 10s for {prompt_id}'
- name: CostSpike
condition: daily_cost_usd > weekly_avg_daily_cost * 2
for: 1h
severity: warning
message: 'Daily cost ${daily_cost_usd:.2f} is 2x the weekly average'
- name: QualityRegression
condition: rolling_quality_avg < baseline_quality_avg * 0.80
for: 15m
severity: critical
message: 'Quality dropped {pct_drop:.0%} for prompt {prompt_id}'Kullanıcı Memnuniyeti Sinyalleri
Otomatik ölçümler her şeyi yakalayamaz. Kalite puanlarını tamamlamak için kullanıcıların açık ve örtük sinyallerini toplayın:
- Beğeni puanı: yapay zekâ yanıtlarına verilen açık 👍/👎
- Yeniden deneme oranı: kullanıcının aynı sorguyu hemen yeniden göndermesi (örtük memnuniyetsizlik)
- Kopyalama/kullanma oranı: kullanıcının yapay zekâ çıktısını kopyalaması (örtük memnuniyet)
- Düzeltme oranı: kullanıcının yapay zekâ çıktısını kullanmadan önce düzenlemesi
# feedback_collector.py
def record_feedback(prompt_id, version, call_id, signal_type, value):
'''
signal_type: 'thumbs' | 'retry' | 'copy' | 'edit'
value: for thumbs: 1 (up) or -1 (down); others: 1 (occurred)
'''
db.execute(
'INSERT INTO prompt_feedback '
'(prompt_id, version, call_id, signal_type, value, ts) '
'VALUES (%s, %s, %s, %s, %s, NOW())',
(prompt_id, version, call_id, signal_type, value)
)
# Aggregate satisfaction score
def satisfaction_score(prompt_id, version):
rows = db.fetch(
'SELECT signal_type, AVG(value) as avg_val FROM prompt_feedback '
'WHERE prompt_id=%s AND version=%s GROUP BY signal_type',
(prompt_id, version)
)
return {r['signal_type']: round(r['avg_val'], 3) for r in rows}Sürüm Karşılaştırma Raporları
Bir canary sürümünü kullanıma alıp almamayı veya geri almayı değerlendirirken, yeni sürüm ile temel değer arasındaki tüm ölçümlerin yan yana karşılaştırmasını oluşturun. Bu rapor, kullanıma alma kararını yönlendirir.
def version_comparison_report(prompt_id, version_a, version_b, hours=48):
stats_a = get_dashboard_stats_for_version(prompt_id, version_a, hours)
stats_b = get_dashboard_stats_for_version(prompt_id, version_b, hours)
print(f'=== Comparison: {version_a} vs {version_b} ===')
metrics = ['avg_latency', 'p95_latency', 'avg_cost', 'avg_quality', 'error_rate']
for m in metrics:
va = stats_a.get(m, 0)
vb = stats_b.get(m, 0)
delta = vb - va
pct = (delta / va * 100) if va else 0
direction = '+' if delta > 0 else ''
print(f'{m:20s}: {va:.4f} -> {vb:.4f} ({direction}{pct:.1f}%)')
# Example output:
# avg_latency : 1234.5000 -> 1189.2000 (-3.7%)
# p95_latency : 3210.0000 -> 3050.0000 (-5.0%)
# avg_cost : 0.000240 -> 0.000255 (+6.2%)
# avg_quality : 4.1000 -> 4.3000 (+4.9%)
# error_rate : 0.0120 -> 0.0080 (-33.3%)Hızlı Kontrol
Gösterge panellerini manuel olarak denetlemeden kalite gerilemelerini otomatik olarak tespit etmek istiyorsunuz. Bunu en iyi hangi yaklaşım sağlar?
İzleme Özeti
Üretim ortamında istem izleme, her sürüm için beş boyutun takip edilmesini gerektirir:
- Gecikme (P50/P95/P99) — kullanıcı deneyimi
- Çağrı başına maliyet — mali durum
- Kalite puanı — otomatik LLM değerlendiricisi örneklemesi
- Hata oranı — güvenilirlik
- Kullanıcı memnuniyeti — beğeni puanı, yeniden deneme ve kopyalama sinyalleri
Ölçümleri bir zaman serisi veritabanında saklayın, gösterge panellerinde görselleştirin ve eşikler aşıldığında uyarılar gönderin. Sürüm karşılaştırma raporları, kullanıma alma ve geri alma kararlarını bilgilendirir.
Sıkça Sorulan Sorular
“Üretimde İstem Performansını İzleme” dersi ücretsiz mi?
Evet — “Üretimde İstem Performansını İzleme” 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.
“Üretimde İstem Performansını İzleme” dersinde ne öğreneceğim?
Her istem sürümü için gecikmeyi, maliyeti, kalite puanlarını ve başarısızlık oranlarını izleme. 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 4. dersidir.
“Üretimde İstem Performansını İzleme” 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
- İstem Kayıt Defteri Mimarisi
- İstemler İçin Sürüm Denetimi
- Dağıtım ve Geri Alma Stratejileri
- Üretimde İstem Performansını İzleme