Övervaka promptprestanda i produktion
Följ latens, kostnad, kvalitetsmått och felfrekvens för varje promptversion.
Övervaka promptprestanda i produktion är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
Varför övervaka promptprestanda
En prompt som har driftsatts i produktion är inte ”klar”. Modellens beteende förändras när den uppdateras, användarnas indata förändras över tid och kostnaderna kan plötsligt öka. Kontinuerlig övervakning upptäcker försämringar innan de drabbar användarna och håller kostnaderna förutsägbara.
Viktiga mått per promptversion
Följ dessa fem mått per promptversion i produktion:
- Genomsnittlig latens: tiden från begäran tills hela svaret har kommit (P50, P95, P99)
- Kostnad per anrop: inmatningstoken × pris + utmatningstoken × pris
- Kvalitetspoäng: automatisk utvärdering (LLM som bedömare eller uppgiftsmått)
- Felfrekvens: API-fel och misslyckad parsning av felaktigt formaterade svar
- Användarnöjdhet: tummebetyg, omförsöksfrekvens och avbrutna sessioner
Instrumentering: registrera mått
Lägg instrumentering runt varje LLM-anrop så att alla viktiga mått registreras i ett tidsserielager eller en databas för senare analys och aviseringar.
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 responseBeräkna kostnaden per anrop
Kostnad per anrop = inmatningstoken × inmatningspris + utmatningstoken × utmatningspris. Genom att lagra råa tokenantal kan kostnaden beräknas på nytt när priserna ändras.
# 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 kvalitetspoängsättning
Använd en LLM som bedömare för att automatiskt poängsätta svarskvaliteten i produktionsskala. Kvalitetspoängsätt 5–10 % av anropen för att hålla kostnaderna på en hanterbar 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 NoneLagra mått i en tidsseriedatabas
Tidsseriedatabaser (InfluxDB, TimescaleDB eller till och med en enkel PostgreSQL-tabell med ett tidsstämpelindex) lagrar mått per anrop effektivt och stöder aggregeringsfrågor för instrumentpaneler.
-- 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;Bygg en måttinstrumentpanel
Instrumentpaneler visar de fem viktigaste måtten i realtid. Använd Grafana (med TimescaleDB som datakälla) eller en anpassad webbinstrumentpanel. Viktiga paneler:
- Latens för P50/P95/P99 över tid, per version
- Trend för kostnad per anrop (dagligen/veckovis)
- Felfrekvens i procent
- Rullande medelvärde för kvalitetspoängen
- Användarnöjdhetspoäng
# 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()Avvikelsedetektering för promptförsämringar
Manuell granskning av instrumentpaneler missar långsamma försämringar. Automatisk avvikelsedetektering jämför ett rullande fönster med en historisk baslinje och utlöser en avisering när avvikelsen överskrider ett tröskelvärde.
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')Aviseringsregler och tröskelvärden
Definiera aviseringsregler som kod så att de versionshanteras och kan granskas. Vanliga aviseringar för promptövervakning:
- Felfrekvens > 5 % under 5 minuter i följd
- P95-latens > 10 s under 3 minuter
- Kostnad per dag > 2× veckomedelvärdet (kostnadstopp)
- Kvalitetspoängen sjunker > 20 % från baslinjen
# 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 för användarnöjdhet
Automatiska mått fångar inte allt. Samla in uttryckliga och indirekta användarsignaler som komplement till kvalitetspoängen:
- Tummebetyg: uttryckligt 👍/👎 på AI-svar
- Omförsöksfrekvens: användaren skickar om samma fråga direkt (indirekt missnöje)
- Kopierings-/användningsfrekvens: användaren kopierar AI-resultatet (indirekt nöjdhet)
- Korrigeringsfrekvens: användaren redigerar AI-resultatet innan det används
# 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 för versionsjämförelse
När ni utvärderar om en canary-version ska lanseras eller återställas ska ni generera en jämförelse sida vid sida av alla mått för den nya versionen och baslinjen. Rapporten ligger till grund för beslutet om lansering.
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%)Snabbkontroll
Ni vill upptäcka kvalitetsförsämringar automatiskt utan att manuellt kontrollera instrumentpaneler. Vilket angreppssätt löser detta bäst?
Sammanfattning av övervakning
Produktionsövervakning av prompts kräver att fem dimensioner följs per version:
- Latens (P50/P95/P99) — användarupplevelse
- Kostnad per anrop — ekonomisk hälsa
- Kvalitetspoäng — automatisk sampling med LLM som bedömare
- Felfrekvens — tillförlitlighet
- Användarnöjdhet — tummebetyg, omförsök och kopieringssignaler
Lagra måtten i en tidsseriedatabas, visualisera dem i instrumentpaneler och utlös aviseringar när tröskelvärden överskrids. Rapporter för versionsjämförelse ligger till grund för beslut om lansering och återställning.
Lär dig AI-promptteknik med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 53
- Lektioner
- 199
Vanliga frågor
Är lektionen ”Övervaka promptprestanda i produktion” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Övervaka promptprestanda i produktion”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
Vad lär jag mig i ”Övervaka promptprestanda i produktion”?
Följ latens, kostnad, kvalitetsmått och felfrekvens för varje promptversion. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?
Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Övervaka promptprestanda i produktion”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?
Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Arkitektur för ett promptregister
- Versionshantering av prompter
- Strategier för driftsättning och återställning
- Övervaka promptprestanda i produktion