Generant codi amb GPT-3

Amb tota seguretat heu tingut ocasió de provar el chat GPT ja que ha sigut noticia arreu del món pel salt espectacular que representa respecte als anteriors models. Sense dubte és una eina molt poderosa i revolucionària, tant, que el CEO de OpenAI (Sam Altman), l’empresa darrera de les I.A de Chat GPT (GPT-3) i Dally-2 reconeix en una entrevista (primera part i segona part) que abans d’alliberar qualsevol model es pensen molt bé l’impacte que tindrà, perquè prefereixen que aquesta tecnologia es vagi “paint” de forma esglaonada per la societat. Sense dubte ja fa temps que estan treballant en GPT-4 tot i que segons les seves paraules no tindrà un augment tan significatiu en els paràmetres d’entrada com fan creure algunes imatges que corren per les xarxes.

Rumors desmentits per Sam Altman

Com estic escrivint aquest article a 29 de gener de 2023 i encara no està disponible cap versió més recent de GPT, només puc comentar les meves impressions sobre el GPT-3.

Consideracions generals

Cal advertir que la intenció d’aquest article es focalitzarà especialment en l’us del model de GPT3 per la generació de codi.

Per altra banda si us doneu una volta per la meva web, segurament us haureu adonat que m’agrada la programació i que en tinc coneixement, de manera que a l’hora d’utilitzar l’eina, estic partint des del punt d’una persona acostumada a desenvolupar programes i amb un ment estructurada per aquesta tasca.

Les proves van sorgir per la necessitat real de fer una aplicació que pretenia estalviar-me feina a l’hora d’imputar les hores que dedico a cada client. La idea era crear un programa en Python (llenguatge que no domino) que cada vegada que s’executés passant-li per paràmetre el nom d’un client, guardes l’hora actual de manera que la primera vegada que l’executes per un client concret guardés l’hora d’inici i la segona vegada guardés l’hora de finalització. Aquestes dades les havia de guardar en un fitxer amb extensió .csv (per fer servir estàndards lliures). Realment es un pel més complicat que això, però encara era un programa que un programador “senior” de Python no tardaria més d’una hora en fer.

Donada l’expectació que va generar la sortida de Copilot (un model GPT3 integrat en GIT que permet generar codi a partir dels comentaris del codi escrits en llenguatge natural) vaig voler provar per mi mateix els usos i limitacions que tenen aquests model (i depenent dels resultats començar a reorientar la meva carrera professional XD)

Generació de petits programes sencers

Vaig començar per una versió senzilla del programa ja que jo no tenia gaire experiència en Python i encara menys amb l’ús del xat GPT. En aquest casos (programes d’unes 10 o 15 línies) la veritat és que funcionaven correctament. Les funcionalitats que no feia eren atribuïbles a que no les havia descrit i per tant hagués sigut realment “màgic” que el model les crees correctament. Per exemple li deia que llegís un fitxer amb extensió .csv i afegís una línia amb el valor passat per paràmetre i l’hora actual. El resultat va ser un programa que feia exactament el que havia dit, però no comprovava que existís el fitxer on havia de llegir les dades, ni esperava que el paràmetre fos passat des de la línia de comandes, sinó que el codi generat estava encapsulat dins d’una sola funció que esperava un paràmetre d’entrada, però certament no li havia especificat cap de les dues coses, per tan, “my fault”.

Descrivint les carències que anava veient en el codi que generava vàrem arribar a un codi que funcionava correctament però no tenia implementades totes les funcionalitats que necessitava pel meu propòsit, per tant vaig pujar la dificultat. Per poder automatitzar els càlculs de temps tenia que posar en la mateixa fila el nom del client, la hora d’inici i la de final. Per tant l’aplicació, abans d’afegir una nova línia amb l’hora actual havia de revisar que no hi hagues cap línia començada i no acabada pel nom de client que li estava passant per paràmetre (seria una línia amb el nom del client i l’hora d’inici, però sense hora final). També volia una primera línia a mode de capçalera on apareguessin el nom de les columnes. I aquí és quan ja no vaig aconseguir tan bons resultats.

Errors de tots tipus:

  • Només escrivia la capçalera si havia de crear el fitxer, però si l’havia de modificar/sobreescriure la capçalera ja no tornava a aparèixer.
  • No sempre comprovava que el fitxer que l’havia d’escriure existís prèviament
  • Ajuntar diferents maneres de manipular les dades del fitxer .csv incompatibles entre si
  • Alguns cops deixava una part del programa sense escriure.
  • Sobreescrivia el fitxer csv amb la última línia en comptes d’afegir-la al contingut.
  • Es deixava línies en blanc en el fitxer .csv que feien que al llegir el fitxer, el programa es pensés que el fitxer tenia menys línies de les que realment tenia.

Tot i això, sí que s’ha de reconèixer que em van sorprendre gratament:

  • Tot i no ser més que traduir el text a l’anglès abans d’aplicar-lo al model i fer el “viatge” a l’inversa a l’hora de mostra la resposta, que m’entengués en la meva llengua materna (català) em va agradar.
  • Que els comentaris i els noms de les variables estaven en el mateix idioma en el qual li estava descrivint el programa (no en totes les iteracions va ser així). Tenint en compte que per entrenar el model es van fer servir milions de línies de programació i que en percentatge aclaparador estarien en angles va ser un fet que em va sorprendre molt gratament.
  • La quantitat de comentaris que tenia el codi
  • En la majoria de casos el codi estava ben estructurat (declarant les constants al principi, dividint el codi en funcions amb sentit, no repetia funcionalitat…)

