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 responseMenghitung 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.00Penilaian 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 NoneMenyimpan 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
- Arsitektur Registri Prompt
- Kontrol Versi untuk Prompt
- Strategi Penerapan dan Pemulihan Versi
- Memantau Kinerja Prompt dalam Produksi