Monitorización del rendimiento de prompts en producción
Realice un seguimiento de la latencia, el coste, las puntuaciones de calidad y las tasas de error de cada versión del prompt.
Monitorización del rendimiento de prompts en producción es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.
¿Por qué supervisar el rendimiento de los prompts?
Un prompt desplegado en producción no está «terminado». El comportamiento del modelo cambia gradualmente con las actualizaciones, las entradas de los usuarios cambian con el tiempo y los costes pueden aumentar inesperadamente. La supervisión continua detecta las regresiones antes de que perjudiquen a los usuarios y mantiene predecible el gasto.
Métricas clave por versión del prompt
Haga seguimiento de estas cinco métricas por versión del prompt en producción:
- Latencia media: tiempo desde la solicitud hasta la respuesta completa (P50, P95, P99)
- Coste por llamada: tokens de entrada × precio + tokens de salida × precio
- Puntuación de calidad: evaluación automatizada (LLM-as-judge o métrica de la tarea)
- Tasa de errores: errores de API + fallos al analizar salidas malformadas
- Satisfacción del usuario: valoración con pulgar, tasa de reintentos y abandono de sesión
Instrumentación: registro de métricas
Envuelva cada llamada a LLM con instrumentación que registre todas las métricas clave en un almacén de series temporales o una base de datos para su posterior análisis y para activar alertas.
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 responseCálculo del coste por llamada
Coste por llamada = tokens de entrada × precio de entrada + tokens de salida × precio de salida. Almacenar los recuentos de tokens sin procesar permite recalcular el coste cada vez que cambien los precios.
# 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.00Puntuación automatizada de calidad
Use un LLM evaluador para puntuar automáticamente la calidad de las salidas a escala de producción. Muestree entre el 5 % y el 10 % de las llamadas para evaluar su calidad y mantener los costes bajo control.
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 NoneAlmacenamiento de métricas en una base de datos de series temporales
Las bases de datos de series temporales (InfluxDB, TimescaleDB o incluso una tabla sencilla de PostgreSQL con un índice de marcas de tiempo) almacenan las métricas de cada llamada de forma eficiente y admiten consultas de agregación para los paneles.
-- 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;Creación de un panel de métricas
Los paneles muestran las cinco métricas clave en tiempo real. Use Grafana (con TimescaleDB como fuente de datos) o un panel web personalizado. Paneles clave:
- Latencia P50/P95/P99 a lo largo del tiempo, por versión
- Tendencia del coste por llamada (diaria/semanal)
- Porcentaje de errores
- Media móvil de la puntuación de calidad
- Puntuación de satisfacción del usuario
# 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()Detección de anomalías en regresiones de prompts
La revisión manual de los paneles no detecta las regresiones lentas. La detección automatizada de anomalías compara una ventana móvil con una línea base histórica y activa una alerta cuando la desviación supera un umbral.
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')Reglas y umbrales de alerta
Defina las reglas de alerta como código para que estén controladas por versiones y puedan revisarse. Alertas habituales para la supervisión de prompts:
- Tasa de errores > 5 % durante 5 minutos consecutivos
- Latencia P95 > 10 s durante 3 minutos
- Coste diario > 2× el promedio semanal (pico de costes)
- La puntuación de calidad disminuye > 20 % respecto a la línea base
# 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}'Indicadores de satisfacción del usuario
Las métricas automatizadas no lo capturan todo. Recopile indicadores explícitos e implícitos de los usuarios para complementar las puntuaciones de calidad:
- Valoración con pulgar: 👍/👎 explícito sobre las respuestas de IA
- Tasa de reintentos: el usuario vuelve a enviar inmediatamente la misma consulta (insatisfacción implícita)
- Tasa de copia/uso: el usuario copia la salida de la IA (satisfacción implícita)
- Tasa de corrección: el usuario edita la salida de la IA antes de utilizarla
# 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}Informes de comparación de versiones
Al evaluar si se promociona o se hace rollback de un canary, genere una comparación lado a lado de todas las métricas entre la nueva versión y la línea base. Este informe guía la decisión de promoción.
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%)Comprobación rápida
Quiere detectar automáticamente las regresiones de calidad sin revisar manualmente los paneles. ¿Qué enfoque permite lograrlo mejor?
Resumen de la supervisión
La supervisión de prompts en producción requiere hacer seguimiento de cinco dimensiones por versión:
- Latencia (P50/P95/P99) — experiencia del usuario
- Coste por llamada — salud financiera
- Puntuación de calidad — muestreo automatizado con LLM-as-judge
- Tasa de errores — fiabilidad
- Satisfacción del usuario — valoración con pulgar y señales de reintento y copia
Almacene las métricas en una base de datos de series temporales, visualícelas en paneles y active alertas cuando se superen los umbrales. Los informes de comparación de versiones sirven para decidir las promociones y los rollbacks.
Preguntas frecuentes
¿La lección «Monitorización del rendimiento de prompts en producción» es gratis?
Sí — el texto completo de «Monitorización del rendimiento de prompts en producción» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.
¿Qué aprenderé en «Monitorización del rendimiento de prompts en producción»?
Realice un seguimiento de la latencia, el coste, las puntuaciones de calidad y las tasas de error de cada versión del prompt. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Prompt Engineering?
No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Monitorización del rendimiento de prompts en producción»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?
Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Arquitectura de un registro de prompts
- Control de versiones para prompts
- Estrategias de despliegue y reversión
- Monitorización del rendimiento de prompts en producción