Després d’invertir-hi força estona vaig acabar descobrint que no aconseguia avançar i que estava tardant força més estona regenerant el resultat que m’oferia l’eina (alguns cops estava tan malament que no deixava ni que acabes de generar-lo) del que hagués tardat jo començant de 0 i preguntant a StackOverflow els dubtes. A més a més, buscant per internet algun dels dubtes de “nomenclatura” que tenia vaig veure que “els que saben” no ho farien com estava tractant de fer-ho jo (amb les instruccions bàsiques de Python) sinó que el més optim era fer-ho aprofitant la potència de la llibreria Pandas.

S’ha de reconèixer que vaig aprofitar l’estructura proposada, però no crec que deixes més de 5-10 línies sense tocar alguna cosa (contant declaracions de variables e imports). I aquí és on vaig entendre que per algú que pràcticament no hagi tingut contacte amb el llenguatge li pot donar un punt de sortida ja que es pot observar la sintaxi que utilitza el llenguatge o inclús pot donar una idea de com estructurar el programa (ordre, funcions etc).

Utilitzar-lo com a expert

Com us comentava anteriorment en la majoria d’iteracions em generava un codi que deixava línies en blanc en el fitxer CSV que escrivia. Un cop descartat el model de GPT-3 per generar programes senzills vaig decidir continuar provant-lo però canviant el plantejament. Ja no pretendria que em generes tot el codi del programa sinó que el faria servir únicament per resoldre els problemes que tenia amb el funcionament. Així doncs li vaig preguntar com podia resoldre el problema amb les línies en blanc que apareixien en el fitxer CSV.

Les respostes que em va donar, tot i tenir sentit, no em van servir, ja que estava molt acotada al que li havia descrit (“perquè pot ser que en escriure un fitxer de text en Python m’estigui deixant dues línies en blanc al final del fitxer?”)

Respostes a perquè apareixien línies en blanc a l’escriure un fitxer CSV

Com veieu les respostes tot i estar ben argumentades es centren en l’ús de la funció “write” i de la funció “print”. Encara que li demanes que generes més respostes per la pregunta, totes eren molt similars.

Finalment, vaig acabar buscant a StackOverflow i vaig trobar una resposta que deia que la clau era el paràmetre “newline” en la instrucció que es fa servir per obrir el fitxer en mode escriptura. Sota el meu modest punt de vista, és una solució/proposta que hauria d’haver-me facilitat el GPT-3 donat que és una resposta basada en la documentació oficial de Python i no es derivat de la complexitat d’una funcionalitat concreta o de quelcom particular del programa. A més a més, en cap dels codis que m’havia generat apareixia aquest paràmetre.

Utilitzar-lo per generar exemples concrets

Quan vaig començar a desenvolupar el programa utilitzant la llibreria Pandas vaig auto afegir-me un grau de complexitat més, ja que ara hauria de conèixer el funcionament de les funcions i objectes d’aquesta llibreria.

Al preguntar-li perquè a l’utilitzar la funció “read_csv” s’afegia una columna nova al DataFrame o com comparar una posició concreta d’un DataFrame amb un null, em va generar codis bàsics, però molt útils i d’una forma força més ràpida que buscant a Google.

Xat GPT intentant ajudant-me a saber perquè obtinc 2 línies en blanc al final del fitxer .csv
Xat GPT explicant-me les possibilitats que tinc de saber si una posició del DataFrame no te valor

Per tant per aquest ús (el de preguntar per coses mmoooolllt concretes) sí que és efectiu, però per fer aquest tipus de dubtes has de tenir un bon coneixement de què necessites (bàsicament resolt dubtes de “sintaxi”).

Un exemple molt clar de què aquest us es el més escaient (en quant a la generació de codi) és el servei de GitHub Copilot (també basat en GPT-3), el qual genera codi partint dels comentaris que vas posant en el teu programa. La mecànica és molt senzilla, escrius un comentari que descrigui una porció molt petita de codi (un “bucle” un condicional o una funció senzilla) i el servei et proposa un codi que haurà de complir amb la funcionalitat descrita amb el comentari.

Com Copilot por proposar-te el codi que necessites, en base al comentari d’aquella porció de codi

També és capaç de proposar-te el codi immediatament següent al que estàs escrivint i d’aquesta manera estalviar-te temps i possibles errors.

Com funciona la funció d’auto-completar de Copilot

Conclusions

Tot i que les proves s’han basat en un sol programa, crec que donen una idea de les limitacions actuals d’aquest model en quant a la generació de codi.

El model s’ha entrenat amb milions de línies de codi i això li ha donat la capacitat de poder resoldre correctament qüestions molt concretes, però tot i que és sorprenent que ho faci de manera ben estructurada, encara falla a l’hora de posar totes les peces juntes.

Només el servei de GitHub Copilot ja representa un gran avenç i sense cap mena de dubte GPT-3 és sorprenent, potentíssim i cal aprofitar-lo en tot allò que ens pugui solucionar, però cal ser realista i entendre que les seves possibilitats actuals són lluny de crear codi funcional per si mateix partint d’una descripció detallada de la funcionalitat. En poc temps rebaixarà força el deute tècnic que es pugui tenir en algunes tecnologies de manera que estrenyi la diferència entre una persona amb molta experiència en un llenguatge concret i una altre amb menys experiència en aquell mateix llenguatge. És més, podria arribar el dia en què, inclús les empreses menys obertes, quan busquin cobrir una vacant, relacionada amb IT, deixin d’exigir tants anys d’experiència en el llenguatge concret i aprenguin a valorar més l’experiència general 😉

Per tot això, crec que avui dia ha de ser entesa com una molt bona ajuda, però que es lluny de ser una solució que cobreixi la necessitat de desenvolupadors.

Tot i no ser el cas dels models de OpenIA, us deixo un “meme” sobre com ens venen la I.A algunes empreses i el que s’amaga al darrere 😉

Leave a comment

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