Estado: En pausa

Batería ciega para evaluar modelos de reasoning

Una batería reproducible de problemas inéditos para comprobar no solo si un modelo obtiene la respuesta correcta, sino si su calendario y su demostración también lo son.

Etiquetas: IA · reasoning · LLM · evaluación

¿Podemos comparar modelos con problemas que ninguno de ellos haya visto previamente?

STATUS       PAUSED
AREA         IA / REASONING
START        25 AUG 2026
HARDWARE     RTX 5080 16 GB
CASES        5
MODEL RUN    GPT-OSS 20B · LOW
RESULT       3 PASS · 1 PARTIAL · 1 FAIL

La pregunta

Después de varias pruebas con modelos locales apareció una duda bastante incómoda.

Estaba utilizando problemas de planificación para comparar su capacidad de razonamiento, pero los problemas los habíamos planteado manualmente. Aunque un modelo resolviese correctamente uno de ellos, era difícil saber hasta qué punto estaba razonando realmente sobre un caso nuevo o reconociendo una estructura parecida a ejemplos que pudieran formar parte de sus datos de entrenamiento.

Necesitaba problemas que pudiera verificar con exactitud pero cuya solución no conociese el modelo.

La idea fue construir una batería ciega.

GENERADOR

PROBLEMA NUEVO

SOLVER EXACTO

ÓPTIMO PRIVADO

PROMPT

MODELO

COMPARACIÓN

El modelo recibe el problema. Nunca recibe la solución.

El experimento

Construí en Python un pequeño generador de problemas de scheduling con dos trabajadores.

Cada problema contiene un conjunto de tareas con una duración determinada y dependencias entre ellas. Una tarea no puede empezar hasta que hayan terminado todas sus predecesoras, cada trabajador solo puede ejecutar una tarea simultáneamente y las tareas no pueden interrumpirse.

El objetivo es encontrar el calendario que complete todo el trabajo en el menor tiempo posible.

Para poder repetir exactamente la batería utilicé una semilla fija:

20260825

El generador produjo cinco casos de dificultad creciente:

Caso Tareas Dependencias
CASE-1 8 9
CASE-2 9 12
CASE-3 10 11
CASE-4 11 18
CASE-5 12 18

Los dos últimos incluyen además una condición deliberada: su óptimo no puede deducirse simplemente dividiendo el trabajo total entre dos o buscando el camino crítico.

Necesitaba una fuente de verdad

No quería utilizar otro LLM para decidir si la respuesta de un LLM era correcta.

Así que la batería incluye un solver exacto.

El solver explora los estados posibles mediante programación dinámica y memoización: qué tareas han terminado, qué está ejecutando cada trabajador y cuánto tiempo le queda. Prueba las asignaciones legales, permite incluso tiempos de espera intencionados cuando pueden formar parte de la solución óptima y calcula el makespan mínimo.

Después existe una segunda validación independiente que comprueba que el calendario reconstruido contiene todas las tareas, respeta sus duraciones y dependencias, no introduce solapamientos y termina exactamente en el óptimo calculado.

Eso cambia bastante el experimento.

Ya no estamos comparando una respuesta de un modelo con nuestra impresión de que «parece correcta». Tenemos una referencia exacta.

Primera ronda: GPT-OSS 20B

La primera ronda se hizo con:

MODEL          gpt-oss-20b
REASONING      Low
CONTEXT        8192
GPU OFFLOAD    24 / 24

La regla era utilizar la primera ejecución comparable. Nada de repetir una pregunta hasta conseguir una respuesta buena.

Además del resultado final registré tokens, velocidad, stop reason, validez del calendario y validez de la demostración de optimalidad.

Utilicé tres veredictos:

El resultado agregado fue:

Caso Veredicto Tokens tok/s
CASE-1 PASS 2.325 209,04
CASE-2 PASS 4.653 208,84
CASE-3 FAIL 2.790 211,30
CASE-4 PARTIAL 2.170 212,01
CASE-5 PASS 6.025 207,34
PASS COMPLETOS          3 / 5
PARTIAL                 1 / 5
FAIL                    1 / 5

MAKESPAN CORRECTO       4 / 5
CALENDARIO FACTIBLE     5 / 5
PRUEBA DE OPTIMALIDAD   3 / 5

TOKENS TOTALES          17.963
VELOCIDAD MEDIA         ~209,7 tok/s
CONTEXT LIMIT           0 / 5

El caso que cambió la lectura del resultado

CASE-3 fue el más interesante.

GPT-OSS calculó correctamente que el trabajo total era de 32 horas y, por tanto, que con dos trabajadores existía un límite inferior de 16 horas.

También encontró correctamente un camino crítico de 16 horas.

Hasta ahí, bien.

Pero después concluyó que alcanzar ese límite era imposible y propuso como óptimo un calendario de 19 horas.

El problema es que sí existe un calendario válido de 16 horas:

TRABAJADOR 1
A    0–5
E    5–10
F   10–11
I   11–16

TRABAJADOR 2
D    0–2
B    2–5
C    5–8
G    8–12
J   12–15
H   15–16

El modelo había encontrado correctamente las piezas necesarias para demostrar que 16 horas era el mínimo posible, pero falló al decidir si ese mínimo podía alcanzarse.

No fue un problema de contexto: terminó normalmente y utilizó 2.790 tokens. Fue un fallo de razonamiento combinatorio.

Y después ocurrió algo todavía más incómodo

En CASE-4 ocurrió casi lo contrario.

GPT-OSS respondió 19 horas, que era el resultado correcto, y produjo un calendario válido.

Pero su demostración estaba mal.

Afirmó que la suma de duraciones era 38 horas cuando realmente era 34. A partir de ese error construyó un argumento incorrecto para justificar una respuesta que, casualmente, sí era correcta.

El resultado final era bueno.

El razonamiento que lo justificaba, no.

Resultado de la ronda

Los cinco casos dejaron tres mediciones distintas:

RESPUESTA CORRECTA

CALENDARIO VÁLIDO

DEMOSTRACIÓN CORRECTA

GPT-OSS produjo calendarios factibles en los cinco casos, acertó el makespan en cuatro y demostró correctamente la optimalidad en tres. Esos resultados explican los tres PASS, el PARTIAL de CASE-4 y el FAIL de CASE-3.

Por qué la paré

La batería estaba diseñada originalmente para repetir los cinco casos con Gemma 4 12B QAT y Qwen3 4B Thinking.

No lo hice.

Después de completar GPT-OSS, el experimento se había convertido en una secuencia bastante mecánica:

copiar prompt
→ ejecutar
→ esperar
→ copiar respuesta
→ copiar métricas
→ validar
→ registrar
→ repetir

Seguir manualmente con otras diez ejecuciones iba a producir más datos, pero cada vez menos aprendizaje nuevo.

Así que decidí pausar la batería.

No porque hubiera fallado ni porque hubiera dejado de ser útil. La pausé porque repetir más rondas manuales empezaba a aportar menos aprendizaje que resolver el siguiente problema: automatizar la ejecución sin perder una fuente de verdad independiente.

Siguiente paso

El generador, el solver y los casos se conservan.

La idea es recuperar la batería cuando tenga sentido automatizarla mediante agentes.

Entonces el proceso puede convertirse en algo parecido a:

AGENTE

carga / selecciona modelo

ejecuta batería

captura respuesta y métricas

valida con solver

compara con óptimo

genera informe

Ahí la parte humana vuelve a estar donde aporta más: diseñar la prueba, decidir qué merece medirse e interpretar el resultado.

Y la máquina se queda con la repetición.