- Durante el último año, al interactuar varias horas cada semana con modelos de lenguaje grandes, me ha impresionado de forma constante su capacidad para resolver tareas cada vez más difíciles
- Como resultado, mi velocidad para escribir código en proyectos de investigación y proyectos personales aumentó al menos un 50%
- La mayoría de las personas que hablan en línea sobre la utilidad de los LLM son demasiado optimistas o demasiado pesimistas
- Más que debatir sobre el futuro, quiero presentar 50 ejemplos de conversaciones del último año en los que usé LLM para mejorar mi capacidad de investigación y ayudarme con proyectos de programación
- Casos en los que uso LLM
- Construir una aplicación web completa con tecnologías que nunca había usado antes
- Aprender a usar distintos frameworks sin tener que probarlos por primera vez por mi cuenta
- Convertir decenas de programas a C o Rust para mejorar el rendimiento entre 10 y 100 veces
- Reducir grandes bases de código para simplificar muchísimo un proyecto
- Escribir el código de experimentos iniciales para casi todos mis artículos de investigación del último año
- Automatizar casi cualquier tarea monótona o script de un solo uso
- Reemplazar casi por completo las búsquedas web para configurar nuevos paquetes o proyectos
- Reemplazar alrededor del 50% de las búsquedas web para depurar mensajes de error
- Si intento categorizar esto, hay 2 tipos
- Ayuda para aprender: me permite hacer cosas que antes me habrían resultado difíciles
- Automatización de tareas aburridas: me permite enfocarme en lo que mejor hago y resolver problemas difíciles
- Lo más importante es que estos ejemplos muestran formas en las que realmente recibí ayuda al usar LLM
- No existen para demostrar capacidades impresionantes, sino que surgieron de mi necesidad real de sacar adelante trabajo real
Matices
- Una cosa que internet no maneja bien son los matices. No voy a afirmar que los LLM de hoy dominarán el mundo, ni voy a hablar de lo que los modelos futuros podrían hacer
- Solo voy a discutir si los modelos actuales me resultan útiles o no
- Puede que te preguntes por qué escribiría un texto para justificar que los modelos de lenguaje son útiles. Pero en la academia, en la ingeniería de software y en los medios, parece haber muchas personas que declaran abiertamente que los LLM no aportan nada, que son solo otro ciclo de hype y que en unos años desaparecerán sin dejar ningún impacto en el mundo
- Yo sostengo que están equivocados porque los LLM actuales ya son útiles
- Por otro lado, también hay personas que afirman que los modelos actuales pueden reemplazar a todos los programadores y que la gente ya no debería aprender a programar
- No estoy intentando refutar explícitamente esa postura
- Entiendo perfectamente que los LLM pueden tener muchos efectos dañinos. Me refiero a todo: desinformación, abuso, vigilancia, reemplazo de empleos, etc. Pronto planeo escribir un texto sobre mis ideas respecto a los efectos dañinos de los LLM. Pero esa es una cuestión separada de si los modelos de lenguaje pueden ser útiles o no
- Entiendo muy bien por qué alguien podría no querer usarlos: los LLM alucinan, repiten falsedades y pueden fallar por falta de robustez. Pero este texto no trata de eso
- Creo que, a pesar de esas fallas, los modelos pueden ser útiles
- La ética de entrenar estos modelos es cuestionable. Puedes pensar en que fueron entrenados con datos de personas sin su permiso, o en la gente mal pagada para entrenarlos explícitamente. Estoy de acuerdo en que eso es un problema
- Pero este texto no trata de eso
- Como ya he dicho varias veces, este texto solo va a hablar de si los modelos que existen hoy son útiles o no
Mi historia de fondo
- En general, no soy alguien que crea en las cosas fácilmente. Hace 10 años viví el hype cripto en la comunidad de seguridad, pero evité por completo escribir artículos sobre blockchain. Nunca he tenido Bitcoin. Soy escéptico ante cualquier afirmación
- Cuando alguien me dijo por primera vez que esta tecnología de IA sería muy útil y cambiaría de forma importante la manera en que trabajamos todos los días, mi reacción fue: "no lo creeré hasta verlo con mis propios ojos"
- Soy investigador de seguridad. Durante los últimos 10 años, parte de mi trabajo diario ha sido mostrar todas las formas en que los modelos de IA fallan de manera estrepitosa cuando se enfrentan a entornos para los que no fueron entrenados. He mostrado cómo pequeñas perturbaciones en la entrada de un modelo de machine learning pueden hacer que produzca resultados gravemente incorrectos, o cómo la mayoría de los modelos de machine learning memorizan ejemplos específicos del conjunto de entrenamiento y los repiten al usarlos. Entiendo perfectamente las limitaciones de estos sistemas
- Aun así, digo que los modelos de lenguaje grandes actuales han mejorado mi productividad más que cualquier otra cosa desde la creación de internet. Si hoy tuviera que elegir para una tarea de programación al azar entre tener acceso a internet o tener acceso a un modelo de lenguaje moderno, en más de la mitad de los casos elegiría el modelo de lenguaje
[ Cómo uso los LLM ]
Construir aplicaciones completas para mí
- El año pasado hice un quiz para probar qué tan bien GPT-4 podía predecir la capacidad de resolver unas cuantas tareas. Ese quiz fue bastante popular y registró más de diez millones de páginas vistas.
- Le pedí a GPT-4 que escribiera la mayor parte de la versión inicial de esta aplicación. Lo hice comenzando por pedir la estructura básica de la aplicación y luego, a través de una serie de preguntas, fui construyendo distintas funciones poco a poco
- Esta conversación llegó a un total de 30 mil palabras y usó a fondo las capacidades del modelo GPT-4 más reciente de ese momento
- [Omito los prompts y respuestas reales]
- En mi conversación con GPT-4 hice solicitudes de muchas maneras distintas
- Desde mensajes donde describía con palabras lo que quería y le pedía al modelo una implementación completa, hasta mensajes donde solicitaba cambios específicos (
"En vez de compararlo con el puntaje promedio, ¿puedes usar KDE para decirme el percentil?")
- También incluí mensajes con preguntas totalmente incompletas copiando y pegando mensajes de error (por ejemplo,
"Plotting: numpy.linalg.LinAlgError: singular matrix") o pidiendo respuestas simples de una sola vez ("¿Cómo agrego un iframe a una página en JavaScript con contenido cargado desde un string?")
- Por qué los modelos de lenguaje son efectivos
- Esta forma de trabajar funciona porque los modelos de lenguaje resuelven bien cosas que otras personas ya resolvieron antes
- El 99% de este quiz no era más que HTML básico con un backend de servidor web en Python que cualquier otra persona podría haber escrito
- Lo que hizo interesante este quiz y lo que le gustó a la gente no fue la tecnología detrás, sino el contenido del quiz. Y cuando automatizas todas las partes aburridas, crear el quiz se vuelve muy fácil
- Estoy seguro de que sin la ayuda de los modelos de lenguaje probablemente no habría hecho este quiz
- Porque no me interesaba dedicar tiempo a escribir una aplicación web completa desde cero
- ¡Y eso que esta es la historia de alguien que sí sabe programar!
- Creo que incluso los modelos actuales ya son suficientes para que la mayoría de las personas puedan hacer tareas significativas que antes jamás habrían podido resolver, simplemente pidiendo una solución
- Más adelante mostraré algunos otros casos en los que los modelos escribieron aplicaciones completas para mí, y cuando los publique dejaré claro que fueron creados con ayuda de modelos de lenguaje
Como tutor para nuevas tecnologías
- Antes intentaba mantenerme al día con cada framework nuevo, pero el tiempo que una persona puede dedicar es limitado.
- Por mi trabajo, paso la mayor parte del tiempo siguiendo los avances más recientes en investigación, no la evolución de los frameworks más nuevos de JavaScript.
- Cuando empiezo un proyecto nuevo fuera de mi área específica de investigación, por lo general hay dos opciones:
- la primera es usar lo que ya conozco,
- y la segunda es aprender una forma nueva, que normalmente es mejor.
- Aquí es donde los modelos de lenguaje ayudan. La mayoría de los frameworks o herramientas nuevos, como Docker, Flexbox o React, no son algo nuevo para otras personas. En todo el mundo debe haber entre decenas de miles y cientos de miles de personas que entienden estas cosas a fondo. Los modelos de lenguaje actuales también.
- En lugar de leer un tutorial estático diseñado para cierto tipo de lector y con un objetivo específico, puedes interactuar con un modelo de lenguaje y aprender lo que necesitas para resolver la tarea.
- A principios de este año, mientras construía un framework de evaluación de LLM, quería ejecutar código generado por LLM en un entorno restringido.
- Docker era la herramienta perfecta para eso, pero nunca lo había usado antes.
- Usar Docker no era el objetivo del proyecto, solo era una herramienta necesaria para alcanzar ese objetivo.
- Quería entender solo el 10% de Docker para tener la confianza de que lo estaba usando de forma segura y de la manera más básica posible.
- En los 90, probablemente habría tenido que comprar un libro sobre cómo usar Docker desde los principios básicos, leer los primeros capítulos y luego ir saltando hasta encontrar cómo hacer lo que quería.
- En los últimos 10 años eso mejoró a buscar tutoriales en línea sobre cómo usar Docker, seguirlos y luego buscar mensajes de error para ver si alguien más había tenido el mismo problema.
- Pero hoy en día, simplemente puedes pedirle a un modelo de lenguaje que te enseñe Docker.
- Después de configurarlo y ejecutarlo, me di cuenta de que había problemas de permisos al usarlo en Linux. Quise resolver eso y le pedí ayuda al modelo.
- Gracias a eso conocí Podman, y le pedí al modelo que reescribiera código específico de Docker en una versión equivalente para Podman.
- Y cuando quise averiguar cómo pasar la GPU del host a un contenedor de Docker, también se lo pedí.
Empezar proyectos nuevos
- Cuando era niño, mi primer lenguaje de programación fue Java. Me encantaba programar, pero realmente odiaba ver la pantalla vacía de un proyecto nuevo. ¡Especialmente en Java!
- Incluso compilar un programa Hello World era difícil: entender qué hacía
public static void main string args, dónde iban los paréntesis, qué letras iban en mayúscula otra vez, y por qué había llaves y corchetes por todos lados.
- Así que hice lo que haría cualquier niño: le pedí a mi papá que lo hiciera por mí.
- Incluso 20 años después, todavía odio empezar proyectos nuevos usando frameworks con los que no estoy familiarizado.
- Se pierde demasiado tiempo quitando boilerplate, y ni siquiera entiendo bien qué estoy haciendo.
- Por ejemplo, hace poco quise escribir código CUDA para medir el rendimiento en GPU de una búsqueda greedy ingenua y compararlo con la implementación eficiente y optimizada para CPU de otra persona.
- Pero no sé cómo escribir un programa en CUDA.
- Sé escribir en C, y entiendo cómo funcionan las GPU, cómo funcionan los kernels, el layout de memoria, etc.
- Pero no sé cómo escribir el código que realmente envía trabajo a la GPU.
- Así que le pedí al modelo que escribiera un primer borrador del programa CUDA.
- ¿Es perfecto? Claro que no. ¡Pero es un comienzo! Y eso es exactamente lo que quiero.
- Se puede ver que aquí hay mucho código incorrecto.
- En realidad, eso no importa en absoluto.
- Porque no estoy buscando una solución perfecta, sino un punto de partida.
- Si en el futuro los modelos mejoran, sería increíble.
- Pero incluso con lo que tenemos ahora, ya ayudan muchísimo.
- En un tema completamente aparte, también estoy usando un Raspberry Pi Pico W para otro proyecto personal en el que trabajo en casa.
- Era la primera vez que lo usaba.
- En particular, quería hacer tareas de networking.
- Claro, probablemente podría encontrar un buen tutorial en línea que explicara cómo hacer lo que quería.
- Pero si haces una búsqueda en internet últimamente, los primeros 5 resultados suelen ser pura granja de contenido basura con código defectuoso de 2008, actualizado solo por SEO y que de todos modos no funciona.
- Así que en vez de eso, le pedí a un modelo de lenguaje que me enseñara a hacer lo que quería.
- Ya había trabajado antes con microcontroladores, así que más o menos entiendo cómo funcionan.
- Pero nunca había trabajado con un Pico W.
- Solo necesitaba algo que me ayudara a arrancar con todas las dependencias, y el resto podía resolverlo yo.
- El primer programa de "hello world" que siempre escribo para un microcontrolador nuevo es hacer parpadear un LED.
- Eso te permite probar si puedes compilar y subir código al dispositivo, si todos los pines están configurados correctamente y, en general, si sabes lo básico de lo que estás haciendo.
- Así que simplemente puedes pedir un programa que haga parpadear el LED. (De nuevo, ¿esto existe en internet? Casi seguro que sí. Pero entonces tengo que ir a buscarlo yo mismo).
- Una vez que ejecuto ese código, ya sé qué hacer a partir de ahí.
- Sé cómo funciona Python (¡aunque no lo creas!).
- Así que una vez resuelta la parte especial de MicroPython, puedo seguir editando directamente desde ahí.
- Y cuando me topo con otro problema que requiere un tratamiento especial, simplemente le pido ayuda al modelo.
- Por ejemplo, aquí la siguiente cosa fue pedirle al modelo que escribiera un script para conectarse al WiFi.
- Y cuando vuelves a atorarte, por ejemplo porque necesitas conectarte a un servidor MQTT, solo le vuelves a pedir ayuda al modelo.
- Ahora hago esto constantemente. Incluso el ejemplo al inicio de esta sección no es hipotético.
- Estoy preguntando cómo usar Flexbox porque la nueva forma de aprender layout en HTML era usar
div en lugar de tablas.
Simplificar código
- Como investigador de seguridad, a menudo me toca recibir un repositorio nuevo con miles de líneas de un proyecto de investigación ajeno, y la situación consiste en averiguar cómo funciona para poder atacarlo.
- Si todo el mundo escribiera código limpio, eso no sería tan difícil, pero no vivimos en ese mundo.
- Los investigadores no tienen incentivos para publicar código limpio.
- Así que a menudo terminan enviando código basura que funciona. (Yo también lo hago).
- No tengo ejemplos de investigación que pueda compartir aquí, pero sí puedo compartir un ejemplo de un proyecto personal en el que estoy trabajando.
- Tengo una obsesión poco saludable con el juego de la vida de Conway.
- Hace poco estaba buscando una forma rápida de evaluar algunos patrones de vida en Python.
- Existe una excelente herramienta en C++ para hacer eso,
golly, pero no quería reescribir mi código de Python en C++.
golly tiene una herramienta de CLI que hace justo lo que quiero.
- Lo único que necesitaba era saber cómo invocarla correctamente.
- El primer paso para eso fue tomar código C++ que soporta como 50 opciones distintas de línea de comandos y hacer que realizara exactamente la única tarea que yo quería.
- Así que le aventé al LLM las 500 líneas completas de C++ y le pedí un archivo más corto que hiciera lo mismo.
- ¿Y qué pasó? Funcionó perfectamente.
- Después le pedí un wrapper en Python alrededor del código C++. Eso también funcionó bien.
- Esta es una de esas cosas tan tediosas que el propio autor jamás se habría puesto a hacer.
- Pero como ahora basta con pedirlo, terminé con algo 100 veces más rápido que el código original en Python.
- Hago este tipo de cosas bastante seguido. También tengo otro ejemplo que hace exactamente lo mismo en Python.
- Ninguna de estas tareas es difícil.
- Pero cada vez que lo hago así, ahorro una cantidad considerable de tiempo.
- Y creo que esa es una de las razones por las que los LLM son increíbles hoy en día.
- No es algo vistoso, y no te va a dar muchos puntos en internet decir "aquí van formas aburridas en que usé LLM para hacerme la vida más fácil", pero eso es lo que realmente está pasando.
Automatizar tareas monótonas
- Hay muchas tareas que no requieren pensar y son aburridas, pero igual hay que hacerlas.
- Una de las razones principales por las que uno pospone el trabajo es porque sabe que hacerlo va a ser molesto y doloroso.
- Los LLM reducen muchísimo ese dolor, y como sabes que solo tendrás que resolver las partes interesantes, se vuelve mucho más fácil empezar algo.
- Aquí voy a revisar problemas completamente cotidianos que resolví pidiéndoselo a un LLM.
- Por ejemplo, hace poco tuve que desensamblar un programa de Python escrito para Python 3.9.
- La mayoría de los desensambladores de Python solo funcionaban con versiones anteriores a Python 3.7 y no corrían sobre binarios de 3.9.
- Desensamblar no es una tarea realmente difícil. En gran parte consiste en no equivocarse mientras se reconstruye el flujo de control siguiendo los goto.
- En vez de pasar tiempo convirtiendo manualmente miles de op-codes para cientos de líneas de código, le pedí al LLM que lo hiciera por mí.
- ¡Y lo hizo realmente bien! Muchísimo, muchísimo mejor de lo que pensaba que era posible.
- Otro ejemplo es cuando hay que tomar datos no estructurados y darles formato en una estructura definida.
- Por ejemplo, mientras hacía un proyecto, necesitaba una lista de títulos de libros junto con los nombres de sus autores.
- Así que encontré los datos online en un formato no estructurado y le pedí al LLM que les diera formato.
- O recientemente, mientras escribía una publicación de blog sobre cómo logré romper cierta defensa, quería mostrar el diff completo del código que tuve que cambiar.
- Entonces pegué (1) el diff y (2) un ejemplo anterior sobre cómo convertir un diff a HTML, y le pedí al LLM que presentara este diff con el formato anterior.
- Otro ejemplo más: como parte de mi trabajo, a menudo necesito generar citas de recursos que uso con frecuencia.
- Google Scholar hace esto fácil para artículos, y basta con copiar y pegar la cita.
- Pero citar páginas web es un poco molesto.
- Últimamente le pido al LLM que genere la cita. (Para ser claro, ¡sí verifico que sea correcta!)
- Podría dar por lo menos 100 ejemplos más como estos. Pero creo que ya se entiende la idea.
- Entiendo perfectamente que este es el tipo de tareas que alguien podría ver y decir: "¿Eso es todo??"
- Pero vale la pena recordar que hace apenas 5 años estos modelos apenas podían hilar un párrafo coherente, no resolver un problema completo.
Convertir a todos los usuarios en "power users"
- Si alguna vez has visto a alguien mucho menos hábil que tú usar una herramienta, puede ser algo un poco doloroso.
- Puedes ver cómo pasa minutos, o a veces horas, en tareas que se podrían automatizar con el uso ingenioso de algún tipo de macro o aplicación en paralelo.
- Pero aprender los conjuros necesarios para hacer eso toma tiempo y es difícil.
- Por ejemplo, hace poco quise escribir un programa en Python para procesar la entrada de teclado de un teclado Apple Lisa.
- Encontré online a alguien que había escrito algo para hacer esto en C, y había muchas líneas como
#define KEYNAME key_code.
- Yo quería convertir eso en un diccionario de Python que mapeara códigos enteros a esas cadenas.
- Yo uso Emacs. Sé cómo resolver este problema en Emacs. No debería ser tan difícil. Esta es una captura principal que acabo de grabar y con la que pude lograr ese efecto:
C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ {
- Para mí eso es casi natural, pero para que se volviera natural pasé más de la mitad de mi vida familiarizándome lo suficiente con Emacs. Pero ahora, si el LLM está conectado al editor, ¿qué escribiría?
C-h C-h rewrite these #defines to a dictionary of {keycode: string, ...}
- ¡Y de repente el texto se reescribe ante mis ojos!
- En casos como este, creo que la utilidad potencial de los LLM es mayor para los no expertos que para los expertos.
- El modelo eleva el nivel de todos, y si antes no podían hacer algo en absoluto, de pronto pueden hacer mucho más.
Usarlo como referencia de API
- Un programador de verdad lee el manual de referencia cuando quiere saber cómo funciona una herramienta.
- Pero yo soy un programador flojo, así que solo quiero que me den la respuesta ya servida.
- Así que ahora se lo pregunto al modelo de lenguaje.
- Cuando muestro ejemplos como estos, algunas personas reaccionan a la defensiva y dicen: "¡El LLM no hizo nada que tú no pudieras hacer con las herramientas que ya tenías!"
- Y tienen razón.
- Pero no hay nada que puedas hacer con un motor de búsqueda que no puedas hacer con un libro físico, y no hay nada que puedas hacer con un libro físico que no puedas hacer leyendo el código fuente.
- Pero cada una de estas opciones, a su vez, es más fácil que la anterior.
- Y cuando algo se vuelve más fácil, lo haces con más frecuencia y de una forma cualitativamente distinta.
- Casos de uso, incluyendo prompts
- Pregunto "en Bash, ¿qué $ da todos los argumentos restantes?" y obtengo la respuesta. (¡Justo después viene otra pregunta: "¿y cómo se usa esto?"!)
- O cuando quiero saber cómo poner texto en rojo en LaTeX, ya no busco ni leo la documentación; simplemente se lo pregunto al modelo.
- Y hago lo mismo cuando quiero saber qué comando de LLDB corresponde a distintos comandos de GDB.
- O cuando quiero entender cómo funciona algún comando
find.
- O cómo usar
lpr.
- O cómo volver a enlazar comandos de LaTeX.
- De hecho, esta es una de las formas en que más uso los LLM.
- La única razón por la que no puedo encadenar miles de ejemplos más como estos es que tanto Emacs como el shell ya tienen herramientas integradas para consultar un LLM.
- Así que en el 90% de los casos, cuando quiero hacer una de estas cosas, ni siquiera necesito salir del editor.
Buscar cosas que son difíciles de encontrar
- Buscar contenido en internet antes era una habilidad difícil de aprender.
- ¿Qué palabras específicas quiero incluir en la consulta? ¿Deben estar en plural? ¿En singular? ¿En pasado?
- ¿Qué palabras quiero que no aparezcan en la página? ¿Quiero X AND Y, o X OR Y?
- Eso ya no es así.
- No recuerdo la última vez que escribí una consulta con OR en Google.
- Tampoco recuerdo la última vez que usé un signo menos (-) para eliminar un subconjunto de resultados.
- Hoy, en la mayoría de los casos, simplemente escribes lo que quieres encontrar y el motor de búsqueda lo encuentra.
- Sin embargo, los motores de búsqueda todavía no aceptan consultas 100% en lenguaje natural.
- Todavía se siente como jugar Reverse-Jeopardy, e intento usar las palabras clave que irían en la respuesta, no en la pregunta.
- Es una habilidad que casi todos aprendimos y ya olvidamos que aprendimos.
- Los modelos de lenguaje simplemente ya son mejores para algunas tareas sencillas hoy en día, y cada vez para más con el tiempo.
- Simplemente escribes algo como: "ok, entonces + corresponde a
add, pero ¿qué sería ~?" y te dicen que la respuesta es inv.
- Esto es algo muy difícil de buscar con un motor de búsqueda estándar.
- Sé que hay una forma de encontrar la respuesta.
- Probablemente podría escribir "python documentation metaclass
add" y luego buscar ~ en la página para obtenerla.
- Pero también funciona simplemente hacerle a un LLM la pregunta que tienes.
- Hacer esto solo ahorra unos cuantos segundos cada vez, pero cuando estás resolviendo una tarea de programación y ya estás tratando de manejar un millón de cosas al mismo tiempo, es sorprendente poder simplemente vaciar lo que tienes en la cabeza y obtener una respuesta coherente.
- Eso no significa que hoy sean perfectos para esto.
- Los modelos de lenguaje solo saben cosas cuando estas se han repetido con suficiente frecuencia en internet.
- Lo que significa "con suficiente frecuencia" depende del modelo, así que hay que gastar algunos ciclos mentales pensando si conviene preguntarle al modelo o a internet.
- Pero los modelos van a seguir mejorando.
- O bien, cada vez que ocurre algún fallo aleatorio, le voy a volcar al modelo lo que estoy viendo y le pido una explicación.
- Aquí, escribir "Remote wildcard transfer issue" es hacer exactamente eso.
- En un ejemplo completamente distinto, el año pasado, mientras escribía una entrada de blog, quería poner la primera letra de la primera palabra en grande y hacer que el resto del texto se ajustara alrededor.
- Eso se llama una letra capitular. Pero yo no lo sabía.
- Solo sabía el efecto que quería, así que le pregunté a un modelo de lenguaje algo como "quiero que se vea como un libro elegante donde el texto rodea una O", y me dio exactamente lo que quería.
- Esta tarea también entra en la categoría de "solo la hice gracias a un LLM".
- No habría pensado que valiera la pena invertir mucho tiempo en averiguar cómo hacerlo.
- Pero como podía preguntárselo al modelo, lo hice, y eso hizo que mi publicación se viera un poco mejor.
Resolver tareas de una sola vez
- Hay dos tipos de programas.
- Primero, están los programas que quiero hacer bien. Van a existir por un tiempo y tendré que darles mantenimiento durante años, así que la limpieza importa.
- Segundo, están los programas que van a existir durante 25 segundos. Ayudan a completar alguna tarea y luego se desechan de inmediato.
- En casos como estos, donde no me importa en absoluto la calidad del código y el programa es completamente independiente, ahora casi siempre los escribo usando LLMs.
- Advertencia: en la mayoría de estos casos también son cosas para las que uno diría "¿eso es todo?"
- Pero, como dije antes, el tiempo disponible en un día para invertir en un proyecto dado es limitado.
- Y si puedo ahorrar tiempo y energía mental escribiendo un programa que no voy a volver a usar jamás, entonces lo haré.
- El ejemplo más común probablemente sea ayudar a generar gráficas para visualizar datos producidos como resultado de algún experimento de investigación.
- Tengo decenas de ejemplos como este. Probablemente más cerca de 100 que de 0. Todos se ven básicamente iguales, así que aquí solo pongo uno.
- Otro ejemplo similar es cuando tienes datos en un formato y quieres convertirlos a otro formato.
- Por lo general esto solo hay que hacerlo una vez y, cuando termina, el script resultante se tira.
- Si el script que quiero es lo bastante simple, muchas veces le pido al LLM que escriba todo.
- Por ejemplo, aquí le pedí a un LLM que escribiera un script que leyera un artículo en voz alta para poder verificar que no tuviera errores gramaticales tontos.
- La mayoría de las veces, cuando no tengo muy claro lo que quiero, empiezo pidiéndole al modelo código inicial y luego itero a partir de ahí.
- Por ejemplo, aquí hay una tarea de una sola vez donde necesitaba procesar datos rápidamente.
- En 2022, habría dedicado dos minutos a escribir esto en Python y luego habría esperado horas a que corriera, porque solo se iba a ejecutar una vez.
- Optimizarlo habría tomado más tiempo que lo que tardaría en ejecutarse el programa en Python.
- ¿Pero ahora? Estoy bastante seguro de que dedicaría esos mismos dos minutos a pedir código en Rust que procese mis datos.
- O hay otro ejemplo en el que le pedí al modelo que descargara un conjunto de datos y realizara el procesamiento inicial.
- ¿Es fácil para mí hacerlo? Probablemente sí.
- Pero no es una tarea en la que quiera estar pensando.
- Quiero pensar en la investigación que voy a hacer con el conjunto de datos.
- Eliminar distracciones vale muchísimo más que los minutos que se ahorran.
- En otra ocasión, estaba escribiendo un programa para poder imprimir en 3D una imagen pixelada hecha de pequeños cubos.
- Para eso, quería convertir un PNG en un archivo STL, pero ese no era el punto del proyecto.
- Era simplemente algo que tenía que pasar en medio del proceso. Así que le pedí al LLM que lo resolviera.
- En otro ejemplo, recientemente quería configurar un proyecto nuevo usando Docker Compose.
- Estaban surgiendo problemas y, pasara lo que pasara, yo solo quería hacerlo funcionar; ya más adelante averiguaría qué estaba mal.
- Así que terminé haciendo varias idas y vueltas, copiando los mensajes de error uno por uno, hasta que finalmente obtuve una solución que funcionaba.
- También, en muchos casos, me doy cuenta de que empiezo pidiendo una solución completa y luego pido pistas sobre cómo modificarla.
- Aquí, en esta conversación, empecé pidiendo un programa que analizara HTML y luego, a partir de eso, pedí referencias de la API o sugerencias sobre cómo mejorarlo.
- En otra ocasión, quería rastrear cuánta memoria y CPU usaba la computadora con el paso del tiempo.
- Podría haber pasado unos minutos averiguando los comandos correctos y envolviéndolos en un script que hiciera lo que quería, pero simplemente le pedí al modelo de lenguaje que lo hiciera por mí.
- Hace poco estaba intentando construir un poco de electrónica y tenía un programa en C que corría en Arduino, pero quería ejecutarlo en un Raspberry Pi Pico con MicroPython.
- No hay nada interesante en ese proceso de conversión. Simplemente hay que completarlo.
- Así que, en lugar de hacerlo yo mismo, le pedí al modelo de lenguaje que lo hiciera por mí.
- Para otro proyecto, necesitaba clasificar algunas imágenes con algún modelo de ML elegante dentro de un bucle interactivo.
- Podría haberlo escrito yo mismo, pero también podía simplemente pedirle al modelo que lo hiciera por mí.
Que me explique algo
- Últimamente empecé a interesarme por la electrónica
- Cuando era niño manipulaba aparatos electrónicos y tomé algunas clases en la universidad
- Pero ahora que intento hacer proyectos reales, es difícil hacer algo por las miles de pequeñas cosas que no sé
- Podría leer un libro práctico de electrónica, y quizá así llegaría a entender bien el tema, pero no quiero pasar el tiempo como si estuviera estudiando
- La mitad de la razón por la que hago electrónica es para descansar de pasar todo el día leyendo y escribiendo artículos
- Lo bueno de los LLM aquí es que, aunque no sean tan eruditos como la persona más conocedora del mundo, hay miles o millones de personas que saben la respuesta a cualquier pregunta sobre electrónica que yo podría tener
- Así que probablemente el modelo de lenguaje también sepa la respuesta
- Y como está dispuesto a responder cualquier pregunta, puedo disfrutar la parte divertida que quiero sin pelearme con los detalles
- Y aunque si buscara en internet probablemente podría encontrar la respuesta con un poco más de esfuerzo, después de pasar todo el día trabajando con código de investigación complejo, la comodidad de solo pedírselo al modelo es muy reconfortante
- Así que aquí hay una colección de ejemplos de preguntas básicas que le hice a un modelo de lenguaje sobre cómo funciona la electrónica
- ¿Estas respuestas son perfectas? Quién sabe
- Pero ¿es mejor esto que no saber nada?
- (Este texto se está alargando bastante y, a estas alturas, probablemente ya esté tan cansado de escribirlo como de leerlo. Así que voy a dejar estos ejemplos sin más explicación.)
- Preguntas básicas sobre diseño de PCB
- Preguntas básicas sobre soldadura
- Preguntas básicas sobre capacitores
- Preguntas básicas sobre LED
- Preguntas básicas sobre disquetes
- Podría seguir, pero creo que ya se entendió la idea
Resolver tareas con soluciones ya conocidas
- Casi todo es algo que alguien ya hizo antes
- Casi nada de lo que uno quiere hacer es realmente nuevo
- Y los modelos de lenguaje son muy buenos para ofrecer soluciones a cosas que ya han visto antes
- En un proyecto reciente tuve que mejorar el rendimiento de algo de código Python
- (1) Le pedí a un LLM que lo reescribiera en C, y luego
- (2) le pedí que construyera una interfaz para poder llamar el código C desde Python
- Estas tareas no son “difíciles”
- Convertir de Python a C probablemente me habría tomado 1 o 2 horas
- Y aunque no sé exactamente cómo funciona la API de Python->C, podría averiguarlo leyendo la documentación
- Pero si tuviera que hacerlo yo mismo, nunca lo habría hecho
- Como no está en la ruta crítica, es mejor esperar y dejar que la computadora resuelva el trabajo que pasar tiempo acelerando cosas que no necesito ejecutar con frecuencia
- Pero en el caso de programas simples, convertir de Python a C es (en su mayor parte) un proceso técnico, y hay exactamente una convención estándar para llamadas Python->C
- Así que simplemente le pediré al LLM que lo haga por mí.
- Desde entonces he empezado a esperar que esto sea algo que puedo hacer y, básicamente, cada vez que necesito un fragmento de código rápido, simplemente describo en Python lo que quiero y pido C optimizado
- Otras veces hago lo mismo, pero pido Rust en vez de C si creo que me será más fácil juzgar la corrección de la salida de Rust comparada con la de C
- Otro ejemplo: paralelizar una función de Python usando una librería de multiprocessing no es difícil
- Hay que escribir un poco de código boilerplate y básicamente simplemente sucede
- Pero escribir ese código es algo molesto y estorba a la tarea que de verdad quiero hacer
- Ahora, cada vez que necesito eso, simplemente le pido al LLM que lo haga por mí
- O también, cuando estoy probando alguna API, muchas veces primero escribo una solicitud
curl para hacer que algo funcione al menos al inicio
- Y una vez que eso ya funciona y quiero repetir la tarea de forma programática, lo convierto a Python
- Antes normalmente hacía algo realmente feo y simplemente llamaba a
os.popen() para ejecutar el comando curl, y eso no está bien
- Sería mejor convertirlo a la librería Python requests. Pero como eso toma tiempo, no lo haría
- Pero ahora simplemente le pido al LLM que lo haga por mí y obtengo un programa más limpio más rápido
- O, para un proyecto futuro del que probablemente hablaré aquí, necesitaba saber qué tipo de cosas usa la gente con transmisores inalámbricos simples
- ¡Como lo que realmente quiero es la respuesta del humano promedio, un LLM es la opción perfecta!
Corregir errores comunes
- Antes de 2022, si aparecía un mensaje de error en alguna herramienta o librería conocida, seguía un protocolo como este:
- Copiar el mensaje de error
- Pegarlo en Google
- Hacer clic en el primer enlace de Stack Overflow
- Verificar si la pregunta es la que yo quiero hacer; si no, volver al paso 2
- Aplicar la solución principal al trabajo
- Si no funciona, volver al paso 2, cambiar los términos de búsqueda, rezar, etc.
- Si soy sincero, normalmente la herramienta que falla está, en última instancia, a unas cinco capas de distancia de la tarea que realmente quiero resolver, y en realidad no me importa cómo funciona; solo necesito que funcione
- ¿Y cómo es en 2024?
- Copiar el mensaje de error
- Preguntarle al LLM: “¿Cómo arreglo este error? [error]”
- Aplicar la solución paso a paso que sugiera el LLM
- Si no funciona, decirle: “No funcionó”
- No tengo copias para mostrar como ejemplo de esto. (O al menos no pude encontrarlas aunque busqué durante una hora). Pero en realidad hay una buena razón para eso: ya lo integré directamente a mi flujo de trabajo
- Soy usuario de Emacs
- Tengo configurado mi entorno para que, cada vez que ejecuto un programa y termina con un código de estado distinto de 0 (es decir, que ocurrió un problema), automáticamente invoque al último y más rápido LLM disponible para pedirle que explique la respuesta y, al mismo tiempo, que solicite un parche que yo pueda aplicar directamente para corregir el bug del código
- Los modelos actuales todavía no son lo suficientemente buenos como para superar al autor en esta tarea en la mayoría de los casos, pero se están acercando cada vez más
- Y de vez en cuando, cuando el LLM corrige un bug que sé que habría sido una pesadilla rastrear porque había un typo en alguna parte, uno se lleva una grata sorpresa
Resumen
- Todas las conversaciones enlazadas arriba representan menos del 2% de todas las conversaciones que tuve con LLM durante el último año
- La razón por la que no enlacé las demás no es que sean casos donde el modelo falló (aunque, por supuesto, hay muchos de esos)
- sino porque (1) repiten los mismos patrones que las conversaciones ya enlazadas, o
- (2) no es fácil explicar qué está pasando ni ver directamente por qué es útil
- Espero seguir aumentando mi uso de estos modelos en el futuro
- Como referencia, en 2024 hice 30% más consultas a LLM mediante interfaces web que en 2023, y no puedo cuantificar el aumento en las consultas por API, pero creo que fue al menos de 2 o 3 veces
Evaluar no lo que los LLM no pueden hacer, sino lo que sí pueden hacer
- Al evaluar a un candidato en una entrevista, hay que fijarse en lo que puede hacer, más que en lo que no puede hacer
- Si se le hacen preguntas triviales a un LLM, puede parecer incompetente. Por ejemplo, si se le pregunta en chino, que usan mil millones de personas, podría tener dificultades para responder correctamente
- Incluso dentro de la informática hay muchas áreas que desconozco, como saber apenas algo como la sentencia
SELECT de SQL
- Me cuesta entender que en línea se afirme que los LLM están sobrevalorados solo porque no pueden realizar cierta tarea
- No pueden contar la cantidad de palabras en una oración
- No pueden escribir un poema en el que todas las palabras empiecen con "a"
- No pueden multiplicar números de dos dígitos
- No pueden elegir un elemento aleatorio de una lista
- Sin embargo, me pregunto si alguien realmente ha pensado que un LLM es la herramienta adecuada para hacer ese tipo de cosas
- Así como no decimos que los humanos son inútiles porque no pueden dividir enteros de 64 bits mentalmente, tampoco es razonable descartar a los LLM solo porque se construyó un problema que no pueden resolver
- Lo importante es si existen tareas en las que los LLM puedan aportar valor
- Los programadores ya saben bien que distintos lenguajes son útiles según el objetivo
- Para escribir un sistema operativo, C es más adecuado que Python
- No decimos que Python no sirve porque no puede alinear variables en límites de 32 bytes. Simplemente tiene un nivel de abstracción distinto
- Con los LLM pasa lo mismo: operan en un nivel de abstracción muy alto
- Es difícil esperar que un LLM resuelva tareas que incluso pueden resolverse con un programa simple
- Pero sí puede esperarse que resuelva otro tipo de tareas
Conclusión
- Dos motivaciones para escribir este texto
- Defender que los LLM ya me aportan mucho valor en lo personal
- Mostrar ejemplos de uso a quienes creen que la idea de los LLM es buena, pero no saben cómo podrían ayudarles
- El valor de los LLM
- Los LLM no pueden hacerlo todo, pero incluso los modelos actuales ya ofrecen un valor considerable
- Por ejemplo, pueden diagnosticar errores de CUDA y explicar cómo reinstalar paquetes, reescribir un programa en C o enseñar sobre un tema específico
- Son cosas que un estudiante universitario podría hacer tras unas horas de esfuerzo, pero no existe un estudiante universitario disponible para responder preguntas en cualquier momento. Un LLM sí puede hacerlo
- El avance de los LLM y la situación actual
- Hace apenas 5 años, lo mejor que podían hacer los LLM era redactar párrafos plausibles en inglés y no tenían ninguna utilidad práctica
- Pero hoy los LLM aumentan la productividad en tareas de programación al menos en un 50% y eliminan trabajo tedioso
- Gracias a los LLM, terminé varios proyectos que de otro modo ni siquiera habría intentado
- Respuesta a la idea de que los LLM no son útiles
- Estoy en desacuerdo con la afirmación de que "los LLM están sobrevalorados y no tienen valor real"
- En lo personal, los LLM me aportan un gran valor
- Incluso yo, con 20 años de experiencia programando, he mejorado mucho mi productividad gracias a los LLM
- Creo que además de mí hay muchas otras personas que podrían beneficiarse de los LLM
- Perspectiva a futuro
- Incluso los modelos actuales ya ofrecen mucho valor
- Siento una mezcla de expectativa y temor sobre cómo evolucionarán los LLM en los próximos 5 años
- Tengo previsto abordar mis predicciones sobre esto en el próximo texto
7 comentarios
Es un texto con el que me identifico. El autor lo aprovecha tan bien que hasta cansa leerlo..;
> La única razón por la que no puedo enlazar miles de ejemplos más como este es porque tanto Emacs como el shell tienen herramientas integradas para consultar a un LLM
Yo tampoco parece que salga de la ventana de la terminal. Me da la impresión de que todos los desarrolladores flojos lo usamos así.
Si es un problema simple, uso
copilot.vim, abro cualquier buffer y voy guiando la respuesta con el autocompletado.Si no me acuerdo de un comando de shell, está el comando
??decopilot-cli, así que ya no hace falta buscarlo.Las herramientas de autocompletado de código entienden mi intención y generan código incluso antes de que yo lo pregunte.
Tal como dice el texto, aunque sepa cómo debería buscar algo, me gusta más el LLM porque puedo preguntarle libremente sin tener que ser formal.
Yo también uso copilot-vim. Quisiera preguntarte a cuál
copilot-clite refieres.https://www.npmjs.com/package/@githubnext/github-copilot-cli
¡Es este!
https://docs.github.com/ko/copilot/…
También existe una versión de extensión de GitHub CLI, pero la forma de usarla es un poco diferente.
Está bueno poder recibir ayuda de Copilot incluso desde la línea de comandos, ¡gracias!
Cuando sé cómo hacerlo pero me da flojera teclear, se lo encargo a ChatGPT.
Creo que para aprovecharlo bien hay que saber revisar el resultado.
El autor enfatiza que los usos más valiosos de los LLM son 1. ayuda para aprender y 2. automatizar tareas aburridas.
Últimamente, para mí también ha sido exactamente así. Pensando en las cosas que he hecho recientemente:
Por supuesto, son cosas que también se pueden hacer sin un LLM, pero simplemente es más rápido pedírselo, así que es perfecto como herramienta de life hacking.
Hay muchas cosas con las que me identifico.
Se parece a lo que yo siento al usar la IA.