Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Python intermedio para IA, Unidad 9 — Testing y depuración, 9.3 — Testing en proyectos de IA ·

Errores silenciosos

Errores silenciosos

Introducción

Los errores silenciosos, también conocidos como fallos sin notificación o excepciones no capturadas, son un problema común y desafiante en la programación, especialmente cuando se trabaja con grandes volúmenes de datos en proyectos de inteligencia artificial (IA). Estos errores pueden llevar a resultados incorrectos y a modelos mal entrenados sin que el desarrollador se dé cuenta. En este artículo, exploraremos por qué los errores silenciosos son problemáticos, cómo identificarlos y cómo prevenirlos.

Explicación principal con ejemplos

Ejemplo de error silencioso

Imagina un script que lee datos desde archivos CSV, realiza cálculos y guarda el resultado. Si no se verifica correctamente la estructura o el tipo de los datos, puede pasar desapercibido durante largos periodos:

def leer_archivo_csv(ruta):
    with open(ruta, 'r') as file:
        data = file.read()
    
    # Se supone que `data` es una lista de listas con números.
    # En realidad, podría ser un texto legible pero no numérico.
    return [list(map(float, line.split(','))) for line in data.splitlines()]

# Ejecución
try:
    datos = leer_archivo_csv("ruta/a/archivo.csv")
except ValueError:  # No capturado en el código original
    pass

print(datos)

En este caso, si data contiene texto legible pero no numérico, map(float, line.split(',')) generará un ValueError, pero este error es ignorado y la ejecución continúa con datos incorrectos.

Errores típicos / trampas

  1. Tipo inesperado: Los errores pueden ocurrir cuando se supone que una variable contiene uno tipo de dato, pero en realidad tiene otro.
   def procesar_datos(data):
       return data + 5  # Error si `data` no es numérico
   
   print(procesar_datos("hola"))
  1. Rutas incorrectas: Los errores pueden pasar desapercibidos si se usan rutas de archivos que no existen o están mal formadas.
   def leer_archivo(ruta):
       with open(ruta) as file:
           return file.read()
   
   print(leer_archivo("ruta/a/archivo_que_no_existe.txt"))
  1. Operaciones incompatibles: Operaciones matemáticas que no están definidas para ciertos tipos de datos pueden pasar desapercibidos.
   def calcular_promedio(numbers):
       return sum(numbers) / len(numbers)
   
   print(calcular_promedio(["1", "2", "3"]))

Checklist accionable

  1. Verifica siempre el tipo de los datos: Utiliza isinstance() o type() para asegurarte que las variables contienen los tipos esperados.
   def procesar_datos(data):
       if isinstance(data, (int, float)):
           return data + 5
       else:
           raise TypeError("Datos no numéricos")
  1. Captura excepciones específicas: En lugar de capturar except Exception, hazlo para las excepciones más relevantes a tu problema.
   try:
       datos = leer_archivo_csv("ruta/a/archivo.csv")
   except ValueError as e:
       print(f"Error al procesar archivo CSV: {e}")
  1. Valida rutas de archivos: Usa os.path.exists() para asegurarte que las rutas existen antes de abrirlos.
   def leer_archivo(ruta):
       if not os.path.exists(ruta):
           raise FileNotFoundError(f"Archivo no encontrado: {ruta}")
       with open(ruta) as file:
           return file.read()
  1. Usa assertions: Assertions son una forma de verificar que tus supuestos sobre la estructura del código sean verdaderos.
   def procesar_datos(data):
       assert isinstance(data, list), "Datos deben ser una lista"
       return data + 5
  1. Incluye logging: Usa logging para registrar eventos importantes y errores, especialmente en producción.
   import logging
   
   logging.basicConfig(level=logging.ERROR)
   
   def procesar_datos(data):
       try:
           resultado = float(data) + 5
           logging.info(f"Procesado datos: {resultado}")
           return resultado
       except ValueError as e:
           logging.error(f"Error al procesar datos: {e}")

Cierre

Los errores silenciosos pueden ser desafiantes, pero con una buena práctica y conciencia, puedes prevenirlos. Al verificar tipos de datos, capturar excepciones específicas, validar rutas, usar assertions y incluir logging, aseguras que tu código es robusto y confiable.

Siguientes pasos

  • Aplica las mejores prácticas en tus scripts actuales.
  • Implementa tests unitarios para verificar el comportamiento esperado.
  • Usa herramientas de análisis estático de código como mypy o flake8.
  • Documenta cuidadosamente tu código y mantén un registro claro de los errores y sus soluciones.

Siguiendo estos pasos, podrás mejorar la calidad de tu código y evitar problemas imprevistos en tus proyectos de inteligencia artificial.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).