jueves, enero 09, 2025

ChatGPT: Cómo hacer (y mejorar) mi Trabajo de Fin de Carrera de la Universidad en un par de minutos.

Me ha encantado el artículo de "Write Better Code" publicado por Max Woolf en su blog, donde hace una prueba sencilla, pero maravillosa, que consiste en decirle a un MM-LLM que escriba mejor código para resolver un problema dado. La idea es pedirle que escriba un código para resolver un problema y que luego lo mejore, lo mejore y lo mejore, hasta ver a qué nivel de calidad es capaz de llevarlo. Y he tenido que probarlo.

Figura 1: Cómo hacer mi mejorar mi Trabajo de Fin de Carrera
de la Universidad en un par de minutos con ChatGPT.


Figura 2: Pidiéndole a ChatGPT mi TFG en Python

Le he pedido la resolución del problema en Python, que es muy utilizado hoy en día por los pentesters, pero se lo podrías pedir en cualquier otro lenguaje. Nosotros lo hicimos en Visual C, que no es tan amigable como nuestro querido Python.

Este es un problema sencillo de entender donde tenemos una nube de puntos definidos por dos coordenadas X e Y (o ene coordenadas), y se trata de encontrar aquellos dos que están a menor distancia. Algo que hoy en día se usa para poder hacer "Match" en cualquier plataforma buscando distancias entre elementos por características.
Una mala solución es probar la distancia de todos contra todos y ver el resultado, así que su complejidad es mala. Hay que buscar una solución más eficiente, que teóricamente es de tipo O (n log n). Esto lo dejé escrito en un artículo para explicarle la diferencia entre un buen código y un mal código a un amigo, y la implementación más eficiente es utilizar una estructura de árbol AVL para que quede equilibrado por una de las coordenadas e hilvanar un lista por la otra coordenada. O bien, utilizar un diagrama de Voronoi... pero esa es otra historia.

Figura 5: Solución no-optimizada de ChatGPT.
Con esto no hubiera aprobado.

Después, para optimizar el cálculo basta con probar solo los puntos que en distancia X esté a igual o menos que la distancia más corta calculada hasta el momento, lo que va haciendo que se reduzcan los cálculos de distancia por cada punto procesado. La ventaja de utilizar un árbol AVL.

Figura 6: Le pido que lo optimice

Como podéis ver en la solución inicial en la Figura 5 que da ChatGPT se resuelve el problema, pero no se tiene en cuanta nada de la optimización de la ejecución del algoritmo. Nada de árboles ni nada. Es verdad que le he pedido un volumen de puntos muy pequeño, y la optimización no es significativa, pero le voy a decir que es mala y que me busque una solución más óptima.

Figura 7: Optimizado a O (n log n)

Como podéis ver, al hablar de optimización ya va a por la complejidad teórica mejor para resolver este problema que es O (n log n), lo que le lleva a utilizar una estrategia de Divide y Vencerás similar a utilizar un árbol, y luego una búsqueda linear por la distancia de la otra coordenada.

Figura 8: Primero los mete en una lista ordenada,
 luego busca el del medio y hace búsquedas de distancias
menores en las mitades, como un árbol AVL.

El código es correcto, y seguro que ya me habría valido para aprobar el Trabajo de Fin de Carrera, pero voy a pedirle que me lo haga con restricciones de memoria para que utilice estructuras de almacenamiento en disco basadas en Árboles B+, que son mucho más eficaces para cuando hay que hacer las lecturas y escrituras siempre en disco.

Figura 9: Házmelo para almacenamiento en disco

Y sin ningún problema me da una solución eficiente con Árboles B+, y la explicación de cuáles han sido los puntos de mejora que ha aplicado a este código.

Figura 10: Código para resolver el problema con Árboles B

A partir de este momento le hago la misma petición que en el artículo que os citaba al principio de este post. Le pido que me dé ideas para mejorar este código. Que busque mejoras que se puedan realizar.

Figura 11: Las 5 mejoras sugeridas

Como podéis observar me da hasta cinco mejoras que tienen que ver con detalles de implementación relevantes que pueden ayudar a optimizar la ejecución o ha sacar ventajas de librerías más actualizadas. Todos ellos aparecen en el Canvas de ChatGPT y con las líneas resaltadas (como se puede ver en la Figura 10)

Figura 12: Código optimizado

Como me parecen bien, aplico el cambio de librería, y obtengo un nuevo código que sobre el cuál aún puedo aplicar alguna optimización más. En este caso concreto dos optimizaciones más que decido aplicar para obtener un mejor código.

Una mejoras de seguridad

Llegados a este punto, donde seguro que ya habría sacado una buena nota en mi Trabajo de Fin de Carrera, decido pedirle mejoras de seguridad, para ver qué riesgos está viendo en él en este código.

Figura 13: Hazle mejoras de seguridad

Como podéis ver, se enfoca en el tratamiento de errores, así que hace una gestión más robusta para controlar lo que le pudiera venir como dato de entrada  en cada una de las líneas del fichero del Árbol B+, así como errores no esperados.

Figura 14: Código final generado, optimizado y securizado

La conclusión que he sacado, con sólo unos minutos jugando con ChatGPT para resolver el que fue mi TFC, es algo que ya sabía, que tener programadores hoy en día sin utilizar Copilots de desarrollo es un error de eficiencia de recursos de bulto. 

Es increíble la velocidad a la que se puede programar hoy en día con los modelos LLM ayudándote. En segundo lugar, saber programar, algorítmica, estructuras de datos, arquitectura de software, UX, patrones de diseño, DevSecOps y arquitectura de sistemas es algo fundamental para tener una carrera profesional de éxito en el mundo de la tecnología, no lo dudo, pero si no haces el "upgrade" a hacer todo eso con Inteligencia Artificial, vas a ser como si quisieras correr en bicicleta un GP de Formula 1 donde los demás llevan monoplazas de competición. Tú mismo.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


1 comentario:

Kiko dijo...

Alucinante! --El corolario es muy importante. La AI es una herramienta que ya no se puede ignorar en el desarrollo de software. Hay que adoptarla y crecer, pero hay desarrolladores que se negarán a aceptar la evolución.
Las (r)evoluciones tecnológicas han cambiado muchas industrias y oficios a lo largo de la historia; los que no las han adoptado se quedaron atrás.

Entrada destacada

Cibercriminales con Inteligencia Artificial: Una charla para estudiantes en la Zaragoza

Hoy domingo toca ir a participar en un evento, con una charla y una pequeña demo. Ahora mismo sí, así que el tiempo apremia, os dejo una cha...

Entradas populares