← Volver al blog Dev IA

Monitorizar un Agente IA en Producción: Métricas, Alertas, Derivas

2 jul. 20266 min

Desplegar un agente IA sin monitorización es como conducir sin cuadro de mandos. Los problemas existen — los descubres cuando el cliente se queja, no antes. Esto es lo que implemento sistemáticamente.

Las 5 Métricas Críticas

1. Número de turnos por sesión

Un agente que tarda 12 turnos en una tarea que debería tomar 3 tiene un problema — herramienta rota, prompt ambiguo o bucle implícito.

from dataclasses import dataclass, field
import time

@dataclass
class AgentSession:
    session_id: str
    steps: int = 0
    start_time: float = field(default_factory=time.monotonic)
    tool_calls: list[str] = field(default_factory=list)
    hit_max_steps: bool = False

    @property
    def duration(self) -> float:
        return time.monotonic() - self.start_time

Umbral de alerta: media > 5 steps en los últimos 30 minutos.

2. Tasa de sesiones MAX_STEPS

Si más del 2% de las sesiones alcanza el límite, hay un bug estructural en la lógica del agente.

3. Latencia P95

La latencia mediana oculta los outliers. El P95 te dice qué experimentan los usuarios menos afortunados.

4. Tasa de error por herramienta

Cada herramienta del agente necesita su propio contador de errores. Una herramienta que falla el 10% de las veces degrada silenciosamente el conjunto.

5. Puntuación de calidad

Para agentes con salida estructurada verificable (extracción, clasificación), calcula una tasa de éxito automática.

Detectar Derivas

import statistics

def detect_drift(recent_scores: list[float], baseline_scores: list[float]) -> bool:
    if not recent_scores or not baseline_scores:
        return False
    recent_mean = statistics.mean(recent_scores)
    baseline_mean = statistics.mean(baseline_scores)
    return recent_mean < baseline_mean * 0.90

Compara siempre una ventana reciente (últimas 24h) con una baseline estable (semana anterior).

Stack Mínimo

import logging, json

def log_session(session: AgentSession, error: str | None) -> None:
    logging.info(json.dumps({
        "session_id": session.session_id,
        "steps": session.steps,
        "duration_s": round(session.duration, 2),
        "tools_used": session.tool_calls,
        "hit_max_steps": session.hit_max_steps,
        "success": error is None,
        "error": error,
    }))

Un log JSON por sesión. Ingestible por Datadog, Grafana o un simple grep.

Alertas Prioritarias

AlertaUmbralAcción
Tasa MAX_STEPS> 2% en 1hInvestigar lógica del agente
Steps medio> 5Verificar herramientas
Error por herramienta> 5%Depurar la herramienta
Latencia P95> 30sVerificar timeouts
Deriva de calidad> 10%Comparar changelog del modelo

2 horas de configuración que evitan incidentes a las 2 de la mañana.

SC

Stéphanie Caumont

Product Owner de IA · Saber más