
XXV. La ficha de repaso: preguntas que escribe la IA, respuestas que no puede inventar
Antes de entrar en la novedad de hoy, una aclaración rápida: si has seguido este blog, verás que a partir de esta entrada el asistente firma como PINSAPIA y no como PINSAPA. Es el mismo proyecto, sin ningún cambio de fondo — solo un ajuste de nombre para que se lea el “IA” a la primera. Las entradas anteriores se quedan tal cual están escritas, como constancia de que el proyecto también evoluciona en cosas tan tontas como el nombre. Dedicaremos una entrada aparte a contar el porqué con más calma; hoy toca hablar de una función nueva.
La idea de partida
La propuesta original era sencilla de enunciar: que el profesor (o el propio alumno) pudiera pedirle a PINSAPIA algo como “hazme una ficha de 5 preguntas tipo test del tema 2 de Robótica, con soluciones”, y que la IA generara de golpe un documento imprimible con preguntas y su hoja de respuestas.
Técnicamente es tentador porque casi todas las piezas ya existían: el modo repaso y el modo pistas ya sabían sacar fragmentos reales de los apuntes sin repetirse gracias al progreso por dispositivo. Lo único que faltaba era encadenar varios de esos fragmentos de una vez y devolverlos en un formato para imprimir en vez de uno para conversar.
Por qué no se ha hecho como se propuso
Aquí es donde hay que pararse, porque justo en los días en que se estaba diseñando esta función se confirmó — con un caso real, no una sospecha — el límite más incómodo que tiene el modelo que corre en ROCKY (Llama 3.2 3B, sin GPU): puede citar bien una fuente de verdad y, en la misma frase, inventarse un dato concreto que no está en ningún sitio. El ejemplo fue este: al preguntarle qué es un algoritmo con la búsqueda en internet activada, citó correctamente el artículo de Wikipedia sobre el tema, pero añadió que Al-Khwarizmi “desarrolló métodos para resolver ecuaciones cúbicas” — cosa que no es cierta y que no estaba en el texto que tenía delante. No es un fallo del código: es un límite conocido de un modelo de este tamaño, y ninguna instrucción de prompt lo evita del todo (ya lo contamos con detalle en la entrada anterior).
Con ese dato fresco, generar una hoja de respuestas con IA para un examen o una ficha que un alumno se va a llevar a casa y va a estudiar solo, sin nadie corrigiendo en el momento, es justo el sitio donde ese fallo hace más daño. En un chat, un dato inventado se puede corregir en la siguiente frase. En una ficha impresa, el alumno se queda con lo que pone el papel.
Así que se cambió el diseño en un punto muy concreto, sin tocar la idea de fondo: la IA escribe la pregunta, pero nunca la respuesta. La “solución” de cada pregunta no la genera el modelo — es, literalmente, el fragmento real de los apuntes del que ha salido la pregunta, copiado tal cual. Es el mismo principio que ya rige todas las herramientas de PINSAPIA (la calculadora, el tiempo, la búsqueda en internet): un paso determinista en Python que decide el dato de verdad antes de que el modelo entre en juego, y el modelo se queda con la parte donde equivocarse no tiene consecuencias graves — redactar una pregunta sobre un texto que tiene delante.
Cómo elige los fragmentos
Para armar una ficha con sentido, la función tenía que combinar dos piezas que hasta ahora no se hablaban entre sí: la búsqueda por tema (la misma que usa el RAG para responder preguntas, basada en BM25) y el sistema de “no repetir fragmentos ya vistos” que ya usaban el modo repaso y el modo pistas.
Ahora sí se combinan: si se pide un tema concreto, primero se buscan fragmentos relacionados con ese tema que el dispositivo todavía no haya visto; si con eso no se llega al número de preguntas pedido (o no se pidió tema), se completa con fragmentos al azar, también no vistos, del mismo corpus. Si el tema pedido no encuentra nada relacionado, la ficha no falla ni finge que encontró algo: avisa con claridad de que no hay coincidencias específicas y usa fragmentos variados en su lugar. Cada fragmento usado en una ficha se marca como visto, igual que en el modo repaso, así que también cuenta para el indicador de progreso.
El PDF, sin añadir nada al servidor
Para poder imprimir o guardar la ficha en PDF no se ha añadido ninguna librería nueva, ni en el servidor ni en el navegador: se usa window.print() del propio navegador junto con una hoja de estilos que solo se aplica al imprimir. Es el mismo principio que ya se siguió con la voz: aprovechar lo que el navegador ya trae de serie antes de sumar una dependencia. En pantalla, la solución de cada pregunta aparece oculta bajo un “Ver solución” para no chafar la respuesta antes de tiempo; al imprimir o generar el PDF, todas las soluciones se abren automáticamente para que el documento final salga completo.
Por si alguien encadena varias fichas seguidas: como cada ficha hace varias llamadas al modelo (una por pregunta) y ROCKY no tiene GPU, esta función tiene un límite de uso algo más estricto que el resto (5 por minuto en vez de las 20 habituales), para no dejar el servidor colgado generando preguntas en cadena.
Cómo ha ido la primera prueba
Ya está probada en ROCKY con datos reales y funciona como se esperaba: genera fichas con y sin tema, avisa cuando el tema no encaja, y el PDF sale con preguntas y soluciones completas. Con una salvedad honesta que merece decirlo aquí y no solo guardarlo para dentro de casa: como los apuntes de origen todavía están en un estado bastante irregular en algunos puntos, las preguntas que salen de esos fragmentos concretos también salen un poco flojas. No es un fallo de la función — es un reflejo directo de lo que se le da de comer. La reorganización de apuntes prevista para primeros de septiembre debería mejorar esto sin tocar una línea de código.
Siguiente paso: seguir probando la ficha de repaso con más temas y grupos antes de darla por cerrada del todo, y decidir cuándo tiene sentido escribir la entrada que cuente con calma el cambio de nombre a PINSAPIA.




