Overvåke promptytelse i produksjon
Sporing av forsinkelse, kostnad, kvalitetspoeng og feilrate per promptversjon.
Overvåke promptytelse i produksjon er en gratis leksjon i AI-prompt engineering på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-prompt engineering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.
Hvorfor overvåke promptytelse?
En prompt som er rullet ut til produksjon, er ikke «ferdig». Modellens atferd endrer seg med oppdateringer, brukerinndata endres over tid, og kostnadene kan plutselig øke. Kontinuerlig overvåking oppdager regresjoner før de skader brukerne, og holder kostnadene forutsigbare.
Nøkkelmålinger per promptversjon
Følg med på disse fem målingene for hver promptversjon i produksjon:
- Gjennomsnittlig latenstid: tiden fra forespørselen sendes til hele svaret er mottatt (P50, P95, P99)
- Kostnad per kall: inndatatokener × pris + utdata-tokener × pris
- Kvalitetspoeng: automatisert evaluering (LLM-vurdering eller oppgavemåling)
- Feilrate: API-feil + feil ved parsing av ugyldige svar
- Brukertilfredshet: tommelvurdering, andel nye forsøk og avbrutte økter
Instrumentering: Registrering av målinger
Omslutt hvert LLM-kall med instrumentering som registrerer alle nøkkelmålinger i et tidsserielager eller en database for senere analyse og varsling.
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 responseBeregning av kostnad per kall
Kostnad per kall = inndatatokener × inndatapris + utdata-tokener × utdatapris. Ved å lagre de rå token-antallene kan kostnaden beregnes på nytt når prisene endres.
# 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.00Automatisk kvalitetsvurdering
Bruk en LLM-vurderer til å poengsette kvaliteten på svar automatisk i produksjonsskala. Ta et utvalg på 5–10 % av kallene til kvalitetsvurdering, slik at kostnadene holdes på et håndterbart nivå.
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 NoneLagring av målinger i en tidsseriedatabase
Tidsseriedatabaser (InfluxDB, TimescaleDB eller til og med en enkel PostgreSQL-tabell med en tidsstempelindeks) lagrer målinger per kall effektivt og støtter aggregeringsspørringer for dashbord.
-- 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;Bygging av et målingsdashbord
Dashbord viser de fem nøkkelmålingene i sanntid. Bruk Grafana (med TimescaleDB som datakilde) eller et tilpasset webdashbord. Viktige paneler:
- Latenstid for P50/P95/P99 over tid, per versjon
- Utvikling i kostnad per kall (daglig/ukentlig)
- Feilrate i prosent
- Rullerende gjennomsnitt for kvalitetspoeng
- Brukertilfredshetspoeng
# 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()Avviksdeteksjon for promptregresjoner
Manuell gjennomgang av dashbord overser langsomme regresjoner. Automatisk avviksdeteksjon sammenligner et rullerende tidsvindu med en historisk referanse og utløser et varsel når avviket overskrider en terskelverdi.
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')Varslingsregler og terskelverdier
Definer varslingsregler som kode, slik at de kan versjonskontrolleres og gjennomgås. Vanlige varsler for promptovervåking:
- Feilrate > 5 % i 5 sammenhengende minutter
- P95-latenstid > 10 s i 3 minutter
- Kostnad per dag > 2× ukentlig gjennomsnitt (kostnadstopp)
- Kvalitetspoeng faller > 20 % fra referansen
# 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}'Signaler på brukertilfredshet
Automatiserte målinger fanger ikke opp alt. Samle inn eksplisitte og implisitte brukersignaler som supplement til kvalitetspoengene:
- Tommelvurdering: eksplisitt 👍/👎 på AI-svar
- Andel nye forsøk: brukeren sender inn samme spørsmål på nytt umiddelbart (implisitt misnøye)
- Kopierings-/bruksrate: brukeren kopierer AI-utdata (implisitt tilfredshet)
- Korrigeringsrate: brukeren redigerer AI-utdata før det tas i bruk
# 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}Rapporter for sammenligning av versjoner
Når det vurderes om en canary-versjon skal fremmes eller rulles tilbake, skal det genereres en side-ved-side-sammenligning av alle målinger mellom den nye versjonen og referansen. Denne rapporten danner grunnlaget for beslutningen om å fremme versjonen.
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%)Hurtigsjekk
Det skal oppdages kvalitetsregresjoner automatisk uten manuell kontroll av dashbord. Hvilken tilnærming oppnår dette best?
Sammendrag av overvåking
Overvåking av prompter i produksjon krever at fem dimensjoner følges opp for hver versjon:
- Latenstid (P50/P95/P99) — brukeropplevelse
- Kostnad per kall — økonomisk kontroll
- Kvalitetspoeng — automatisert utvalgsbasert LLM-vurdering
- Feilrate — pålitelighet
- Brukertilfredshet — tommelvurdering samt signaler fra nye forsøk og kopiering
Lagre målingene i en tidsseriedatabase, visualiser dem i dashbord, og send varsler når terskelverdier overskrides. Rapporter for sammenligning av versjoner danner grunnlaget for beslutninger om å fremme eller rulle tilbake versjoner.
Lær deg AI-prompt engineering med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 53
- Leksjoner
- 199
Ofte stilte spørsmål
Er leksjonen «Overvåke promptytelse i produksjon» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien AI-prompt engineering, inkludert «Overvåke promptytelse i produksjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Overvåke promptytelse i produksjon»?
Sporing av forsinkelse, kostnad, kvalitetspoeng og feilrate per promptversjon. Du øver på AI-prompt engineering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI-prompt engineering?
Ingen tidligere erfaring er nødvendig. AI-prompt engineering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Overvåke promptytelse i produksjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI-prompt engineering-leksjonen?
Ja. Alle AI-prompt engineering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Arkitektur for et promptregister
- Versjonskontroll for prompter
- Strategier for utrulling og tilbakerulling
- Overvåke promptytelse i produksjon