Código generador con GPT-3

Con toda seguridad ha tenido ocasión de probar el chat GPT ya que ha sido noticia en todo el mundo por el salto espectacular que representa con respecto a los anteriores modelos. Sin duda es una herramienta muy poderosa y revolucionaria, tanto que el CEO de OpenAI (Sam Altman), la empresa detrás de las I.A de Chat GPT (GPT-3) y Dally-2 reconoce en una entrevista (primera parte y segunda parte) que antes de liberar cualquier modelo se piensan muy bien el impacto que va a tener, porque prefieren que esta tecnología se vaya “digiriendo” de forma escalonada por la sociedad. Sin duda ya llevan tiempo trabajando en GPT-4, aunque según sus palabras, no tendrá un aumento tan significativo en los parámetros de entrada como hacen creer algunas imágenes que corren por las redes.

Rumores desmentidos por Sam Altman

Como estoy escribiendo este artículo a 29 de enero de 2023 y todavía no está disponible ninguna versión más reciente de GPT, sólo puedo comentar mis impresiones sobre el GPT-3.

Consideraciones generales

Es necesario advertir que la intención de este artículo se focalizará especialmente en el uso del modelo de GPT3 para la generación de código.

Por otro lado si se da una vuelta por mi web, seguramente se habrá dado cuenta de que me gusta la programación y que tengo conocimiento, de modo que a la hora de utilizar la herramienta, estoy partiendo desde el punto de una persona acostumbrada a desarrollar programas y con una mente estructurada por esta tarea.

Las pruebas surgieron por la necesidad real de realizar una aplicación que pretendía ahorrarme trabajo a la hora de imputar las horas que dedico a cada cliente. La idea era crear un programa en Python (lenguaje que no domino) que cada vez que se ejecutara pasándole por parámetro el nombre de un cliente guardara la hora actual. La primera vez quye se ejecutara para un cliente concreto la fecha seria la hora de inicio y la segunda vez la hora seria la hora de finalización. Estos datos los tenía que guardar en un archivo con extensión .csv (por lo de usar entandares libres). Realmente es más complicado que eso, pero todavía era un programa que un programador “senior” de Python no tardaría más de una hora en hacer.

Dada la expectación que generó la salida de Copilot (un modelo GPT3 integrado en GIT que permite generar código a partir de los comentarios de código escritos en lenguaje natural) quise probar por mí mismo los usos y limitaciones que tienen este modelo (y dependiendo de los resultados empezar a reorientar mi carrera profesional XD)

Generación de pequeños programas enteros

Empecé por una versión sencilla del programa ya que yo no tenía mucha experiencia en Python y mucho menos con el uso del chat GPT. En estos casos (programas de unas 10 o 15 líneas) lo cierto es que funcionaban correctamente. Las funcionalidades que no hacía eran atribuibles a que no las había descrito y por tanto hubiera sido realmente “mágico” que el modelo las crease correctamente. Por ejemplo le decía que leyera un archivo con extensión .csv y añadiera una línea con el valor pasado por parámetro y la hora actual. El resultado fue un programa que hacía exactamente lo dicho, pero no comprobaba que existiera el archivo donde debía guardar los datos los datos, ni esperaba que el parámetro fuera pasado desde la línea de comando, sino que el código generado estaba encapsulado dentro de una sola función que esperaba un parámetro de entrada, pero ciertamente no le había especificado ninguna de las dos cosas, por tanto, “my fault”.

Describiendo las carencias que iba viendo en el código que generaba llegamos a un código que funcionaba correctamente pero no tenía implementadas todas las funcionalidades que necesitaba para mi propósito, por tanto subí la dificultad. Para poder automatizar los cálculos de tiempo, tenía que poner en la misma fila el nombre del cliente, la hora de inicio y la de final. Por tanto la aplicación, antes de añadir una nueva línea con la hora actual debía revisar que no hubiera ninguna línea comenzada y no terminada con el nombre de cliente que le estaba pasando por parámetro (una línea con el nombre del cliente y hora de inicio pero sin hora final). También quería una primera línea a modo de cabecera donde aparecieran el nombre de las columnas. Y aquí es cuando ya no logré tan buenos resultados.

Errores de todo tipo:

  • Sólo escribía la cabecera si tenía que crear el archivo, pero si debía modificar/sobreescribir, la cabecera ya no volvía a aparecer.
  • No siempre comprobaba que el archivo que debía escribirlo existiera previamente
  • Juntar diferentes formas de manipular los datos del archivo .csv incompatibles entre sí
  • Algunas veces dejaba parte del programa sin escribir.
  • Sobrescribía el archivo csv con la última línea en lugar de añadirla al contenido.
  • Se dejaba líneas en blanco en el archivo .csv que hacían que al leer el archivo, el programa pensara que el archivo tenía menos líneas de las que realmente tenía.

Sin embargo, sí que hay que reconocer que me sorprendieron gratamente:

  • Aunque no sea más que traducir el texto al inglés antes de aplicarlo al modelo y hacer el “viaje” a la inversa a la hora de muestra la respuesta, que me entendiera en mi lengua materna (catalán) me gustó.
  • Que los comentarios y nombres de las variables estaban en el mismo idioma en el que le estaba describiendo el programa (no en todas las iteraciones fue así). Teniendo en cuenta que para entrenar el modelo se utilizaron millones de líneas de programación y que en porcentaje abrumador estarían en ingles fue un hecho que me sorprendió muy gratamente.
  • La cantidad de comentarios que tenía el código
  • En la mayoría de casos el código estaba bien estructurado (declarando las constantes al principio, dividiendo el código en funciones con sentido, no repetía funcionalidad…)

