0Pricing
AI Prompt Engineering · Ders

Ü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.00

Otomatik 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

  1. İstem Kayıt Defteri Mimarisi
  2. İstemler İçin Sürüm Denetimi
  3. Dağıtım ve Geri Alma Stratejileri
  4. Üretimde İstem Performansını İzleme
← AI Prompt Engineering Sayfasına Dön