Depuración de Código con GitHub Copilot: Mejores Prácticas para un Debugging Eficiente

La depuración de código popularmente conocida como debugging es una parte esencial del desarrollo de software. Con la incorporación de herramientas de inteligencia artificial como GitHub Copilot, ahora es posible automatizar parte de ese proceso y obtener sugerencias inteligentes directamente desde el entorno de desarrollo. En este artículo exploraremos cómo aprovechar Copilot para detectar y resolver distintos tipos de errores —léxicos, sintácticos, semánticos y de ejecución— siguiendo las recomendaciones de la guía oficial de Microsoft para Visual Studio.

¿Qué es GitHub Copilot?

GitHub Copilot es una extensión basada en IA desarrollada por GitHub y OpenAI que ofrece sugerencias contextuales en tiempo real. Copilot no solo puede ayudarte a escribir código, sino también a comprender errores y sugerir soluciones durante el proceso de depuración. Su integración con Visual Studio permite incluso interactuar mediante prompts usando Copilot Chat o comandos como /fix que ya resuelven el objetivo para el modelo en nuestro prompting.

Antes que nada, desde hace un tiempo Microsoft lanzó una capa gratuita para Copilot.

Qué incluye el plan gratuito de GitHub Copilot:

  • 2.000 finalizaciones de código inteligentes al mes: Obtén sugerencias de código conscientes del contexto que extraen contexto de tus proyectos de GitHub y del espacio de trabajo de VS Code.
  • 50 mensajes de chat de Copilot al mes: Pide ayuda a Copilot para entender el código, refactorizar algo o depurar un problema.
  • Elige tu modelo de IA: Elige entre Claude 3.5 Sonnet u OpenAI GPT-4o.
  • Realiza cambios en varios archivos con Copilot Edits: Realice cambios en varios archivos con Copilot Edits.
  • Compatibilidad con el ecosistema Copilot Extensions: Accede a agentes de terceros diseñados para tareas como consultar Stack Overflow o buscar en la web con Perplexity.
  • Elija dónde construir: Disfruta de soporte en VS Code y a través de tu browser en Code Space en GitHub.

Comandos básicos para interactuar con Copilot

Cuando seleccionamos una porción de código podemos utilizar los comandos Cmd + I (en Mac) o Ctrl + I (en Windows) para abrir la modalidad inline de la herramienta en Code Space. Allí podemos utilizar estos atajos para predisponer a nuestro modelo a una tarea en particular:

  • /doc: Genera o muestra documentación para el código seleccionado o el archivo activo.
  • /edit: Permite editar o modificar el código seleccionado según una instrucción dada.
  • /explain: Explica el funcionamiento del código seleccionado o del archivo activo.
  • /fix: Sugiere o aplica correcciones a errores detectados en el código seleccionado.
  • /generate: Genera nuevo código, funciones, clases o archivos según una instrucción.
  • /tests: Crea pruebas unitarias o de integración para el código seleccionado.

Junto al botón de enviar, tienes un menú desplegable con tres opciones:
Ask: para hacer preguntas (modo por defecto). Ideal para debugging, explicación de errores, sugerencias de código.
Edit: para pedirle que modifique código automáticamente.
Agent: para tareas más complejas o interactivas (puede implicar múltiples pasos).

En la parte superior de la ventana de Copilot Chat verás el botón “Add Context…”. Al hacer clic:
• Puedes seleccionar archivos abiertos, carpetas, instrucciones, problemas de código, símbolos, etc.
• Esto le da más información a Copilot sobre el proyecto actual para que sus respuestas sean más relevantes.

Una vez que agregaste contexto (como un archivo .py), verás ese archivo asociado a la consulta. Esto es útil para pedirle a Copilot que:
• Revise el código completo.
• Sugiera mejoras o refactorización.
• Explique por qué un error ocurre.

💡 Ejemplo de prompt:

“¿Puedes revisar el archivo y decirme si hay errores de lógica o ejecución en el endpoint /chat?”

Tipos de errores y cómo abordarlos con Copilot

1. Errores léxicos (Lexical Errors)

Los errores léxicos ocurren cuando el código contiene caracteres inválidos o tokens no reconocibles por el compilador.

