Uno de los temas más promovidos por los Sacerdotes del Culto del Cargo, los gerentes de las empresas de tecnología, es la aplicación de IA a la Informática. Más específicamente, utilizar un Modelo Grande de Lenguaje (LLM) para programar computadores.
No es de extrañarse, considerando que los LLM fueron creados por personas de esta área.
Como un Uroboro, muchos predican que la IA reemplazará a los Informáticos, y dejará sin trabajo a muchos en esta área, de manera similar a otras disciplinas.
¡Por supuesto!, el futuro está en el Vibe Coding! una persona con escaso o nulo conocimiento de programación, puede crear programas dándole instrucciones a un LLM!
Vibe coding, la nueva tendencia. Aprovechar al máximo las capacidades de la IA para reemplazar las neuronas de los programadores. Delegar las tareas tediosas y complejas del desarrollo de software a un LLM. Programar computadores dejándose llevar por lo que nos entrega ChatGPT o similares, de manera similar a surfear una ola en la playa.
¿Reemplazará la IA a los programadores?
La situación no es tan diferente a otras disciplinas. Dado que este es un tema donde tengo mucha experiencia, puedo entregar información de primera mano para despejar dudas.
Lo primero y más importante es hacerse una pregunta muy similar a la formulada en mi artículo anterior:
En qué actividades de la programación de computadores, los LLM pueden reemplazar a los humanos de manera adecuada?
Por adecuada, me refiero a que el resultado entregado por un LLM sea tal que requiera un esfuerzo mínimo en controlar su calidad.
En otras palabras, que uno pueda confiar en la IA de manera similar a un humano experto en el tema.
Para responder a esto tenemos que entender qué es exactamente, programar.
En esencia, programar es concebir una secuencia lógica de pasos para resolver un problema de manejo de información y explicarlos de manera no ambigua a un computador.
Una persona que programa tiene que:
Entender y conceptualizar, de manera completa, la cadena de razonamiento que resuelve el problema. Esto a menudo es algo complejo.
Especificar lo anterior usando un lenguaje de programación. Éste, a diferencia de un lenguaje natural hablado por personas, es más conciso, no ambiguo y requiere un entrenamiento no trivial para usarlo de manera fluida.
Muchos ven un LLM como una alternativa atractiva para programar computadores. Si uno puede darle instrucciones sencillas a un computador usando lenguaje natural y el computador genera un software funcional, ¿para qué aprender a programar de la manera "tradicional"?
Las aparentes capacidades de los LLM en estas tareas, insinúan una revolución que cambiaría la Informática. Sin embargo, la gente cae a menudo en la falacia que para programar solo basta con aprender el lenguaje.
Lo cierto es que, lo más importante es la concepción de la solución, previa a su especificación: El diseño.
Al día de hoy, los LLM todavía son muy limitados para diseñar soluciones informáticas (el ítem 1 mencionado más arriba).
Pero, si es así, cómo lo hace un LLM para llegar a un resultado similar al de una persona experta?
A diferencia de un humano, un LLM opera de un modo drásticamente diferente. Recordemos que para crear un LLM hay que entrenarlo con múltiples textos de diferentes fuentes. El LLM no "aprende" de ellos como lo hacen las personas, sino simplemente registra las probabilidades de ocurrencia de cada palabra en diferentes posiciones de cada texto.
Al responder, un LLM no "piensa" realmente, sino genera estocásticamente el texto más probable que acompañe al prompt escrito por la persona. Si usamos lenguaje natural para decirle a un LLM: "Un elefante se balanceaba", este respondería: "sobre la tela de una araña". Esa sería su respuesta, ya que, de acuerdo a los múltiples textos con los que fue entrenado, esas palabras van a menudo juntas.
Cuando se trata de programación, la situación no es diferente.
En adición a textos en lenguaje natural, los LLM han sido entrenados con un sinnúmero de códigos fuente escritos por personas. Con esa información, el LLM es capaz de generar un programa de forma similar a como construiría una frase en lenguaje natural.
En un lenguaje de programación, luego del prompt: "Escribe un programa en Python que imprima Hola mundo", el LLM respondería con el texto print("Hola mundo")
. Esto es gracias a que hay muchísimos programas en internet que hacen algo similar, acompañados de un texto explicativo. El LLM los tiene registrados en su sistema y contribuyen probabilísticamente a sus respuestas.
En resumen, un LLM no programa como una persona, sino simplemente ha "aprendido" a "adivinar" qué secuencias de palabras de un lenguaje de programación son las más probables que acompañen a una pregunta de desarrollo de software.
No hay razonamiento de por medio, solo especulación probabilística.
En la práctica, si bien un LLM podría generar una solución al problema, también puede, con una probabilidad no negligible, entregar resultados erróneos, tanto conceptuales como gramaticales, por el simple hecho que no está razonando sobre el problema ni su solución.
Pero si a cada rato se ven videos donde un LLM resuelve rápidamente un problema que a un programador le puede tomar días...
Este tipo de contenido hay que analizarlo con cautela. Un escrutinio un poco más profundo revela que la mayoría de este tipo de publicaciones, se centra en problemas con las siguientes características:
Son problemas relativamente simples
Son problemas cuya solución ha sido publicada en múltiples ocasiones en Internet
Utilizan lenguajes de programación y librerías populares
La primera característica deriva de las limitaciones actuales en la información de contexto que los LLM pueden utilizar. La "memoria de trabajo" relativamente pequeña de los LLM hace que no puedan crear, todavía, soluciones relativamente complejas.
La segunda y tercera obedecen a la naturaleza intrínseca de los LLM como un modelo estadístico de una base de conocimientos. Dado que un LLM es entrenado con el código de muchas soluciones encontradas en Internet, es de esperarse que pueda resolver de mejor forma, problemas que se asemejen a los que haya "aprendido".
Consecuentemente, estos modelos no funcionan bien cuando el problema:
Es complejo, tiene muchos elementos no triviales interconectados entre sí
Difiere ligeramente de problemas existentes
Entonces los LLM son inútiles. Si es así, por qué tienen tanta publicidad?
No voy a discutir las implicaciones éticas en torno al marketing de productos o servicios.
Lo cierto es que los LLM tienen el potencial de facilitar la programación de computadores, pero aún tienen problemas muy importantes que restringen lo adecuado de sus respuestas.
Por sobre todo, las limitaciones mencionadas anteriormente son más evidentes mientras más generales sean las instrucciones dadas al LLM.
Esto quiere decir que la aplicabilidad de los LLM a la programación se ve fuertemente afectada por la calidad del prompt utilizado.
Un LLM funciona bastante bien traduciendo texto de un lenguaje a otro. Esto aplica tanto para lenguajes naturales como para lenguajes de programación.
Un LLM, usado correctamente, es razonablemente bueno para convertir una especificación en lenguaje natural, a su equivalente en un lenguaje de programación.
Mientras más preciso y detallado sea el prompt, mejores serán los resultados. Mientras más general y ambiguo, es más probable que un LLM entregue resultados de baja calidad.
En la práctica, para sacarle provecho a un LLM en programación, hay que concebir una secuencia lógica de pasos para resolver un problema de manejo de información y explicarlos de manera no ambigua a al LLM.
Un momento! Esa frase es la misma que se mencionó al inicio del artículo! No es aquella que explica lo que hace un programador?
Precisamente :)