0Pricing
AI Prompt Engineering · Pelajaran

Memantau Kinerja Prompt dalam Produksi

Lacak latensi, biaya, skor kualitas, dan tingkat kegagalan untuk setiap versi prompt.

Memantau Kinerja Prompt dalam Produksi adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Mengapa Kinerja Perintah Perlu Dipantau?

Perintah yang diterapkan di lingkungan produksi belum berarti pekerjaan selesai. Perilaku model berubah seiring pembaruan, masukan pengguna berubah dari waktu ke waktu, dan biaya dapat melonjak secara tidak terduga. Pemantauan berkelanjutan mendeteksi penurunan kinerja sebelum berdampak pada pengguna dan menjaga pengeluaran tetap dapat diprediksi.

Metrik Utama per Versi Perintah

Lacak lima metrik berikut untuk setiap versi perintah di lingkungan produksi:

  • Latensi rata-rata: waktu sejak permintaan hingga respons lengkap (P50, P95, P99)
  • Biaya per panggilan: token masukan × harga masukan + token keluaran × harga keluaran
  • Skor kualitas: evaluasi otomatis (LLM sebagai penilai atau metrik tugas)
  • Tingkat kesalahan: kesalahan API + kegagalan penguraian keluaran yang formatnya tidak valid
  • Kepuasan pengguna: peringkat jempol, tingkat pengiriman ulang, dan pengguna meninggalkan sesi

Instrumentasi: Mencatat Metrik

Bungkus setiap panggilan LLM dengan instrumentasi yang mencatat semua metrik utama ke penyimpanan deret waktu atau basis data untuk analisis dan pemberian peringatan di kemudian hari.

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

Menghitung Biaya per Panggilan

Biaya per panggilan = token masukan × harga masukan + token keluaran × harga keluaran. Menyimpan jumlah token mentah memungkinkan Anda menghitung ulang biaya kapan pun harga berubah.

# 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

Penilaian Kualitas Otomatis

Gunakan LLM sebagai penilai untuk menilai kualitas keluaran secara otomatis pada skala produksi. Ambil sampel 5–10% panggilan untuk penilaian kualitas agar biaya tetap terkendali.

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

Menyimpan Metrik dalam Basis Data Deret Waktu

Basis data deret waktu (InfluxDB, TimescaleDB, atau bahkan tabel PostgreSQL sederhana dengan indeks penanda waktu) menyimpan metrik per panggilan secara efisien dan mendukung kueri agregasi untuk dasbor.

-- 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;

Membangun Dasbor Metrik

Dasbor menampilkan lima metrik utama secara waktu nyata. Gunakan Grafana (dengan sumber data TimescaleDB) atau dasbor web khusus. Panel utama:

  • Latensi P50/P95/P99 dari waktu ke waktu, berdasarkan versi
  • Tren biaya per panggilan (harian/mingguan)
  • Persentase tingkat kesalahan
  • Rata-rata bergerak skor kualitas
  • Skor kepuasan pengguna
# 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()

Deteksi Anomali untuk Penurunan Kinerja Perintah

Peninjauan dasbor secara manual dapat melewatkan penurunan kinerja yang berlangsung lambat. Deteksi anomali otomatis membandingkan jendela berjalan dengan tolok ukur historis dan mengirimkan peringatan ketika penyimpangan melampaui ambang batas.

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')

Aturan dan Ambang Batas Peringatan

Tentukan aturan peringatan sebagai kode agar aturan tersebut dapat dikendalikan versinya dan ditinjau. Peringatan pemantauan perintah yang umum:

  • Tingkat kesalahan > 5% selama 5 menit berturut-turut
  • Latensi P95 > 10 dtk selama 3 menit
  • Biaya per hari > 2× rata-rata mingguan (lonjakan biaya)
  • Skor kualitas turun > 20% dari tolok ukur
# 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}'

Sinyal Kepuasan Pengguna

Metrik otomatis tidak menangkap semuanya. Kumpulkan sinyal pengguna yang eksplisit dan implisit untuk melengkapi skor kualitas:

  • Peringkat jempol: 👍/👎 eksplisit pada respons AI
  • Tingkat pengiriman ulang: pengguna segera mengirim ulang kueri yang sama (ketidakpuasan implisit)
  • Tingkat penyalinan/penggunaan: pengguna menyalin keluaran AI (kepuasan implisit)
  • Tingkat koreksi: pengguna menyunting keluaran AI sebelum menggunakannya
# 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}

Laporan Perbandingan Versi

Saat mengevaluasi apakah canary akan dipromosikan atau dikembalikan ke versi sebelumnya, buat perbandingan berdampingan untuk semua metrik antara versi baru dan tolok ukur. Laporan ini menjadi dasar keputusan promosi.

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%)

Pemeriksaan Singkat

Anda ingin mendeteksi penurunan kualitas secara otomatis tanpa memeriksa dasbor secara manual. Pendekatan mana yang paling tepat untuk mencapai hal ini?

Ringkasan Pemantauan

Pemantauan perintah di lingkungan produksi memerlukan pelacakan lima dimensi untuk setiap versi:

  • Latensi (P50/P95/P99) — pengalaman pengguna
  • Biaya per panggilan — kesehatan keuangan
  • Skor kualitas — pengambilan sampel penilaian LLM otomatis
  • Tingkat kesalahan — keandalan
  • Kepuasan pengguna — peringkat jempol, pengiriman ulang, dan sinyal penyalinan

Simpan metrik dalam basis data deret waktu, visualisasikan dalam dasbor, dan kirimkan peringatan ketika ambang batas terlampaui. Laporan perbandingan versi membantu pengambilan keputusan promosi dan pengembalian versi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memantau Kinerja Prompt dalam Produksi” gratis?

Ya — teks lengkap “Memantau Kinerja Prompt dalam Produksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memantau Kinerja Prompt dalam Produksi”?

Lacak latensi, biaya, skor kualitas, dan tingkat kegagalan untuk setiap versi prompt. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?

Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Memantau Kinerja Prompt dalam Produksi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?

Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Arsitektur Registri Prompt
  2. Kontrol Versi untuk Prompt
  3. Strategi Penerapan dan Pemulihan Versi
  4. Memantau Kinerja Prompt dalam Produksi
← Kembali ke AI Prompt Engineering