Comprueba las cifras de resúmenes de IA con una tabla de referencia
En esta página
Un informe semanal redactado por IA dice que tu equipo resolvió el 85% de las incidencias. La tabla de referencia indica el 80%. La frase resulta creíble, pero publicarla introduciría una afirmación falsa. NIST identifica el contenido falso presentado con seguridad como un riesgo de la IA generativa en su perfil de IA generativa.
Construye una pequeña comprobación local en Python que compare afirmaciones numéricas estructuradas con un informe fiable. Señala valores, unidades y períodos incorrectos, además de métricas inventadas. Necesitas Python 3.9 o posterior, sin paquetes adicionales ni cuenta de un modelo. Todos los datos son sintéticos: son pruebas del comprobador, no mediciones del rendimiento de una IA.
1. Fija la referencia antes de consultar a la IA
Usa un informe de soporte revisado para la semana ISO 2026-W43. Estas son sus métricas ya calculadas:
| ID de métrica | Valor | Unidad |
|---|---|---|
resolved |
80 | tickets |
resolution_rate |
80 | percent |
median_hours |
3.5 | hours |
Conserva la exportación, el alcance del informe y las definiciones de las métricas junto con la ejecución. No pidas al mismo modelo que invente los valores de referencia.
Solicita una lista de afirmaciones junto al texto: cada fila debe contener metric, period, unit y un value de tipo cadena. Indica al asistente que copie métricas existentes, sin calcular otras nuevas. Por ejemplo, «80 incidencias resueltas» corresponde a resolved, 2026-W43, tickets y "80".
Valida primero el análisis y los tipos de los campos. Nuestro tutorial de JSON estricto para IA presenta ese filtro independiente; adapta su esquema para exigir exactamente cuatro campos de tipo cadena: metric, period, unit y value. Las tuplas siguientes representan filas validadas en ese orden, no un analizador de JSON arbitrario.
2. Compara los campos que dan significado a las cifras
Guarda este código como check_summary_numbers.py en una carpeta nueva. Las cinco afirmaciones contienen cuatro errores intencionados. Solo se informa del primer problema detectado en cada fila.
from decimal import Decimal, InvalidOperation
PERIOD = "2026-W43"
source = {
"resolved": ("tickets", "80"),
"resolution_rate": ("percent", "80"),
"median_hours": ("hours", "3.5"),
}
claims = [
("resolved", PERIOD, "tickets", "80"),
("resolution_rate", PERIOD, "percent", "85"),
("median_hours", PERIOD, "minutes", "3.5"),
("backlog", PERIOD, "tickets", "12"),
("resolved", "2026-W42", "tickets", "80"),
]
def check(metric, period, unit, value):
if metric not in source:
return "unknown metric"
if period != PERIOD:
return "period mismatch"
expected_unit, expected_value = source[metric]
if unit != expected_unit:
return "unit mismatch"
if not isinstance(value, str):
return "invalid number"
try:
number = Decimal(value)
except InvalidOperation:
return "invalid number"
if not number.is_finite():
return "invalid number"
return "supported" if number == Decimal(expected_value) else "value mismatch"
def main():
reasons = [check(*row) for row in claims]
for row, reason in zip(claims, reasons):
print(f"{row[0]}: {reason}")
print(f"supported={reasons.count('supported')}/{len(reasons)}")
return int(not reasons or any(r != "supported" for r in reasons))
if __name__ == "__main__":
raise SystemExit(main())
La documentación de Decimal de Python explica la representación decimal exacta a partir de cadenas y la comprobación is_finite(). Aquí, 80 y 80.0 se consideran iguales sin pasar por números binarios de coma flotante. Se rechazan los valores no finitos.
Esta política exige copiar valores exactos: 0.8 percent no significa 80 percent, y 3.5 minutes no significa 3.5 hours. Las conversiones y los resúmenes redondeados necesitan reglas independientes y probadas explícitamente.
3. Valida las rutas de rechazo y aceptación
Ejecuta:
python3 check_summary_numbers.py
Salida estándar esperada:
resolved: supported
resolution_rate: value mismatch
median_hours: unit mismatch
backlog: unknown metric
resolved: period mismatch
supported=1/5
El estado de salida es 1, sin salida de error. Es un filtro de revisión intencionado, no un fallo de Python. No publiques mientras alguna fila carezca de respaldo.
Ahora ejecuta estas comprobaciones de casos límite y sustituye las afirmaciones en memoria por copias correctas de la referencia:
python3 - <<'PYTEST'
import check_summary_numbers as demo
assert demo.check("resolved", demo.PERIOD, "tickets", "80.0") == "supported"
assert demo.check("resolution_rate", demo.PERIOD, "percent", "0.8") == "value mismatch"
for value in ("NaN", "Infinity", "unknown", True):
assert demo.check("resolved", demo.PERIOD, "tickets", value) == "invalid number"
demo.claims = [
(metric, demo.PERIOD, unit, value)
for metric, (unit, value) in demo.source.items()
]
raise SystemExit(demo.main())
PYTEST
Salida estándar esperada:
resolved: supported
resolution_rate: supported
median_hours: supported
supported=3/3
Este comando termina con estado 0, sin salida de error. Las aserciones también comprueban una escritura decimal equivalente, una confusión entre porcentaje y fracción, texto inválido, booleanos y números no finitos. Ambos comandos se probaron localmente con los datos incluidos; ninguno consulta un modelo ni modifica el informe de referencia.
Cuando compares cambios de prompts, guarda estos casos y conserva los ejemplos incorrectos. El tutorial de regresiones de prompts muestra cómo detectar casos que dejan de funcionar en lugar de confiar en una media mejor.
4. Resuelve los problemas sin saltarte el filtro
- Cifra correcta, semana incorrecta: conserva la comprobación del período. No sustituyas el informe por el actual sin avisar.
- Unidad incorrecta: regenera la afirmación o aplica una conversión aprobada; no cambies solo la etiqueta.
- Cifra redondeada rechazada: define la precisión y la tolerancia de cada métrica antes de permitir aproximaciones.
- Métrica desconocida: busca pruebas independientes o elimina la afirmación. Otra respuesta de IA no es una referencia.
- Todas las filas pasan, pero el texto es incorrecto: contrasta cada frase con su fila. Este filtro no detecta afirmaciones omitidas, comparaciones engañosas, entidades equivocadas ni explicaciones inventadas.
Para exigir cobertura, mantén una lista independiente de las métricas que el informe debe mencionar. Un subconjunto correcto no garantiza un resumen completo. Envía las filas rechazadas a una persona: «sin respaldo» no demuestra que algo sea inventado. La evaluación de umbrales de revisión ayuda a medir esa carga de trabajo.
Conclusión práctica
Pide a la IA afirmaciones rastreables, conserva la referencia fiable y comprueba valor, unidad y período juntos. Un filtro superado demuestra concordancia numérica, no que el resumen completo sea verdadero.
Artículos relacionados
Compara versiones de prompts de IA con una prueba de regresión en Python
Revisa planes de renombrado de IA sin cambiar archivos
Evalúa la clasificación de incidencias con una matriz de confusión
Evalúa probabilidades de IA con la puntuación de Brier en Python
Detecta texto repetido entre entrenamiento y prueba antes de evaluar una IA
Rechaza JSON ambiguo de IA antes de automatizar con Python
Elige umbrales de revisión de IA con cobertura y tasas de error
Evalúa transcripciones de IA con la tasa de error por palabra
Comprueba los marcadores de traducciones de IA con Python
Prueba expresiones regulares de IA con casos pequeños en Python
Prueba el SQL generado por IA con pequeños juegos de datos de SQLite
Cómo evaluar la recuperación RAG con Recall@k y MRR
Últimos artículos
Evalúa campos extraídos por IA con precisión y recall de coincidencia exacta
Comprueba las rutas propuestas por IA antes de escribir con Python
Evita actualizaciones de IA obsoletas con un control de versión en SQLite
Comprueba las dependencias de tareas de IA antes de programarlas con Python
Revisa los cambios JSON de la IA con una lista de campos permitidos
Combina resultados RAG con fusión de rangos recíprocos
Comprueba las horas de calendario de IA antes de crear eventos
Comprueba citas textuales de IA con fuentes locales y Python
Elige umbrales de revisión de IA con cobertura y tasas de error
Comprueba los marcadores de traducciones de IA con Python
Compara versiones de prompts de IA con una prueba de regresión en Python