Comprobar un resumen de IA frase por frase frente a la fuente
Divide un resumen de IA en afirmaciones individuales, vincula cada una con frases concretas de la fuente y marca las afirmaciones sin respaldo o exageradas antes de reutilizarlas. Un pequeño documento sintético muestra por qué incluso los resúmenes fluidos necesitan comprobación de evidencia.
Contenido revisado 2026.09.20Incluye archivos de ejemplo
Ver el índice
La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English
Para quién esEsta guía es para personas que usan IA para resumir informes, notas o material de investigación y quieren una revisión trazable frase por frase.
Preparación
Python 3.12 y un comando de terminal que inicie esa versión.
Un editor de texto que pueda guardar archivos de texto y CSV en UTF-8.
Una carpeta de trabajo donde el script pueda crear una nueva carpeta dentro de outputs.
Solo se necesita la biblioteca estándar de Python: csv y pathlib.
01Trata cada frase del resumen como una afirmación
Un resumen de IA puede estar gramaticalmente bien escrito y, aun así, cambiar una causa, omitir una limitación o añadir una conclusión que la fuente nunca formuló. Por eso, una revisión útil plantea una pregunta sencilla para cada frase del resumen: ¿qué parte exacta de la fuente respalda esta afirmación?
Este tutorial utiliza tres veredictos. SUPPORTED significa que la fuente respalda directamente la frase. PARTIAL significa que solo una parte está respaldada o que falta una condición importante. UNSUPPORTED significa que la fuente no respalda la afirmación o la contradice.
02Crea un documento fuente sintético y un resumen de IA
La fuente y el resumen siguientes son sintéticos y se escribieron específicamente para este artículo. Guarda el primer bloque como source.txt y el segundo como ai_summary.txt.
text
S1|The pilot processed 20 test cases.
S2|Eighteen cases completed successfully.
S3|Two cases stopped during input validation before the solver started.
S4|Among the 18 completed cases, the median runtime was 42 seconds.
S5|The test was performed on one workstation under the same software configuration.
S6|No production deployment or long-term reliability test was performed.
text
A1|The pilot processed 20 cases, and 18 completed successfully.
A2|Two cases failed because the solver crashed.
A3|The median runtime for completed cases was 42 seconds.
A4|The results show that the automation is reliable enough for production use.
La fuente contiene 6 frases. El resumen de IA contiene 4 frases. Los valores son deliberadamente pequeños para poder comprobarlos sin software.
03Compara cada frase del resumen con la fuente
A1 está respaldada por S1 y S2. A2 contradice S3: la fuente dice que los dos casos se detuvieron durante input validation antes de que comenzara el solver, no por fallos del solver. A3 está respaldada directamente por S4. A4 va más allá de la evidencia porque S6 indica explícitamente que no se realizó ningún production deployment ni long-term reliability test.
ID del resumen
Veredicto
Evidencia
Motivo
A1
SUPPORTED
S1;S2
El número de casos y las finalizaciones correctas coinciden con la fuente.
A2
UNSUPPORTED
S3
La fuente atribuye las detenciones a input validation antes del inicio del solver.
A3
SUPPORTED
S4
Se indica una median runtime de 42 segundos para los 18 casos completados.
A4
UNSUPPORTED
S6
La preparación para producción no se probó.
Por lo tanto, la revisión esperada contiene 2 frases SUPPORTED y 2 UNSUPPORTED. Ninguna de las cuatro frases sintéticas requiere la etiqueta PARTIAL.
04Registra la revisión en un CSV trazable
Guarda lo siguiente como summary_review.csv. La columna evidence contiene IDs de frases de la fuente en lugar de párrafos copiados, lo que mantiene la revisión compacta sin perder trazabilidad.
csv
summary_id,verdict,evidence,reason
A1,SUPPORTED,S1;S2,The case count and successful completions match the source.
A2,UNSUPPORTED,S3,The source attributes the stops to input validation before solver start.
A3,SUPPORTED,S4,The 42-second median is stated for the 18 completed cases.
A4,UNSUPPORTED,S6,Production readiness was not tested.
Esta revisión sigue siendo un juicio humano. El siguiente script no decide si una afirmación es verdadera. Comprueba que cada frase del resumen de IA haya recibido un veredicto válido y que cada ID de fuente citado exista realmente.
05Comprueba que todas las frases fueron revisadas
Guarda el siguiente script como check_summary_review.py. Lee la fuente, el resumen y el CSV de revisión completado, verifica los IDs y los veredictos y escribe un nuevo informe validado sin modificar ningún archivo de entrada.
python
import csv
from pathlib import Path
SOURCE = Path("source.txt")
SUMMARY = Path("ai_summary.txt")
REVIEW = Path("summary_review.csv")
OUTPUT_DIR = Path("outputs") / "summary_source_check"
OUTPUT = OUTPUT_DIR / "validated_review.csv"
VALID_VERDICTS = {"SUPPORTED", "PARTIAL", "UNSUPPORTED"}
def read_id_text(path: Path) -> dict[str, str]:
result = {}
with path.open("r", encoding="utf-8") as stream:
for line_number, line in enumerate(stream, start=1):
line = line.rstrip("\n")
if not line:
continue
item_id, separator, text = line.partition("|")
if not separator or not item_id or not text:
raise ValueError(f"Invalid line {line_number} in {path}.")
if item_id in result:
raise ValueError(f"Duplicate ID {item_id} in {path}.")
result[item_id] = text
return result
def main() -> None:
for path in (SOURCE, SUMMARY, REVIEW):
if not path.is_file():
raise FileNotFoundError(f"Missing input: {path}")
if OUTPUT_DIR.exists():
raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")
source = read_id_text(SOURCE)
summary = read_id_text(SUMMARY)
reviewed = {}
with REVIEW.open("r", encoding="utf-8-sig", newline="") as stream:
reader = csv.DictReader(stream)
required = {"summary_id", "verdict", "evidence", "reason"}
if reader.fieldnames is None or not required.issubset(reader.fieldnames):
raise ValueError("Review CSV is missing a required column.")
for row in reader:
summary_id = row["summary_id"].strip()
verdict = row["verdict"].strip()
evidence_ids = [x.strip() for x in row["evidence"].split(";") if x.strip()]
if summary_id not in summary:
raise ValueError(f"Unknown summary ID: {summary_id}")
if summary_id in reviewed:
raise ValueError(f"Duplicate review: {summary_id}")
if verdict not in VALID_VERDICTS:
raise ValueError(f"Invalid verdict for {summary_id}: {verdict}")
if not evidence_ids:
raise ValueError(f"No evidence listed for {summary_id}.")
unknown = [item for item in evidence_ids if item not in source]
if unknown:
raise ValueError(f"Unknown source IDs for {summary_id}: {unknown}")
if not row["reason"].strip():
raise ValueError(f"Missing reason for {summary_id}.")
reviewed[summary_id] = {
"summary_id": summary_id,
"summary_text": summary[summary_id],
"verdict": verdict,
"evidence": ";".join(evidence_ids),
"reason": row["reason"].strip(),
}
missing = [item for item in summary if item not in reviewed]
if missing:
raise ValueError(f"Summary sentences not reviewed: {missing}")
OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
OUTPUT_DIR.mkdir()
fields = ["summary_id", "summary_text", "verdict", "evidence", "reason"]
with OUTPUT.open("x", encoding="utf-8", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=fields)
writer.writeheader()
for summary_id in summary:
writer.writerow(reviewed[summary_id])
counts = {verdict: 0 for verdict in VALID_VERDICTS}
for row in reviewed.values():
counts[row["verdict"]] += 1
print(f"Summary sentences checked: {len(summary)}.")
print(
f"Supported: {counts['SUPPORTED']}; partial: {counts['PARTIAL']}; "
f"unsupported: {counts['UNSUPPORTED']}."
)
print(f"Output: {OUTPUT.as_posix()}")
if __name__ == "__main__":
main()
06Comprueba el resultado esperado
En la revisión sintética anterior, las 4 frases del resumen tienen un veredicto válido y referencias válidas a la fuente. La salida de consola esperada se muestra abajo. Se obtuvo manualmente y no es un registro de ejecución.
Confirma que cada A-ID aparezca exactamente una vez en la revisión.
Confirma que cada S-ID citado exista en source.txt.
Confirma que las afirmaciones UNSUPPORTED no se hayan reescrito silenciosamente como SUPPORTED.
Mantén sin cambios el resumen original de IA para que la revisión siga siendo auditable.
Vuelve a ejecutar el script sin cambiar OUTPUT_DIR. Debe detenerse con FileExistsError en lugar de sobrescribir la validación anterior.
07Reconoce errores comunes y límites
Problema
Qué hacer
Una frase del resumen contiene dos afirmaciones distintas
Divide la frase en unidades del tamaño de una afirmación o revisa cada afirmación por separado.
La evidencia solo respalda parte de la frase
Usa PARTIAL y escribe la condición que falta en la columna reason.
La fuente no dice nada sobre una conclusión
Márcala como UNSUPPORTED en vez de tratar una inferencia plausible como un hecho respaldado por la fuente.
Se cita una frase de la fuente, pero en realidad no respalda la afirmación
Corrige la revisión humana; tener IDs válidos por sí solo no demuestra respaldo semántico.
Distintas fuentes discrepan
Registra explícitamente el desacuerdo en vez de forzar una única conclusión sin respaldo.
El script de Python valida que la revisión esté completa y que los IDs de referencia sean válidos, no la verdad de las afirmaciones. El respaldo semántico sigue requiriendo lectura humana o un proceso separado de evaluación de evidencia. Un veredicto humano incorrecto puede superar el comprobador estructural.
Para informes largos, usa números de página, IDs de párrafo, números de tabla o ubicaciones concretas de citas en lugar de referencias informales. También distingue entre afirmaciones directas de la fuente, cálculos, interpretaciones y conocimiento externo. Un resumen no debe convertir silenciosamente una categoría en otra.
Se comprobaron manualmente 4 frases sintéticas del resumen frente a 6 frases sintéticas de la fuente.
A1 y A3 se clasificaron como SUPPORTED y A2 y A4 como UNSUPPORTED.
Se confirmó que A2 entra en conflicto con S3 porque la fuente dice que input validation detuvo los casos antes de que comenzara el solver.
Se confirmó que A4 va más allá de la fuente porque S6 dice que no se probaron production deployment ni long-term reliability.
Se calcularon manualmente los recuentos esperados de veredictos: 2 supported, 0 partial y 2 unsupported.
Se revisó el script para detectar revisiones faltantes, IDs duplicados, veredictos no válidos, IDs de fuente desconocidos, protección frente a colisiones de salida y generación del informe.
Límites de la verificación
El autor de esta respuesta no ejecutó el código; no se creó ningún CSV de validación.
El comprobador estructural no determina si una fuente citada respalda semánticamente una afirmación.
Solo se revisaron la fuente y el resumen sintéticos mostrados aquí; no se probaron documentos largos, tablas, figuras ni fuentes en conflicto.
Las URL de la documentación oficial se proporcionaron desde ubicaciones conocidas, pero no se comprobaron en tiempo real.
Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.
Convierte “automatiza esto” en una descripción de tarea ejecutable. Adjunta una muestra sintética sin datos sensibles y un resultado esperado comprobado manualmente para completar una solicitud de script que totalice registros de trabajo por equipo.
Comprueba una función de agregación con cuatro filas que puedes calcular manualmente y 12 unit tests. Verifica no solo valores normales, sino también entrada vacía, cero, decimales y entrada no válida.
Divide un resumen plausible en hechos, cálculos e interpretaciones. Recalcula proporciones y promedios a partir de datos mensuales sintéticos y reescribe las frases con fuentes faltantes o causas exageradas para convertirlas en afirmaciones comprobables.
Trata una expresión regular generada por IA como un borrador, no como una regla terminada. Crea una pequeña tabla de pruebas sintéticas, compara las coincidencias esperadas con las reales, corrige el patrón y guarda un informe de revisión antes de usarlo con datos reales.