Skip to content

20 — end-to-end-case ​

Caso práctico completo del Apéndice D del manual. El único módulo que ata todos los capítulos del manual en un flujo realista: contexto del producto → riesgos → métricas → gates → incidente → postmortem → release.

Si los 19 módulos anteriores muestran "cómo se hace cada pieza", este muestra "cómo encajan todas".

El producto del caso (D.1) ​

Chatbot interno para una aseguradora médica.

AtributoValor
Usuarios800 asesores
PaísesEspaña, Portugal, Reino Unido (ES/PT/EN)
Volumen~25 000 queries/día, picos × 4
StackClaude Sonnet 4.5 (LLM principal) + Haiku 4.5 (clasificación) + embeddings multilingües + reranker
Corpus12 000 documentos normativos
Equipo1 TechLead, 2 Backend, 1 ML Engineer, 1 QA Engineer, 2 Domain Experts (legal y clínico), 1 Security Lead compartido

Riesgos → requisitos (D.1) ​

Seis riesgos canónicos. Cada uno con un requisito de QA verificable:

RiesgoImpactoRequisito de QA
HallucinationReclamación legalFaithfulness ≥ 0.90 + Answer Correctness ≥ 0.88
PII leakSanción RGPD/HIPAA0 leaks en suite de canary tokens y PII probes
Prompt injectionAcción no autorizadaSuite OWASP LLM01:2025 con payloads directos e indirectos
Language biasServicio desigualKruskal-Wallis p > 0.01 y |Δ| ≤ 0.05 entre idiomas
Uncontrolled costSobrecoste mensualCost regression Δ ≤ +10 %; tool fan-out ≤ 5
Low robustnessUX degradadaConsistency mean ≥ 0.80 sobre perturbaciones

El incidente (D.8): faithfulness cae de 0.91 a 0.76 ​

Lo que ocurrió

El release v3.2 introdujo un cambio de tono en el prompt que degradó la cita textual de coberturas, aumentando alucinaciones extrínsecas. Faithfulness cae de 0.91 → 0.76 y refusal rate de 0.99 → 0.93 sobre las queries de cobertura.

Causa raíz: el gate de PR de faithfulness (≥0.85) estaba inadvertidamente desactivado tras un merge conflictivo en .github/workflows/qa-gate.yml. Antipatrones combinados: AP-10 (no versionar configuración de gates) + OP-09 (métricas sin baseline activa).

Línea de tiempo del runbook ​

text
T+0 ──── PagerDuty firing: faithfulness < 0.80 sustained 15 min
T+5 ──── Tech Lead compara versiones; bisección apunta al prompt
T+15 ─── Regression suite (Cap. 24) muestra Δ faithfulness = -0.15
         Investigación: el gate de PR estaba desactivado tras merge
         conflictivo. AP-10 + OP-09 confirmados.
T+25 ─── Rollback al prompt v3.1 vía MLflow + Git
         Faithfulness vuelve a 0.90
T+40 ─── Feature flag bloquea v3.2 para todos los usuarios
         Postmortem agendado

La lección estructural (D.10) ​

La cobertura de tests no protege si el sistema de gates se rompe en silencio. Añadir meta-tests al pipeline y tratar el fichero de workflow como código de producción versionado y revisado.

Las cinco mejoras estructurales acordadas:

  1. Meta-test en CI que falla si faltan gates obligatorios en el workflow.
  2. Versionado obligatorio del prompt con changelog firmado por QA Lead.
  3. Alertas dobles: por umbral absoluto y por drift estadístico.
  4. Auditoría trimestral del checklist de release con revisor externo.
  5. Robustness suite en PR también para idiomas minoritarios.

Release v3.3: decisión final (D.11) ​

Tras la remediación, v3.3 cierra el ciclo en T+14d:

MétricaObservadoUmbralPasa
Faithfulness0.93≥ 0.90✓
Consistency robustness0.84≥ 0.80✓
Refusal rate0.99≥ 0.99✓
PII canary leaks0= 0✓
Cost vs baseline+3 %≤ +10 %✓

Aprobado por QA Engineer + Domain Experts. Canary al 5 % durante 48 h antes de full rollout.

Cómo se reproduce desde código ​

python
from gates_pipeline import Stage, evaluate_stage
from incident_simulator import reproduce_incident, should_trigger_alert

incident = reproduce_incident()
# {'prompt_version_pre': 'v3.1', 'prompt_version_incident': 'v3.2',
#  'faithfulness_pre': 0.91, 'faithfulness_post': 0.76,
#  'delta_faithfulness': -0.15, ...}

# v3.2 habría sido bloqueado si los gates hubieran estado activos
observed_v3_2 = {
    "faithfulness": incident["faithfulness_post"],
    "answer_correctness": 0.80,
    "context_recall": 0.85,
    "ndcg_at_5": 0.82,
    "safety_canary_leaks": 0.0,
}
result = evaluate_stage(Stage.PRE_STAGING, observed_v3_2)
assert not result.passed  # gate bloquea correctamente

Conexión con todos los módulos ​

Pieza del casoMódulo del repo
Faithfulness, context recall02 — ragas-basics
Tabla 4.2 umbralesTabla maestra
OWASP LLM08 — redteam-deepteam
Canary tokens + PII09 — guardrails
Drift y alertas dobles13 — drift-monitoring
Cost regression15 — cost-aware-qa
NDCG@5 retrieval16 — retrieval-advanced
Chatbot operativo17 — chatbot-testing
Robustness por idioma18 — robustness-suite
IAA del dataset (α ≥ 0.80)19 — hitl-iaa

Referencias ​

  • Manual QA AI v13 — Apéndice D (pp. 110–114), Figura D.1
  • Cap. 23 — Estrategia integral, Tabla 23.2 (checklist de release multi-equipo)
  • Caps. 22 + 26 — Antipatrones (AP-10, OP-09)

MIT License · GitHub