Las etapas anteriores miran lo que la aplicación hace. Esta mira de qué está hecha, y lo que aparece debajo no es agradable: tres cosas llevaban meses funcionando mal sin que nada fallara.
Empieza, como la anterior, por una petición del dueño del proyecto.
las coletillas míticas de perico apenas salen: tio del mazo, acumular fatiga, qué duro es este deporte, bravo eh bravo… podemos de alguna manera listarlas, taggearlas, usarlas como adiciones al texto
El dueño del proyectoParecía una tarea de producto. Resultó ser una auditoría.
Dos de las cuatro no son suyas
Lo primero fue contarlas en las 435.000 palabras del corpus. El resultado desmonta la premisa:
| expresión | veces |
|---|---|
| «tío del mazo» | 31 |
| «pájara» | 24 |
| «qué duro es este deporte» | 1 |
| «bravo» | 1 |
| «acumular fatiga» | 0 |
Y la única aparición de «qué duro es este deporte» tiene un detalle que lo explica todo: se la dicen a él.
…salen así como cruzadas debajo de tu imagen.
Qué duro es este deporte, Pedro. Ah, vale, vale…Es de Carlos de Andrés, su compañero de cabina durante décadas, y lo confirman El Debate y El Mundo. «Acumular fatiga» tampoco es una frase hecha suya: cero apariciones de la expresión fija.
Cuatro expresiones que nunca dijo, en el corazón del sistema
Buscando de dónde podían salir las coletillas, apareció esto en el prompt que clasificó todo el corpus:
…y términos que se ha inventado él y los aficionados repiten:
"déficit de oxígeno", "fuerza inusitada", "campos magnéticos",
"el hombre del mazo", "ataque de peseta", "asfalto botoso".Contadas contra su habla real: «déficit de oxígeno» 1 vez, «fuerza inusitada» 0, «ataque de peseta» 0, «asfalto botoso» 0. Las cuatro venían de un único mensaje de foro de 2007, escrito por un aficionado de memoria.
O sea: el prompt que decidía qué frases entraban en el corpus le decía al modelo que buscara expresiones que existen en el recuerdo de una persona y no en las grabaciones. Un razonamiento en círculo, y de los que no dan ningún síntoma.
Y una quinta, más fina: decía «el hombre del mazo». Él dice «el tío del mazo» en las 31 ocasiones. «Hombre» es como lo cuentan los aficionados; «tío» es como lo dice él.
De las 3.134 frases de la tabla, solo 3 entraron por culpa de los términos inventados. La tentación es dejarlo estar.
Se arregló igualmente, y por una razón que no tiene que ver con el daño hecho sino con el que queda por hacer: ese prompt se vuelve a ejecutar cada vez que el corpus crece. Un error que hoy cuesta tres frases costará treinta cuando el corpus se duplique.
La versión nueva lleva los tres términos que sobreviven al recuento —«el tío del mazo» 31, «campos magnéticos» 10, «pericopuerto» 79— con los números escritos dentro, para que el siguiente que pase pueda comprobarlos en vez de creerlos.
Una etiqueta que no clasificaba nada
El corpus está etiquetado con cinco recursos de estilo. Al mirar el reparto, uno desentona:
metaphor 580 (52,6 %)
tic 414 (37,5 %)
blunder 167 (15,1 %)
digression 145 (13,1 %)
proverb 135 (12,2 %)Una etiqueta que cubre más de la mitad de las frases no está clasificando: está agrupando lo que sobra. Y 366 la llevaban como única etiqueta: «Fiñón era un perro», «Una montaña de pro», «Las moscas me están comiendo». De metáfora, lo justo.
La causa estaba en el orden. Al agrupar los ejemplos para el prompt, cada frase cae bajo el primer recurso que case, y metaphor iba la última: se quedaba con todo lo que no encajó antes. Era el cajón de sastre por diseño, no por error del clasificador.
El problema es que el cajón tenía nombre propio de cara al modelo:
Comparaciones con el ciclismo, el campo, la comida o el cuerpo:
- Fiñón era un perro.
- Una montaña de pro.Se le estaba diciendo que «Fiñón era un perro» ilustra una comparación ciclista. Ahora el grupo se llama lo que es —«otras cosas que dices y suenan a ti»— y la descripción del estilo ya no promete que los ejemplos vengan ordenados por cinco recursos cuando el último es un saco.
El fichero que nadie sabía construir
Y entonces, al preguntarse cómo regenerar el núcleo, apareció lo gordo.
core-pool.json son las 1.103 frases de las que se sortean los ejemplos de cada petición. Es, junto al prompt, lo que más determina cómo suena la aplicación. Y buscando el script que lo genera:
grep -rn "core-pool" . → una sola línea, en config.pyNada lo produce. El fichero se añadió al repositorio en septiembre con la nota «las 1.103 frases que pasan los filtros de calidad», y el commit que lo introdujo no tocó ningún script de corpus. Se generó fuera del repositorio y solo se guardó el resultado.
Eso significa que si ese fichero se pierde, no se puede rehacer. Y también que nadie puede responder a «¿por qué está esta frase y no aquella?» leyendo código.
Se reconstruyó por ingeniería inversa, y la receta resultó ser simple:
de paraphrased.jsonl (3.095 frases)
· entre 4 y 18 palabras
· sin marcas de transcripción rota
· confianza distinta de «baja»
· con al menos una etiqueta
→ 1.103 frases, las mismas 1.103Los cuatro filtros dan exactamente el mismo conjunto. Y el orden del fichero resultó ser la puntuación de densidad de estilo con los pesos de entonces, que coloca las 1.103 en su sitio exacto, una a una.
El generador nuevo ordena con los pesos actuales, no con los de septiembre, así que el fichero que produce no es idéntico byte a byte al que había.
Es deliberado. El orden del pool no llega nunca al modelo, porque los ejemplos se sortean en cada petición. Congelar un peso que ya nadie usa, solo para que cuadren los bytes, sería fingir una reproducción en vez de hacerla. La comprobación correcta es el conjunto: 1.103 en común, 0 nuevas, 0 perdidas.
Listar, etiquetar… y descubrir que ya funcionaba
Con los cimientos revisados, quedaba la petición original. El camino fue: 346 candidatas sacadas del material ya etiquetado, descartando las que dependen de una carrera concreta; fuera las que llevan nombre propio o cifra; una página privada donde el dueño del proyecto corrigió mi clasificación leyendo las 304 restantes una a una. Resultado: 57 expresiones.
Y antes de construir nada para «usarlas de forma sutil», dos mediciones que cambiaron el plan:
el modelo ya ve 1,83 expresiones célebres por petición
peticiones sin ninguna 12 %
respuestas que usan una 3 de cada 16Ya las veía y ya las usaba. La propuesta que estaba a punto de construir —reservar huecos en el sorteo— habría movido 1,83 a 2. Un no-cambio, vendido como mejora.
Hay un detalle todavía mejor escondido en esos números. En la tanda anterior al arreglo de los arranques de la etapa 18 salían 8 de 16, el doble… pero casi siempre la misma, porque el modelo estaba enganchado a un arranque concreto. Al soltarlo bajaron a 3, menos veces y más variadas. La cifra empeoró y el resultado mejoró.
- Cuenta antes de creer. Dos de las cuatro coletillas que «todo el mundo sabe» que son suyas no lo son. Una es de su compañero de cabina.
- Un prompt que se cree a sí mismo. El clasificador buscaba expresiones que solo existían en el recuerdo de un aficionado, y las encontraba porque se las había enseñado.
- Una etiqueta que cubre la mitad no clasifica. Y si además puntúa, decide por ti sin que lo sepas.
- Dato sin código que lo genere es dato perdido. El fichero más influyente de la aplicación no era reproducible, y nadie lo había notado porque funcionaba.
- Mide antes de construir la mejora. La función que iba a escribir habría cambiado 1,83 por 2.
- Lo que se hace a mano, al repositorio. La lista de 57 es criterio humano: ninguna ejecución la recrea. Vive en el repositorio y el cargador la reaplica, porque la base de datos se vacía en cada recarga.