
Proyecto IA Monterroso (XXI): modo pistas — esta vez es PINSAPA quien te hace dudar
El modo repaso (entrada anterior) le dio a PINSAPA su primera forma de preguntar en vez de solo responder. Tocaba una segunda forma de jugar, distinta de verdad, no una simple variación de la primera.
Antes de diseñar nada: mirar qué existe ya
Con la petición de “algo divertido, pero que sea una característica nueva de la IA” por delante, el primer paso no fue escribir código, fue buscar. El resultado de esa búsqueda descartó dos ideas antes de empezar:
- El clásico “20 preguntas con IA” (la IA adivina lo que piensas, o al revés) está muy trillado — hay hasta papers académicos (arXiv, ACL) usándolo como banco de pruebas de razonamiento para LLMs, y apps de móvil que lo implementan literalmente. Repetirlo no aporta nada que el modo repaso no tenga ya en esencia.
- “Dos verdades y una mentira” (el modelo inventa una afirmación falsa sobre un fragmento real) se descartó por riesgo: con un modelo de 3B parámetros es fácil que la “mentira” salga incoherente, o peor, que la “verdad” tenga un error sin querer. Demasiado peligro de enseñar algo mal por accidente.
Lo que no encontré por ningún lado fue la combinación concreta que sí tenía sentido para PINSAPA: un juego de pistas progresivas, apoyado en un fragmento real del corpus, sin guardar ningún estado nuevo en el servidor.
El diseño: la misma arquitectura del modo repaso, invertida
PINSAPA elige un fragmento real al azar — reutilizando fragmento_aleatorio, que ya existía desde el modo repaso, cero código nuevo ahí — y en vez de convertirlo en una pregunta directa, lo usa para ir dando pistas cada vez más concretas sobre un concepto de ese fragmento, sin decir nunca cuál es. El alumno intenta adivinarlo.
Sigue sin haber estado nuevo en el servidor. El truco es el mismo que en el modo repaso: el historial completo de la conversación viaja en cada petición, así que el modelo puede ver, dentro de su propio historial, cuántas pistas ya ha dado — no hace falta que el servidor lo recuerde por él.
# "Modo pistas": variante del modo repaso, pero al reves. En vez de que
# PINSAPA pregunte y el alumno responda, PINSAPA da pistas progresivas sobre
# un concepto real del corpus y el alumno intenta adivinarlo. Mismo principio
# de cero estado nuevo que el modo repaso: el modelo ve en su propio
# historial cuantas pistas ya ha dado, y las dos personalidades llevan ahora
# una instruccion fija sobre como dar la siguiente pista sin repetirse.
_PATRON_PETICION_PISTAS = re.compile(
r"(modo pistas|jug(?:ar|amos) a adivinar|dame una pista|adivina el concepto|"
r"quiero adivinar|dame pistas|juego de pistas)",
re.IGNORECASE,
)
def _intentar_pistas(pregunta, corpus):
if not _PATRON_PETICION_PISTAS.search(pregunta):
return None
fragmento = fragmento_aleatorio(corpus)
if fragmento is None:
return None
return (
"El alumno quiere jugar a adivinar un concepto por pistas. Aqui tienes "
f"un fragmento real de sus materiales (fuente: {fragmento['fuente']}):\n\n"
f"{fragmento['texto']}\n\n"
"Instrucciones: piensa en UN concepto concreto que aparezca en este "
"fragmento (no el tema general, algo concreto: un termino, una idea, "
"un componente). Da una unica pista sobre ese concepto, la mas vaga y "
"general que se te ocurra. No digas el concepto. No hagas mas de una "
"pista de golpe. Espera a que el alumno intente adivinar."
)
Y, otra vez, una sola frase fija añadida a las dos personalidades en vez de lógica nueva:
Si el alumno está jugando al modo pistas contigo, mira las pistas que ya le has dado en la conversación y, si no ha acertado, da UNA pista más, algo más concreta que la anterior, sin repetir literalmente pistas ya dadas ni decir el concepto todavía. Si acierta, confírmaselo y cita el fragmento real en el que te basabas.
Cómo se comprobó (esta vez con un poco más de rigor)
Antes de tocar nada: una batería de nueve frases que debían activar el modo y catorce que no (incluyendo las del modo repaso, para comprobar que los dos triggers no se disparan a la vez con la misma frase). Salió limpia a la segunda — la primera versión del patrón no reconocía “¿jugamos a adivinar?”, solo “jugar a adivinar” en infinitivo.
La diferencia con entradas anteriores: esta vez la integración se probó contra el main.py real importado directamente y contra el corpus de producción ya indexado (845 fragmentos reales de Computación y Robótica, no un corpus de prueba inventado). Se confirmó que _intentar_pistas devuelve un fragmento real con su fuente citada, que no se activa con preguntas normales ni con el trigger del modo repaso, que no revienta si se le pide con un corpus inexistente, y que _construir_system_prompt incorpora la instrucción correctamente con las dos personalidades.
Los cambios se aplicaron directamente sobre main.py en ROCKY y compilan sin errores ahí. rag.py no ha necesitado ningún cambio esta vez.
Un punto importante de honestidad
A diferencia de la entrada del modo repaso, esta vez toca decirlo con claridad: lo de arriba está comprobado con pruebas automáticas contra el código y el corpus reales, pero todavía no confirmado con uso real en ROCKY por José Luis. Falta ese paso, que es el que de verdad importa — es el mismo modelo de 3B parámetros el que tiene que ser capaz de dar pistas realmente progresivas (que la segunda sea más concreta que la primera, no una repetición) y no revelar el concepto por accidente en una pista demasiado directa. Eso no se puede comprobar sin jugarlo de verdad.
Instalación
Cambio en main.py (_intentar_pistas, su patrón de detección, y una frase añadida a cada personalidad). Sin dependencias nuevas, sin cambios en rag.py. Reiniciar la API para que cargue el código actualizado.
Cómo comprobarlo
Pedir “modo pistas” o “dame una pista” con el corpus de Computación y Robótica seleccionado, pedir dos o tres pistas seguidas y comprobar dos cosas: que cada pista es más concreta que la anterior sin repetirse, y que en ningún momento se le escapa el concepto antes de que el alumno lo diga. Al acertar, debería citar el fragmento real en el que se basaba.
Qué queda pendiente
Lo de siempre, no adelantado a propósito: si el modelo de 3B da pistas realmente progresivas o si tiende a repetirse o a soltar el concepto demasiado pronto, solo se sabrá con uso real. Tampoco hay todavía una forma de pedir “otro concepto distinto” sin cambiar de frase por completo, ni control de qué pasa si el alumno se rinde a mitad de partida. Se decide qué de esto hace falta según lo que se vea jugando, no antes.


Etiqueta:AIDARAC, arquitectura sin estado, corpus cyr1eso, ies monterroso, modo pistas, montesteam, PINSAPA, RAG