Ejemplo común: uso incorrecto de símbolos (@, #, etc.), nombres mal escritos, o strings mal cerrados.

Buenas prácticas con Copilot:

  • Al recibir una advertencia de este tipo, selecciona la línea con el error y ejecuta /fix en Copilot Chat para obtener una corrección directa.
  • Si estás usando Copilot inline, coloca el cursor después del error y observa la sugerencia automática.
  • Usa comentarios para guiar a Copilot, por ejemplo: «# este string debe estar bien formado»

Ejercicio 1: Error léxico (nombre mal escrito):

def saludo():
prin("Hola mundo") # Error: 'prin' no está definido

2. Errores sintácticos (Syntax Errors)

Estos errores ocurren cuando la estructura del código no cumple con la gramática del lenguaje.

Ejemplo común: paréntesis mal cerrados, funciones mal declaradas, uso incorrecto de palabras clave.

Buenas prácticas con Copilot:

  • Añade un comentario claro sobre lo que el bloque de código debería hacer. Ejemplo: «# Definir una función que calcule el área de un círculo»
  • Utiliza Copilot Chat para pedir una reescritura del bloque: «/fix rewrite this function with correct syntax«
  • Combina con la vista de errores de Visual Studio para identificar exactamente qué parte falla.

Ejercicio 2: Error de sintaxis (falta de paréntesis):

def suma(a, b):
    return a + b  # Error: falta un paréntesis de cierre

3. Errores semánticos (Semantic Errors)

Estos errores suceden cuando el código tiene una estructura válida, pero la lógica es incorrecta o no produce el resultado esperado.

Ejemplo común: una función devuelve un resultado equivocado por una operación mal planteada o mal uso de variables.

Buenas prácticas con Copilot:

  • Describe claramente el comportamiento esperado en los comentarios antes del bloque de código.
  • Pregunta directamente en Copilot Chat: ¿Este algoritmo calcula correctamente el factorial?
  • Utiliza estrategias de prompting como CoT(Chain of Thoughts) para que el modelo razone sobre sus resultados.
  • Copilot puede sugerir versiones optimizadas o corregidas basadas en tu intención.

Ejercicio 3: Error Semántico:

def calcular_promedio(lista):
    return sum(lista) * len(lista)  # Error: lógica incorrecta

    #Objetivo: Aunque el código es válido, da un resultado incorrecto. Prompt: “¿Este código calcula correctamente el promedio de una lista?”

4. Errores en tiempo de ejecución (Runtime Errors)

Son errores que se manifiestan solo al ejecutar el programa, como divisiones por cero, índices fuera de rango o acceso a variables nulas.

Ejemplo común:

lista = [1, 2, 3]
print(lista[5]) # IndexError

Buenas prácticas con Copilot:

  • Utiliza Copilot Chat para solicitar la causa del error: /explain this error and how to fix it
  • Solicita a Copilot una reestructuración del bloque con manejo de excepciones: agrega un bloque try-except para evitar errores en tiempo de ejecución

Ejercicio 4: Error en tiempo de ejecución:

def obtener_elemento(lista):
    return lista[10]  # Puede lanzar IndexError si la lista es muy corta

obtener_elemento([1, 2, 3])

    # Objetivo: Provocar un IndexError. Prompt sugerido: “Corrige este error de ejecución para que no falle si el índice está fuera de rango.”

Prompts efectivos para depurar con IA

La calidad del contexto que des al modelo afecta directamente la utilidad de las sugerencias. Aquí algunos consejos:

  • ✅ Usa comentarios detallados sobre lo que el código debería hacer.
  • ✅ Especifica qué tipo de error estás tratando de resolver.
  • ✅ Sé claro, específico y directo: Copilot responde mejor cuando entiende el propósito de la función
    • Evita esto: # Arregla esto
    • Prefiere esto: # Corrige esta función para que devuelva el área de un triángulo
  • Reescribe prompts ambiguos o genéricos:
    • Evita esto:Hazlo mejor
    • Prefiere esto: “Refactoriza esta función para mejorar legibilidad y evitar duplicación de lógica”
  • ✅ Usa comentarios con contexto (Contextual Prompting):
    • Ejemplo:
      # La siguiente función debería devolver la suma de dos enteros positivos:
      def sumar(a, b):
      return a – b

      Luego puedes usar Copilot Chat con /fix o /explain para ayudar al modelo a identificar la contradicción entre comentario y código.
  • ✅ Usa prompting de rol o sistema cuando sea posible:
    • Ejemplo:
      «Actúa como un ingeniero de software senior. Revisa este código y sugiere mejoras.»
  • ✅ Usa Chain of Thought para depuración compleja cuando el error no es evidente, invita al modelo a razonar paso a paso, esto ayuda con errores semánticos ocultos o fallos lógicos sutiles.
    • Ejemplo:
      Explica paso a paso por qué esta función lanza un error en tiempo de ejecución y cómo solucionarlo.
  • ✅ Usa ejemplos (few-shot prompting): Si ves que Copilot no interpreta correctamente tu necesidad, podés proporcionarle un ejemplo directamente en el comentario, esto aclara el patrón que debe seguir:
    • Ejemplo:
      # Entrada: a = 3, b = 5
      # Salida esperada: 8
      def sumar(a, b):
      return a + b

Aquí tienes una guía completa de prompting del propio Google con las explicaciones paso a paso:

Ejercicio: Creación de un Chatbot con FastAPI y OpenAI utilizando Copilot en CodeSpace

¿Qué es FastAPI?

  • Es un framework web para construir APIs con Python, moderno, rápido y fácil de usar.
  • Basado en:
    • Python 3.6+ (usa anotaciones de tipos).
    • Starlette (como servidor web asíncrono).
    • Pydantic (para validación de datos).
    • Genera automáticamente documentación interactiva con Swagger.
    • Utiliza Uvicorn como servidor de ejecución de la aplicación

¿Para qué sirve?

  • Crear endpoints HTTP que se pueden consumir desde una web, una app o incluso desde la terminal.
  • Es ideal para:
    • Microservicios.
    • Aplicaciones modernas con backend ligero.
    • Integraciones con IA (como en este caso).

Documentación oficial: FastAPI Doc

Ejercicio Endpoint

# Developing a simple chatbot using the OpenAI API and FastAPI
import os
from openai import OpenAI
from fastapi import FastAPI, HTTPException
from fastapi.params import Body
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Retrieve the OpenAI API key from environment variables
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Initialize FastAPI app
app = FastAPI()

# Example endpoint to handle chat requests
@app.post("/chat")
async def chat(user_message: str = Body(..., embed=True)):
    try:
        # Call the OpenAI API
        response = client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": user_message}],
            temperature=0.7,
            max_tokens=100
        )
        # Return just the message content
        return {"response": response.choices[0].message.content}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
Scroll al inicio