Usando ChatGPT para Debugging Eficiente

Using ChatGPT for Efficient Debugging.

Mejore su experiencia de depuración y aprenda más rápido con el poder de los modelos de lenguaje grande

Foto de Pavel Danilyuk en Pexels

Es difícil negar que los Modelos de Lenguaje Grande (LLM, por sus siglas en inglés) están teniendo un impacto profundo en varias industrias y aplicaciones, revolucionando la forma en que trabajamos e interactuamos. Aunque la emoción inicial alrededor de ChatGPT ha disminuido desde su lanzamiento hace unos seis meses (en noviembre de 2022), su influencia sigue siendo significativa. Parece que los LLM autoregresivos seguirán siendo parte de nuestras vidas en el futuro cercano, y vale la pena desarrollar habilidades para interactuar con ellos, tanto como desarrollador como usuario.

Como Chip Huyen afirmó en su publicación de blog, es relativamente fácil lograr algo impresionante con los LLM, pero es bastante difícil construir algo listo para producción considerando las limitaciones y posibles problemas que los LLM tienen actualmente. Sin embargo, mientras la comunidad de investigación e ingeniería está trabajando activamente para abordar estos desafíos, vale la pena reconocer el hecho de que las personas ya pueden beneficiarse enormemente de los LLM, al menos usándolos como asistentes personales para tareas cotidianas no críticas o como colaboradores para el brainstorming.

En mi artículo anterior, discutí las mejores prácticas de ingeniería de prompts, proporcionando información para ayudarlo a desarrollar aplicaciones basadas en LLM locales. En esta publicación, compartiré un conjunto de técnicas que le permitirán utilizar modelos como ChatGPT para depuración de código efectiva y aprendizaje acelerado de programación. También echaremos un vistazo a los prompts de ejemplo para escribir y explicar código. Estas técnicas serán valiosas no solo al interactuar con ChatGPT, sino también al buscar ayuda de sus colegas o incluso al abordar desafíos de programación de manera independiente.

Este artículo está dirigido principalmente a principiantes, por lo que traté de proporcionar ejemplos ilustrativos y explicaciones. Espero que estas técnicas lo ayuden a comprender y solucionar problemas de código de manera más eficiente.

Marco general para la depuración de código

De hecho, ChatGPT no ha realizado cambios significativos en el proceso de depuración. ¡Lo genial es que ahora puede conectarse fácilmente con un colega virtual sin preocuparse por ser una molestia o sentirse vacilante para hacer preguntas tontas! Pero las técnicas que consideraremos existen mientras exista la ingeniería de software, y por lo tanto serán útiles no solo al interactuar con LLM, sino también para una mejor comprensión del proceso y una interacción más efectiva con los compañeros de trabajo.

Para encontrar un error en su código, solo necesita dos pasos esenciales (en realidad hay tres):

  1. Isolar el error y demostrarlo con la cantidad mínima de código;
  2. Hacer una suposición sobre su error y probarla;
  3. Iterar con más suposiciones hasta encontrar una solución.

Si bien puede comenzar a usar ChatGPT de inmediato, en realidad es mejor comenzar reproduciendo el error por algunas razones. En primer lugar, puede ser difícil incluir todos los puntos relacionados y explicar exactamente lo que está tratando de lograr dentro del contexto del modelo de lenguaje. En segundo lugar, le permitirá comprender mejor el problema y posiblemente encontrar el error usted mismo. Veamos.

A propósito, en esta publicación estoy usando la versión estándar de ChatGPT (GPT-3.5), pero para tareas de codificación, GPT-4 es típicamente más competente.

Paso 1: Aislar y reproducir el problema con la cantidad mínima de código

El primer paso es reproducir el problema. Como sabemos, la mayoría de los problemas aún se pueden resolver con el clásico “apagarlo y encenderlo de nuevo”. Es posible que se haya enredado con el orden de ejecución de código en Jupyter Notebook.

Si es posible (y generalmente lo es), se recomienda escribir un nuevo código que arroje el mismo error y mantenerlo lo más simple posible.

Consideremos el ejemplo de un TypeError: ‘int' object is not iterable, que ocurre cuando intenta iterar sobre some_integer en lugar de usar el constructo range(some_integer).