Después de invertir bastante rato acabé descubriendo que no conseguía avanzar y que estaba tardando mucho más rato regenerando el resultado que me ofrecía la herramienta (algunas veces estaba tan mal que no dejaba ni que acabas de generarlo) del que hubiera tardado yo empezando de 0 y preguntando a StackOverflow las dudas. Además, buscando por internet alguna de las dudas de “nomenclatura” que tenía, vi que “los/as que saben” no lo harían como estaba tratando de hacerlo yo (con las instrucciones básicas de Python) sino que lo más óptimo era hacerlo aprovechando la potencia de la librería Pandas.

Debe reconocerse que aproveché la estructura propuesta, pero no creo que dejara más de 5-10 líneas sin tocar algo (contando declaraciones de variables e importes) . Y aquí es donde entendí que por alguien que prácticamente no haya tenido contacto con el lenguaje le puede dar un punto de salida ya que se puede observar la sintaxis que utiliza el lenguaje o incluso puede dar una idea de cómo estructurar el programa (orden, funciones etc).

Utilizarlo como experto

Como le comentaba anteriormente en la mayoría de iteraciones me generaba un código que dejaba líneas en blanco en el archivo CSV que escribía. Una vez descartado el modelo de GPT-3 para generar programas sencillos decidí continuar probándolo pero cambiando el planteamiento. Ya no pretendería que me generara todo el código del programa sino que lo utilizaría únicamente para resolver los problemas que tenía con el funcionamiento. Así pues le pregunté cómo podía resolver el problema con las líneas en blanco que aparecían en el archivo CSV.

Las respuestas que me dio a pesar de tener sentido no me sirvieron, ya que estaba muy acotada a lo que le había descrito (“porque puede que al escribir un archivo de texto Python me esté dejando dos líneas en blanco al final del archivo?”)

Respuestas a porqué aparecen líneas en blanco al escribir un fichero CSV

Como ve las respuestas a pesar de estar bien argumentadas se centran en el uso de la función “write” y de la función “print”. Aunque pedí que generas más respuestas para la pregunta, todas eran muy similares.

Finalmente, terminé buscando en StackOverflow y encontré una respuesta que decía que la clave era el parámetro “newline” en la instrucción que se utiliza para abrir el archivo en modo escritura. Bajo mi modesto punto de vista, es una solución/propuesta que debería haberme facilitado el GPT-3 dado que es una respuesta basada en la documentación oficial de Python y no se deriva de la complejidad de una funcionalidad concreta o de algo particular del programa. Además, en ninguno de los códigos que me había generado aparecía ese parámetro.

Utilizarlo para generar ejemplos concretos

Cuando empecé a desarrollar el programa utilizando la librería Pandas me añadí un grado de complejidad más, ya que ahora debería conocer el funcionamiento de las funciones y objetos de esta librería.

Al preguntarle porqué al utilizar la función “read_csv” se añadía una columna nueva al DataFrame o cómo comparar una posición concreta de un DataFrame con un null, me generó códigos básicos, pero muy útiles y de una forma bastante más rápida que buscando en Google.

Chat GPT intentando ayudarme a saber porqué me aparecían 2 lineas en blanco al final del fitxer .csv
Chat GPT explicandome las posibilidades que tengo de saber si una posición del DataFrame no tiene valor

Por tanto para este uso (lo de preguntar por cosas muuuuyyyy concretas) sí que es efectivo, pero para hacer este tipo de dudas debes tener un buen conocimiento de lo que necesitas (básicamente resuelto dudas de “sintaxis”).

Un ejemplo muy claro de que éste es el más adecuado (en cuanto a la generación de código) es el servicio de GitHub Copilot (basado también en GPT-3), el cual genera código partiendo de los comentarios que vas poniendo en tu programa. La mecánica es muy sencilla, escribes un comentario que describa una porción muy pequeña de código (un “bucle” un condicional o una función sencilla) y el servicio te propone un código que deberá cumplir con la funcionalidad descrita con el comentario.

Como Copilot puede proponerte el código que necesitas, en base al comentario de esa porción de codigo

También es capaz de proponerte el código inmediatamente siguiente al que estás escribiendo y de esta forma ahorrarte tiempo y posibles errores.

Como funciona la función de auto-completar de Copilot

Conclusiones

Aunque las pruebas se han basado en un solo programa, creo que dan una idea de las actuales limitaciones de este modelo en cuanto a la generación de código.

El modelo se ha entrenado con millones de líneas de código y esto le ha dado la capacidad de poder resolver correctamente cuestiones muy concretas, pero aunque es sorprendente que lo haga de forma bien estructurada, todavía falla a la hora de poner todas las piezas juntas.

Sólo el servicio de GitHub Copilot ya representa un gran avance y sin lugar a dudas GPT-3 es sorprendente, potentísimo y hay que aprovecharlo en todo lo que pueda solucionarnos, pero hay que ser realista y entender que sus posibilidades actuales están lejos que crear código funcional por sí mismo partiendo de una descripción detallada de la funcionalidad. En poco tiempo rebajará bastante la deuda técnica que se pueda tener en algunas tecnologías de forma que reduzca la diferencia entre una persona con mucha experiencia en un lenguaje concreto y otra con menos experiencia en ese mismo lenguaje. Es más, podría llegar el día en que, incluso las empresas menos abiertas, cuando busquen cubrir una vacante, relacionada con IT, dejen de exigir tantos años de experiencia en el lenguaje concreto y aprendan a valorar más la experiencia general 😉

Por todo esto, creo que hoy en día debe ser entendida como una muy buena ayuda, pero que está lejos de ser una solución que cubra la necesidad de desarrolladores.

Aunque no sea el caso de los modelos de OpenIA, os dejo un “meme” sobre cómo nos venden la I.A algunas empresas y lo que se esconde detrás 😉

Leave a comment

Your email address will not be published. Required fields are marked *