Monitoraggio delle prestazioni dei prompt in produzione
Monitoraggio di latenza, costi, punteggi di qualità e tassi di errore per ogni versione del prompt
Monitoraggio delle prestazioni dei prompt in produzione è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
Perché monitorare le prestazioni dei prompt?
Un prompt distribuito in produzione non è «finito». Il comportamento del modello cambia con gli aggiornamenti, gli input degli utenti variano nel tempo e i costi possono aumentare inaspettatamente. Il monitoraggio continuo rileva le regressioni prima che danneggino gli utenti e mantiene prevedibili le spese.
Metriche chiave per versione del prompt
In produzione, monitori queste cinque metriche per ogni versione del prompt:
- Latenza media: tempo dalla richiesta alla risposta completa (P50, P95, P99)
- Costo per chiamata: token di input × prezzo + token di output × prezzo
- Punteggio di qualità: valutazione automatica (LLM-as-judge o metrica del task)
- Tasso di errore: errori API + errori di analisi dell'output non valido
- Soddisfazione degli utenti: valutazioni con il pollice, tasso di ripetizione della richiesta, abbandono della sessione
Strumentazione: registrazione delle metriche
Avvolga ogni chiamata LLM con una strumentazione che registri tutte le metriche chiave in un archivio di serie temporali o in un database, per consentire analisi e avvisi successivi.
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 responseCalcolo del costo per chiamata
Costo per chiamata = token di input × prezzo dell'input + token di output × prezzo dell'output. La memorizzazione del numero grezzo di token consente di ricalcolare il costo ogni volta che cambiano i prezzi.
# 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.00Valutazione automatica della qualità
Utilizzi un LLM judge per valutare automaticamente la qualità dell'output su scala di produzione. Campioni il 5-10% delle chiamate per la valutazione della qualità, così da mantenere i costi sotto controllo.
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 NoneMemorizzazione delle metriche in un database di serie temporali
I database di serie temporali (InfluxDB, TimescaleDB o anche una semplice tabella PostgreSQL con un indice sui timestamp) memorizzano in modo efficiente le metriche di ogni chiamata e supportano query di aggregazione per i dashboard.
-- 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;Creazione di un dashboard delle metriche
I dashboard mostrano in tempo reale le cinque metriche chiave. Utilizzi Grafana (con TimescaleDB come origine dati) o un dashboard web personalizzato. Pannelli principali:
- Latenza P50/P95/P99 nel tempo, per versione
- Andamento del costo per chiamata (giornaliero/settimanale)
- Percentuale del tasso di errore
- Media mobile del punteggio di qualità
- Punteggio di soddisfazione degli utenti
# 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()Rilevamento delle anomalie per le regressioni dei prompt
La revisione manuale dei dashboard non rileva le regressioni lente. Il rilevamento automatico delle anomalie confronta una finestra mobile con una baseline storica e invia un avviso quando la deviazione supera una soglia.
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')Regole e soglie per gli avvisi
Definisca le regole degli avvisi sotto forma di codice, in modo che siano sottoposte al controllo delle versioni e possano essere revisionate. Avvisi comuni per il monitoraggio dei prompt:
- Tasso di errore > 5% per 5 minuti consecutivi
- Latenza P95 > 10 s per 3 minuti
- Costo giornaliero > 2× della media settimanale (picco dei costi)
- Il punteggio di qualità diminuisce di > 20% rispetto alla baseline
# 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}'Segnali di soddisfazione degli utenti
Le metriche automatiche non rilevano ogni aspetto. Raccolga segnali espliciti e impliciti dagli utenti per integrare i punteggi di qualità:
- Valutazione con il pollice: 👍/👎 esplicito sulle risposte dell'IA
- Tasso di ripetizione: l'utente invia nuovamente la stessa richiesta subito dopo (insoddisfazione implicita)
- Tasso di copia/utilizzo: l'utente copia l'output dell'IA (soddisfazione implicita)
- Tasso di correzione: l'utente modifica l'output dell'IA prima di utilizzarlo
# 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}Report di confronto tra versioni
Quando valuta se promuovere o sottoporre a rollback un canary, generi un confronto affiancato di tutte le metriche tra la nuova versione e la baseline. Questo report guida la decisione di promozione.
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%)Verifica rapida
Desidera rilevare automaticamente le regressioni della qualità senza controllare manualmente i dashboard. Quale approccio consente di ottenere al meglio questo risultato?
Riepilogo del monitoraggio
Il monitoraggio dei prompt in produzione richiede il controllo di cinque dimensioni per ogni versione:
- Latenza (P50/P95/P99) — esperienza dell'utente
- Costo per chiamata — situazione finanziaria
- Punteggio di qualità — campionamento automatico tramite LLM judge
- Tasso di errore — affidabilità
- Soddisfazione degli utenti — segnali relativi a valutazioni con il pollice, ripetizioni e copie
Memorizzi le metriche in un database di serie temporali, le visualizzi nei dashboard e invii avvisi quando le soglie vengono superate. I report di confronto tra versioni aiutano a decidere le promozioni e i rollback.
Domande Frequenti
La lezione «Monitoraggio delle prestazioni dei prompt in produzione» è gratuita?
Sì — il testo completo di «Monitoraggio delle prestazioni dei prompt in produzione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Monitoraggio delle prestazioni dei prompt in produzione»?
Monitoraggio di latenza, costi, punteggi di qualità e tassi di errore per ogni versione del prompt Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Monitoraggio delle prestazioni dei prompt in produzione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Architettura di un prompt registry
- Controllo versione dei prompt
- Strategie di deployment e rollback
- Monitoraggio delle prestazioni dei prompt in produzione