Mal ejemplo: una función llama a otra función que luego invoca un método de una clase. A primera vista, puede requerir algún tiempo determinar dónde ocurre el cálculo real, a pesar de que este es un ejemplo relativamente simple. De manera similar, para los modelos, se vuelve más difícil ubicar la información relevante entre detalles no relacionados.

Mejor ejemplo: deshacerse de la clase moviendo la funcionalidad de la función do_some_work() (que está causando el error) directamente en la función que estamos llamando.

Además del hecho de que todavía hacemos un trabajo terrible con las convenciones de nomenclatura de variables (recuerde, ¡los nombres de las variables deben ser descriptivos y significativos!), este código sigue siendo más fácil de depurar y entender.

Mejor ejemplo aún: también podemos deshacernos de some_function().

En general, hemos acortado el código en más de la mitad. Compare cuánto más fácil es encontrar un error en él.

En el contexto de pandas, por ejemplo, este principio puede significar no usar el dataframe original. Consideremos una situación en la que queremos calcular el salario promedio de cada posición utilizando nuestros datos y encontramos un KeyError. Aquí hay un mal ejemplo:

En primer lugar, no podemos estar seguros de que el dataframe contiene los datos proporcionados en los comentarios. De hecho, solo necesitamos dos columnas de él, y si creamos una versión mini similar, será mucho más fácil entender que simplemente escribimos mal el nombre de la columna de salario (Salary vs salary).

Por cierto, ChatGPT es bastante bueno para generar datos ficticios, ¡así que también puede ser útil aquí!

Hay innumerables tipos de errores y, por supuesto, es imposible enumerarlos todos. En general, intente modificar el código de tal manera que produzca el mismo error que encontró, pero que sea lo más fácil posible de entender rápidamente.

Debido a la llamada “depuración del pato de goma”, este paso a menudo lo ayuda a comprender la causa del problema por su cuenta, sin buscar ayuda externa. Por ejemplo, si su mini-código no genera el mismo error, ya está a medio camino de encontrar una solución. Sin embargo, incluso si lo hace, sigue siendo un resultado positivo. 🙂

Paso 2: Hacer una suposición, probarla e iterar

Si aún no puede encontrar una forma de solucionar el error, vale la pena buscar ayuda. Pero es útil tener sus propias suposiciones sobre lo que podría estar mal.

Encuentre la línea exacta

Primero, encuentre la expresión y la línea de código exacta que están causando el problema. Probablemente ya sepa que está dentro de la última línea del mini-código que escribió anteriormente.

Recuerde que el seguimiento de Python muestra el mensaje de error en la parte inferior y el código ejecutado correspondiente en la parte superior con llamadas de funciones internas en el medio.

Python traceback. Imagen por Autor

Esto puede ser bastante fácil para errores simples, pero puede ser más difícil al tratar errores lógicos que no generan ningún mensaje de error pero que resultan en salidas inesperadas debido a errores lógicos. En tales casos, es útil observar los valores paso a paso con un depurador o simples declaraciones de print() y definir la línea de código que no se alinea con sus expectativas.

Si el error es causado por una expresión compleja, como df.groupby(‘Occupation’)[‘Address’].apply(lambda x: ‘, ‘.join(x)), primero puede dividirlo en partes y explorar la salida paso a paso, por ejemplo, primero ejecute df.groupby(‘Occupation’), luego df.groupby(‘Occupation’)[‘Address’], y así sucesivamente.

Piense en las razones comunes

Luego, considere algunas razones comunes para el error:

  • ¿Podría ser que la biblioteca necesaria no esté instalada o instalada con la versión incorrecta?
  • ¿Tal vez hay un simple error de ortografía o de sintaxis en algún lugar?
  • ¿Podría ser que el error esté relacionado con los tipos de datos, por ejemplo, que sume una cadena y un número?
  • Y así sucesivamente.

Pregúntale a ChatGPT

