10. Manejo de Errores en Aplicaciones de IA con .NET

This entry is parte 10 de 25 in the series Introducción a Microsoft Semantic Kernel

Introducción a Microsoft Semantic Kernel

1. Introducción a Semantic Kernel con C#: Construyendo tu Primera Aplicación de IA

2.Creando Plugins Personalizados en Semantic Kernel

3. Clasificación de Intenciones con LLMs en .NET

4. Servicios de Chat Completion con Azure OpenAI y Semantic Kernel

5. Vector Embeddings y Búsqueda Semántica con .NET

6. Prompt Engineering: Mejores Prácticas para LLMs

7. Integración de Azure OpenAI en Aplicaciones .NET

8. Configuración de Temperatura y Tokens en Modelos LLM

9. Estrategias de Caché para Servicios de IA

10. Manejo de Errores en Aplicaciones de IA con .NET

11. Salida JSON Estructurada con LLMs

12. Testing de Servicios de IA en .NET

13. Inyección de Dependencias con Semantic Kernel

14. Comprensión de Consultas con Lenguaje Natural

15. Sistemas de Búsqueda Semántica en Producción

16. Configuración de HttpClient para Servicios de IA

17. Guardrails y Validación en Sistemas de IA

18. Workflows Multi-Paso con IA

19. Optimización de Costos en Aplicaciones de IA

20. Monitoreo y Observabilidad de Servicios de IA

21. Arquitectura de Microservicios con IA

22. Seguridad en Aplicaciones de IA

23. Implementación de Routers Conversacionales Inteligentes

24. Filtrado por Relevancia Semántica en Búsquedas

25. Normalización y Preprocesamiento de Datos para IA

Introducción

Las aplicaciones de IA enfrentan errores únicos: rate limits, timeouts, respuestas inesperadas del modelo, y fallos de red. Este tutorial cubre estrategias robustas de manejo de errores para aplicaciones de IA en producción.

Tipos de Errores Comunes

1. Errores de Red

try
{
    var response = await aiService.GenerateAsync(prompt);
}
catch (HttpRequestException ex)
{
    _logger.LogError(ex, "Error de conexión al servicio de IA");
    // Retry o fallback
}
catch (TaskCanceledException ex)
{
    _logger.LogError(ex, "Timeout al llamar al servicio de IA");
    // Timeout handling
}

2. Rate Limiting (429)

catch (RequestFailedException ex) when (ex.Status == 429)
{
    var retryAfter = ex.GetRawResponse()?.Headers
        .TryGetValue("Retry-After", out var value) == true
        ? int.Parse(value) : 60;

    _logger.LogWarning("Rate limit alcanzado. Reintentar en {Seconds}s", retryAfter);
    await Task.Delay(TimeSpan.FromSeconds(retryAfter));
    // Retry
}

3. Respuestas Inesperadas del Modelo

var response = await aiService.GenerateAsync(prompt);

if (string.IsNullOrWhiteSpace(response))
{
    throw new AIServiceException("Modelo retornó respuesta vacía");
}

if (!IsValidFormat(response))
{
    _logger.LogWarning("Respuesta en formato inesperado: {Response}", response);
    // Intentar parsear o usar respuesta por defecto
}

Patrones de Retry

Retry Simple

public async Task<string> GenerateWithRetryAsync(
    string prompt,
    int maxRetries = 3)
{
    for (int attempt = 0; attempt < maxRetries; attempt++)
    {
        try
        {
            return await _aiService.GenerateAsync(prompt);
        }
        catch (Exception ex) when (attempt < maxRetries - 1)
        {
            _logger.LogWarning(ex, "Intento {Attempt} falló, reintentando...", attempt + 1);
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
        }
    }

    throw new AIServiceException(

quot;Fallo después de {maxRetries} intentos"); } 

Exponential Backoff con Polly

using Polly;

var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .Or<RequestFailedException>(ex => ex.Status == 429 || ex.Status == 503)
    .WaitAndRetryAsync(
        retryCount: 3,
        sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
        onRetry: (exception, timeSpan, retryCount, context) =>
        {
            _logger.LogWarning(
                "Retry {RetryCount} después de {Delay}s: {Error}",
                retryCount, timeSpan.TotalSeconds, exception.Message);
        });

var response = await retryPolicy.ExecuteAsync(
    async () => await _aiService.GenerateAsync(prompt));

Mejores Prácticas

  1. Siempre loggear errores con contexto
  2. Implementar circuit breakers para servicios externos
  3. Tener fallbacks para funcionalidad crítica
  4. Validar respuestas antes de usarlas

Palabras clave: error handling, retry patterns, Polly, resilience, exception handling, AI services

Share this content:

Introducción a Microsoft Semantic Kernel

9. Estrategias de Caché para Servicios de IA 11. Salida JSON Estructurada con LLMs