En julio te enseñé aquí el gato feo: un gato dibujado a ciegas en código, un día de ahorro, con un modelo pequeño y sin bucle de corrección. Desde entonces llevo conmigo un término, «IA de gato feo», para los modelos que empeoran en silencio cuando se les raciona. Ahora quería saber cómo se dibuja sin contador. El mismo encargo, pero no a un modelo en la nube, sino a un modelo local en mi propio portátil: «Créame, por favor, una sola página HTML con un gato animado programado en JavaScript que camine por la página de izquierda a derecha y de derecha a izquierda».
Esto salió del primer intento:
Versión 1, sin retocar: el modelo local puso al gato boca arriba.
Las patas y la cola apuntan al aire, y el animal «camina» sobre el lomo. Aun así: nubes, hierba, flores, una cola que se mueve. Para un primer intento sin ninguna ayuda, estaba decente. Y ningún contador corría.
El portátil
El modelo que dibuja aquí está en mi disco duro como un archivo de 14 gigabytes. Un pequeño programa lo carga en la memoria gráfica y hace los cálculos. Un modelo de lenguaje se compone de parámetros, miles de millones de números surgidos durante el entrenamiento. Algunos fabricantes publican esos números – se llama «pesos abiertos» – y cualquiera puede descargarlos y ejecutarlos. En este caso es Qwen, de Alibaba, versión 3.8 con 27 000 millones de parámetros, comprimidos a unos 3 bits por número para que quepan en la memoria gráfica. Esa compresión se llama cuantización y cuesta algo de precisión, como un JPEG más comprimido.
El portátil no es un centro de datos, pero tampoco una máquina de oficina: una RTX 4090 en su versión para portátil con 16 gigabytes de memoria gráfica, más 64 gigabytes de RAM. El modelo corre entero ahí. Sin cuenta, sin cuota, sin datos que salgan de casa. Las herramientas que necesita son gratuitas: Ollama descarga y sirve el modelo, OpenCode lo convierte en un agente que lee y escribe archivos y ejecuta comandos. Así que el gato de arriba no está copiado de una ventana de chat. El propio modelo lo creó como archivo, como lo haría un compañero en la mesa de al lado.
El jefe de taller desde la nube
No lo monté yo solo. Claude, la IA en la nube con la que trabajo habitualmente, hizo inventario del hardware, comparó modelos y escribió la configuración – y después hizo lo que yo esperaba de ella: observó al modelo local mientras trabajaba. OpenCode guarda cada sesión en una base de datos, y la IA en la nube leyó de ahí cada llamada a herramienta y cada archivo que el modelo local había escrito, y me dijo qué había salido mal.
Fue bastante. El primer modelo, una variante de Qwen más pequeña y muy rápida, reescribió el archivo completo once veces en media hora, sin releerlo ni una sola vez y sin una sola prueba. Cuatro versiones tenían errores de sintaxis, dos se cortaban a mitad del código. Por el camino sobrescribió las dos versiones que servían, y cuando me quejé, se inventó explicaciones: la caché del navegador, «erratas al copiar y pegar». La IA en la nube recuperó las versiones perdidas de la base de datos de sesiones y escribió reglas de la casa para el modelo local en un archivo que OpenCode lee al arrancar (AGENTS.md, en la carpeta de trabajo): versión nueva, nombre nuevo; primero leer, luego cambiar una sola cosa; comprobar tras cada cambio. Además, un pequeño script de comprobación (check.js) que ejecuta el gato sin navegador y avisa de los errores.
La parte técnica también necesitó atención. Cuando la velocidad se desplomó, la IA en la nube encontró en los registros un proceso huérfano, resto de un reinicio que ella misma había lanzado. Retenía dos gigabytes y medio de memoria gráfica, y una parte del modelo corría en silencio desde la RAM. Una IA de pago en la nube ordenando el banco de trabajo a un modelo gratuito: esa es la parte de la historia que no quería dejar fuera.
De la versión 1 a la versión 13
El camino no fue recto. La versión 2 se mantenía erguida, pero flotaba sobre el suelo y caminaba hacia atrás en cuanto cambiaba de sentido. Después llegó el bucle: el modelo rápido no encontraba la línea del suelo e hizo 45 cambios en el mismo punto, volviendo al principio doce veces, hasta que lo interrumpí. Solo el cambio al modelo más grande trajo calma: pies en el suelo, un cambio. Giro, un cambio. Orejas y las jorobas del lomo, flores delante de la hierba, una colina más suave – una ronda cada uno, comprobada cada vez, con informe cada vez.
| Modelo | Velocidad | Comportamiento |
|---|---|---|
| Qwen 3.6, 35 000 millones de parámetros, 3 000 millones activos | 60 tokens/s | rápido, pero lo reescribe todo y da vueltas en círculo |
| Qwen 3.8, 27 000 millones de parámetros, 4 bits | 5 tokens/s | un cambio preciso por problema, demasiado lento para el trabajo real |
| Qwen 3.8, 27 000 millones de parámetros, 3 bits | 25 tokens/s | el mismo comportamiento a un ritmo utilizable |
Luego llegó el ejercicio libre. Un ciclo de día y noche con sol naciente, luna y estrellas: una ronda, ocho cambios, comprobado. De noche el gato debe caminar más despacio y descansar: la ronda siguiente. Que se parase en seco a toda velocidad costó dos rondas más: primero una rampa sencilla, luego, porque a mí aún me resultaba brusco, un perfil de arranque y frenado en curvas en S. Entre medias se llenó varias veces la ventana de contexto, la memoria de trabajo del modelo; OpenCode resumió el estado y lo dejó continuar. En esta web, eso es jugar en casa.
Versión 13, sin retocar: día y noche en dos minutos; de noche el gato va más despacio, hace pausas y frena para ellas.
Todavía no es una belleza. Pero camina sobre sus patas, se da la vuelta al llegar al borde, y cada versión intermedia está en la carpeta como archivo propio.
Ojos prestados
Con las capturas de pantalla, la IA en la nube se equivocó al principio: creía que el modelo local nunca había visto ninguna. Los registros dicen otra cosa. El modelo rápido las había recibido desde el primer momento, y no le sirvieron de nada. El modelo más grande, en cambio, al principio no las recibía: la cadena de herramientas lo tomaba por un modelo de solo texto y adjuntaba a cada imagen un mensaje de error, «no admite entrada de imágenes». Solo cuando Claude certificó en la configuración que el modelo acepta imágenes empezaron a llegar. Desde entonces, el bucle de julio también está cerrado en local: hago una captura, el modelo ve su obra y corrige. La colina más suave fue la primera ronda con imagen.
Lo que hoy puede hacer un portátil
Hace dos meses el gato tenía tres reguladores en contra: la clase de modelo, la profundidad de pensamiento, el número de intentos. En el portátil, el tercer regulador desaparece: los intentos solo cuestan tiempo. El primero tiene tope: el modelo no crecerá más que la memoria gráfica, pague lo que pague. Y el segundo muestra aquí una cara nueva: la profundidad de pensamiento solo ayuda si el modelo no pierde el hilo mientras piensa.
Porque, al final, la IA de gato feo no era el modelo. Era el taller que faltaba. Un modelo que nunca relee lo que ha escrito, nunca comprueba y sobrescribe versiones que funcionan produce gatos feos, por muy listo que sea. Con reglas de la casa y un script de comprobación, el mismo modelo dejó de destruir versiones que funcionaban y entregó su primera ronda limpia. Para el resto hizo falta el modelo más grande: uno que cambia la cosa correcta en cada ronda. Lo que faltaba era, a medias, inteligencia. La otra mitad era contexto.
En el portátil, el contexto tiene además un segundo significado, más estrecho: la ventana de contexto, la memoria de trabajo del modelo. El modelo podría abarcar 256 000 tokens, pero cada token en la ventana ocupa memoria gráfica, y esa escasea. Al principio la limité a 32 000; ahora son 48 000, todavía una fracción de lo que llevan consigo los grandes modelos en la nube. Para el gato basta: un archivo, una conversación. Para trabajos complejos – muchos archivos, sesiones largas – se llena enseguida. OpenCode resume entonces y sigue adelante, como en el ciclo de día y noche. Pero lo que el resumen deja fuera, para el modelo nunca ocurrió.
¿Qué falta todavía? La captura la hago yo, no el modelo; el bucle se cierra a mano, no por sí solo. Y lo que Claude hizo en esta historia – leer registros, encontrar causas, formular reglas – no se lo pedí a ningún modelo local. Si habrían podido hacerlo, no lo sé. Probablemente con más guía y una ventana de contexto en la que quepan todos esos registros.
Pero un modelo que sigue reglas, lee un archivo antes de cambiarlo, se comprueba a sí mismo y mejora una cosa por ronda: eso corre hoy en un portátil, sin suscripción y sin contador.
Y no tiene por qué quedarse en «o lo uno o lo otro». A través del Model Context Protocol, el puerto USB para las herramientas de IA, el modelo local puede conectarse a la IA en la nube como herramienta: la IA en la nube planifica y comprueba, el modelo local hace el trabajo de peón, sin contador, y el grueso de los datos se queda en el portátil. El jefe de taller tendría un aprendiz. Cómo funciona el protocolo está en MCP explicado. Ese es el siguiente experimento.
/compact – lo esencial cuando el contexto escasea:
Un modelo abierto en un portátil con 16 GB de memoria gráfica vuelve a dibujar el gato de julio, sin nube y sin contador. El modelo pequeño y rápido lo reescribía todo y daba vueltas en círculo; con reglas de la casa, un script de comprobación y un modelo más grande, aquello se convirtió en un cambio por ronda, hasta llegar al ciclo de día y noche. Una IA en la nube lo montó y lo observó. Las capturas ya llegan; solo que todavía tengo que hacerlas yo. Siguiente experimento: reparto de tareas vía MCP – la IA en la nube planifica, el modelo local trabaja.