Si no se te ocurre nada, es hora de pedir ayuda a ChatGPT. Los problemas simples a menudo se pueden resolver simplemente pegando tu código y preguntando qué está mal. Sin embargo, para problemas más complejos, es posible que necesites proporcionar información relevante adicional. Por ejemplo, si te encuentras con un error del sistema, puede ser útil incluir la versión de Python que estás usando. En general, trata siempre de incluir el mensaje de error y describe lo que estás intentando lograr. Puede que tengas que probar varias formas de expresarte, así que no tengas miedo de experimentar.

Las situaciones pueden variar mucho, así que pasemos a algunos ejemplos. Primero, echemos un vistazo al KeyError de pandas que encontramos anteriormente.

Promedio de muestra:

Este código de Python resulta en <error> en <esta línea>.```Inserta tu código aquí```Dime cómo depurar el código para resolver el error dado.

Ejemplo:

Este código de Python resulta en KeyError: 'Column not found: salary' en la última línea.```import pandas as pddf = pd.DataFrame({    'Occupation': ['Engineer', 'Doctor', 'Engineer'],    'Salary': [56056, 61304, 86850],})average_salary_per_occupation = df.groupby('Occupation')['salary'].mean()```Dime cómo depurar el código para resolver el error dado.
Output for a debugging pandas example. Image by Author created using ChatGPT

¡Se ve bien! Veamos un ejemplo más desafiante con un error lógico.

Promedio de muestra:

Este código de Python <hace esto, pero quiero que haga esto>.```Inserta tu código aquí```Dime cómo arreglar el código para resolver el problema.

Ejemplo:

Este código de Python entrena un clasificador de bosques aleatorios en el conjunto de datos Iris. Hasta donde yo sé, el conjunto de datos es relativamente simple y espero que el clasificador haga predicciones perfectas, sin embargo, estoy obteniendo alrededor del 95% de precisión incluso con 100 árboles en el bosque. ¿Son estos resultados razonables para esta situación?```from sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_split, GridSearchCV# carga el conjunto de datos Irisiris = load_iris()X = iris.datay = iris.target# divide los datosX_test, X_train, y_test, y_train = train_test_split(    X, y, test_size=0.2, random_state=42)X_train, X_val, y_train, y_val = train_test_split(    X_train, y_train, test_size=0.2, random_state=42)param_grid = {    'n_estimators': [3, 7, 15, 25, 50, 100]}# crea un clasificador de bosques aleatorios y # utiliza la búsqueda en cuadrícula para encontrar el mejor número de árbolesrf_classifier = RandomForestClassifier()grid_search = GridSearchCV(estimator=rf_classifier,                            param_grid=param_grid, cv=5)grid_search.fit(X_train, y_train)# obtén el mejor estimador de la búsqueda en cuadrícula y pruébalo con los datos de pruebabest_rf = grid_search.best_estimator_y_pred = best_rf.predict(X_test)test_accuracy = accuracy_score(y_test, y_pred)print("Precisión de la prueba:", test_accuracy)# obtén el mejor número de árboles de la búsqueda en cuadrículabest_n_estimators = grid_search.best_params_['n_estimators']print("Mejor número de árboles:", best_n_estimators)```Dime cómo arreglar el código para resolver el problema, si lo hay.
Output for a debugging sklearn example. Image by Author created using ChatGPT

El modelo pudo encontrar el problema oculto y solucionarlo. ¡Genial!

Dado que ChatGPT recuerda tus mensajes anteriores, las posibilidades que se abren aquí son infinitas. Puedes preguntarle que te explique algunos conceptos que te resulten difíciles de entender, sugerir soluciones alternativas, traducir código de un idioma a otro, y mucho más.

Además, como ChatGPT puede entender el código, también puede escribirlo.

Usar ChatGPT para Escribir y Explicar Código

En esta sección, exploraremos un par de trucos que se pueden utilizar al codificar con ChatGPT. Pero primero, creo que es importante recordar que antes de la aparición de ChatGPT, Google era la herramienta principal para los desarrolladores de software.

Y creo que es importante no olvidar cómo usar Google, por diversas razones. Al final, con Google probablemente puedas hacer todo lo que puedes hacer con ChatGPT (en entornos de codificación), solo que puede ser más lento. Aunque, cuando se trata de tareas específicas como crear una matriz diagonal con numpy, probablemente lo haría más rápido usando Google.

