Desde que leí a Andrej Karpathy hablar de Software 3.0, el concepto no se me ha ido de la cabeza. Y, por lo que veo en el mercado, creo que no está teniendo el impacto que merece. Al menos no desde mi punto de vista.
Karpathy distingue tres formas de “escribir software”:
Software 1.0 es el que llevamos haciendo toda la vida: código que escribimos las personas (y, ahora, también los modelos) en lenguajes de programación. Ese código se compila, baja a ensamblador, baja a ceros y unos y, al final, se convierte en impulsos eléctricos moviéndose por transistores. El compilador es el puente que nos permite expresarnos en algo legible y aún así terminar gobernando electrones.
Software 2.0 es el software que no escribimos nosotros: lo escribe el entrenamiento. Son modelos de machine learning cuya lógica interna desconocemos. Conocemos las matemáticas que producen las predicciones, pero no la causa de cada predicción concreta. El modelo ha encontrado correlaciones; la dificultad aparece cuando empezamos a confundir esas correlaciones con causalidad.
Software 3.0 es lo nuevo, y es lo que me vuela la cabeza: el “código” está escrito en lenguaje natural. Le decimos a un sistema, en español o en inglés, lo que queremos que haga, y el sistema responde como si nos entendiera.
El detalle que casi nadie comenta
Pongamos el ejemplo más simple del mundo:
“Si la factura es de más de 5.000 €, requiere autorización del jefe del departamento. Si es menor, autorízala directamente.”
Cuando esto lo escribíamos en Software 1.0, en algún punto del programa, en algún registro de la CPU, había una comparación literal: el valor importe_factura se enfrentaba al número 5000, y un conjunto de transistores —en última instancia, un movimiento de electrones— ejecutaba esa comparación. La semántica de “comparar dos números y decidir” estaba físicamente presente en la máquina.
Lo sorprendente del Software 3.0 es que cuando le das esa misma instrucción a un LLM esa comparación no ocurre en ningún sitio. No hay un registro con el número 5000. No hay una variable importe. El modelo simplemente está prediciendo el siguiente token. Y, aun así, casi siempre acierta. A veces se equivoca, a veces alucina, pero la mayoría de las veces decide bien qué hacer con la factura.
¿Dónde se produce la comparación? No lo sé. No entendemos la estructura interna de los LLM lo suficiente como para señalar el lugar donde “vive” esa decisión. Quizá alguien pueda explicármelo y me encantaría escucharlo, pero a día de hoy a mí me parece simplemente mágico.
Y entonces me acuerdo de nosotros
Lo más inquietante no es que un LLM lo haga. Es que a nosotros nos pasa lo mismo.
En nuestro cerebro tampoco hay una neurona que guarde el número 5.000. No hay una variable llamada “factura”. No hay un circuito dedicado a comparar importes. Y sin embargo, los humanos —con una tasa de acierto razonable— somos capaces de tomar exactamente ese tipo de decisiones todo el tiempo.
¿Dónde se rompe la abstracción? ¿En qué punto deja de existir el “número” y queda sólo química, electricidad, patrones? Quizá tenga que releer a Daniel Dennett y su De las bacterias a Bach para volver a hacerme las mismas preguntas.
Por qué esto importa para construir producto
Para mí esto no es filosofía de salón. Tiene consecuencias prácticas muy concretas para cualquiera que estemos construyendo software hoy:
Primero, si tu lógica de negocio se puede expresar como una regla en lenguaje natural, tienes que preguntarte muy en serio si merece la pena programarla en Software 1.0. A veces sí —por trazabilidad, auditoría, determinismo—. Pero muchas veces no.
Segundo, la frontera entre “código” y “datos” se ha movido. El prompt es código y datos a la vez. Versiónalo, revísalo, testéalo. Trátalo con el mismo respeto que tratabas a tu if-then-else, o incluso mas.
Y tercero —y esto es lo que más me interesa—, hay clases enteras de problemas que en Software 1.0 eran intratables (los que requieren juicio, contexto, ambigüedad) y que en Software 3.0 simplemente… funcionan. No siempre. No perfectamente. Pero funcionan lo suficiente como para cambiar lo que es construible.
La pregunta abierta
Sigo sin tener una respuesta a dónde “vive” el if dentro de un LLM. Y sospecho que la respuesta, cuando llegue, va a parecerse mucho a la respuesta de dónde vive el if dentro de mi cabeza.
Si alguien tiene una intuición mejor, me encantaría leerla.