Publicado el 5 min de lectura

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.

Una lupa compara barras de datos turquesas en dos hojas de informe y resalta una discrepancia en ámbar.

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

Últimos artículos