Creo que la analogía adecuada es el proceso de aprendizaje de un idioma extranjero (aunque se puede decir que estás haciendo exactamente eso al aprender un lenguaje de programación :). Usar Google es traducir palabras individuales utilizando un vocabulario mientras que utilizar ChatGPT es similar a traducir oraciones y párrafos enteros de texto utilizando traductores en línea. Si bien ChatGPT puede ser increíblemente poderoso, puedes enfrentar desafíos para identificar errores ocultos o comprender ciertos bloques de código, especialmente como principiante.

Dadas las inmensas capacidades de ChatGPT, se puede emplear de diversas maneras. Te aconsejo que lo uses para generar pequeños fragmentos de código actuando como un diccionario de expresiones estables. Asegurarse de tener una comprensión sólida del código generado es esencial porque puede ayudar a prevenir problemas y complicaciones futuras.

¡Así que usa ChatGPT, pero recuerda buscar cosas en Google también! Este artículo ofrece algunos consejos valiosos sobre cómo buscar de manera efectiva para los desarrolladores de software.

Escribir

Una técnica que es útil en estas situaciones se llama rol de activación. En lugar de simplemente pedirle al modelo que genere código, puedes pedirle que escriba código siendo un desarrollador junior, por ejemplo. Al asumir este rol, es más probable que el modelo produzca código comprensible para principiantes y evite construcciones excesivamente complejas.

Prompt de ejemplo:

Actúa como un desarrollador junior de Python. Escribe código con comentarios explicando lo que está sucediendo. Al proporcionar la solución, asegúrate de que la salida esté bien formateada y el código esté bien documentado. Incluye ejemplos de uso y explicaciones. <Describe tu problema aquí>

Ejemplo:

Actúa como un desarrollador junior de Python. Escribe código con comentarios explicando lo que está sucediendo. Al proporcionar la solución, asegúrate de que la salida esté bien formateada y el código esté bien documentado. Incluye ejemplos de uso y explicaciones. Escribe un programa para encontrar valores comunes entre dos matrices numpy. Es una función que toma dos matrices numpy como entradas y devuelve una matriz numpy.
Output for a code generation prompt. Image by Author created using ChatGPT

En este ejemplo, ChatGPT hizo un buen trabajo siguiendo todas nuestras instrucciones, incluyendo ejemplos y explicaciones detalladas.

No olvides comparar el código con tus suposiciones iniciales y sacar conclusiones que te permitan no hacer tal solicitud en el futuro.

En general, recuerda que los LLM no tienen conocimientos previos sobre ti o el problema específico que estás enfrentando, por lo que cuanto más información proporciones, mejor será la salida que obtendrás:

  • Describe tu tarea ;
  • Define la estructura del código : por ejemplo, es un script completo, una clase o una función;
  • Especifica las entradas y salidas : por ejemplo, la función toma dos argumentos enteros y devuelve un flotante;
  • Menciona las herramientas/bibliotecas que quieres utilizar, como numpy o pandas, así como un lenguaje de programación;
  • Si es factible, agrega tus sugerencias sobre cómo podría ser la solución: por ejemplo, sugiero utilizar la función pandas.DataFrame.groupby para calcular el salario promedio por posición.

Optimizar

Si anteriormente pedimos que el modelo se comporte como un desarrollador junior, queremos que sea más fuerte en programación para tareas como la optimización de código.

Por cierto, también se puede usar el mismo truco de indicar la función para depurar.

Ejemplo de indicación:

Actúa como un desarrollador experimentado de Python que asesora a un desarrollador junior.Proporciona explicaciones y comentarios sobre los conceptos que pueden ser difíciles para principiantes. Usa las mejores prácticas de Python y escribe docstrings.Rewrite the above Python code and optimize it.```Insert your code here```

Ejemplo:

Actúa como un desarrollador experimentado de Python que asesora a un desarrollador junior.Proporciona explicaciones y comentarios sobre los conceptos que pueden ser difíciles para principiantes. Usa las mejores prácticas de Python y escribe docstrings.Rewrite the above Python code and optimize it.```def unique_list(l):    # Obtén una lista de elementos distintos de la lista dada    x = []    for a in l:        if a not in x:            x.append(a)    return x```
Resultado para una indicación de optimización de código. Imagen creada por el autor usando ChatGPT

Aquí, para extraer elementos únicos de la lista, ChatGPT sugiere usar el tipo de datos set (que por definición no permite valores duplicados), en lugar de un bucle. Una buena elección, ya que es básicamente una solución de una línea.

Explicación

Podemos usar la misma notación para solicitar comentarios y explicaciones de código. A menudo esto tiende a producir comentarios redundantes, como import numpy as np # importar la biblioteca numpy. Sin embargo, esto todavía puede ser útil al comienzo de su viaje, y ayudar al modelo a expresar sus pensamientos internos como se discutió en la sección de razonamiento de cadena del pensamiento en mi artículo anterior.

Ejemplo de indicación:

Actúa como un desarrollador experimentado de Python que asesora a un desarrollador junior.Proporciona explicaciones y comentarios sobre los conceptos que pueden ser difíciles para principiantes. Explica y comenta el siguiente código.```Insert your code here```

Ejemplo:

Actúa como un desarrollador experimentado de Python que asesora a un desarrollador junior.Proporciona explicaciones y comentarios sobre los conceptos que pueden ser difíciles para principiantes. Explica y comenta el siguiente código.```def func(n):    trow = [1]    y = [0]    for x in range(max(n, 0)):        print(trow)        trow = [l + r for l, r in zip(trow + y, y + trow)]    return n >= 1func(6)```
Resultado para una indicación de explicación de código. Imagen creada por el autor usando ChatGPT

Aquí, el modelo pudo identificar la tarea detrás de este código: generar filas del triángulo de Pascal. ¡Buen trabajo!

Aunque hay numerosas aplicaciones útiles para ChatGPT que puede descubrir, es importante tener en cuenta que no siempre podrá resolver cada problema que encuentre. Vale la pena discutir este aspecto más a fondo.

Algunas notas sobre posibles problemas

Aunque ChatGPT puede ser muy útil y realizar varias tareas, es importante tener en cuenta las posibles desventajas que pueden ser difíciles.

Como LLM autoregresivo, ChatGPT no es determinista…

ChatGPT es un ejemplo de un modelo de lenguaje grande (LLM, por sus siglas en inglés), y los modelos de lenguaje grande actuales son autoregresivos, lo que significa que están entrenados para predecir el siguiente token en una secuencia. La salida de un modelo es una distribución de probabilidad en todos los posibles tokens, y muestreamos el texto final de esta distribución token por token. Como resultado, el proceso de muestreo es no determinista, lo que significa que puede tener diferentes resultados para la misma entrada debido a razones probabilísticas.

Para ilustrar esto, podemos imaginar el proceso de muestreo como un árbol. Aquí, la oración inicial se muestra en azul, los tokens seleccionados se muestran en verde y los que no se seleccionan se representan en rojo (sin su evolución posterior). Las probabilidades se eligen al azar solo con fines ilustrativos.

Visualización simplificada del proceso de muestreo para LLM. Imagen del autor

La secuencia de entrada es: “Mi nombre es” y ChatGPT la completa con “¡ChatGPT, encantado de ayudarte!”. Este es un ejemplo de mi artículo anterior, donde discuto los conceptos básicos de LLMs.

… y por eso ChatGPT puede estar equivocado

En la práctica, esto significa que puedes obtener una salida subóptima solo porque obtuviste algunos tokens raros e improbables al principio. Como resultado, puede ser necesario realizar varias ejecuciones de la misma entrada para examinar las diferentes salidas y seleccionar la más adecuada o incluso combinar diferentes partes de diferentes salidas.

Además, es importante destacar que los modelos de lenguaje modernos, especialmente GPT-4, tienen impresionantes capacidades de autocorrección. Si el código generado contiene errores, simplemente puedes devolverlo e indicar que no funciona correctamente. GPT-4 es experto en depurar su propio código y ofrecer sugerencias relevantes. A menudo podrás obtener el código correcto después de un par de iteraciones.

Sobreconfianza

A pesar de que los LLMs a veces pueden proporcionar salidas incorrectas, han sido entrenados para priorizar la precisión. Esto puede hacer que su salida parezca muy convincente, incluso cuando es incorrecta. Como resultado, identificar errores ocultos puede ser un desafío porque el modelo a menudo no puede decir explícitamente “necesito más información”, aunque la investigación en curso está explorando activamente formas de abordar esta limitación.

En este sentido, el uso de ChatGPT para generar pequeños fragmentos de código para resolver tareas específicas, como mencioné anteriormente al referirme a la búsqueda en Google, puede ser más seguro. Es esencial asegurarse de que tienes una comprensión sólida del código que recibes, lo que te permitirá navegar eficazmente por posibles obstáculos.

Conclusión

En este artículo, hemos explorado métodos que pueden ayudarte en la depuración, no solo con ChatGPT sino también contigo mismo.

Al aislar el problema y reescribirlo en líneas de código mínimas, es probable que obtengas información sobre el problema subyacente. O deja que ChatGPT te ayude proporcionando información completa sobre lo que está sucediendo, haciendo suposiciones y experimentando.

También puedes utilizar ChatGPT para tareas como escribir, optimizar o explicar código, como discutimos en el ejemplo de la solicitud de rol. Las otras aplicaciones relacionadas con el código son infinitas e incluyen la creación de datos ficticios, la escritura de pruebas, la generación de documentación y más.

Pero recuerda las limitaciones de LLMs, ya que pueden introducir problemas ocultos. Debido a su naturaleza autoregresiva, los LLMs pueden estar equivocados mientras parecen confiados, lo que puede requerir hacer más preguntas o ejecutar múltiples iteraciones para seleccionar la mejor salida.

¡Te deseo mucha suerte en tu camino de aprendizaje!

Recursos

Consulta este artículo para obtener una guía más amplia sobre cómo hacer de ChatGPT tu mentor personal de programación.

Aquí están mis otros artículos sobre LLMs que pueden ser útiles para ti. Ya he cubierto:

  • Estimación de la escala de los modelos de lenguaje grande: qué son los LLMs, cómo se entrenan y cuántos datos y cálculos necesitan;
  • Mejores prácticas para la ingeniería de solicitudes: cómo aplicar técnicas de ingeniería de solicitudes para interactuar con LLMs de manera efectiva y cómo construir aplicaciones locales de LLM con OpenAI API y Streamlit.

También puede interesarte:

  • Curso gratuito de Learn Prompting para obtener una comprensión más profunda de la solicitud y varias técnicas asociadas con ella;
  • Cursos cortos recientemente lanzados por DeepLearning.AI para construir aplicaciones con OpenAI API.

¡Gracias por leer!

  • Espero que estos materiales te hayan sido útiles. Sígueme en Zepes para obtener más artículos como este.
  • Si tienes alguna pregunta o comentario, estaré encantado de recibir cualquier comentario. Pregúntame en los comentarios o conéctate a través de LinkedIn o Twitter.
  • Para apoyarme como escritor y acceder a miles de otros artículos de Zepes, obtén una membresía de Zepes utilizando mi enlace de referencia (sin cargos adicionales para ti).

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Ciencias de la Computación

Matthew Kearney Trayendo la inteligencia artificial y la filosofía al diálogo.

La doble especialización en informática y filosofía tiene como objetivo avanzar en el campo de la ética de la intelig...

Inteligencia Artificial

Mejores herramientas de corrección gramatical de IA 2023

Grammarly Grammarly es un tutor de escritura basado en la web impulsado por inteligencia artificial. Corrige al insta...

Inteligencia Artificial

Aprendizaje por Reforzamiento una Introducción Sencilla a la Iteración de Valor

La Iteración de Valor (VI) es típicamente uno de los primeros algoritmos introducidos en la vía de aprendizaje del Ap...

Inteligencia Artificial

6 Funciones Potenciadas por AI que Transforman Gmail en una Solución de Correo Electrónico Eficiente

La plataforma de correo Gmail de Google ha estado a la vanguardia en aprovechar el poder de la inteligencia artificia...

Inteligencia Artificial

Una Nueva Era de Generación de Texto RAG, LangChain y Bases de Datos Vectoriales

Introducción Técnicas innovadoras continúan dando forma a cómo las máquinas entienden y generan lenguaje humano en el...