This entry is part 11 of 25 in the series Introducción a Microsoft Semantic Kernel

Introducción

Este tutorial cubre aspectos esenciales de Salida JSON Estructurada con LLMs en aplicaciones .NET con Semantic Kernel y Azure OpenAI.

Conceptos Clave

Fundamentos

La implementación correcta de estos conceptos es crucial para aplicaciones de IA robustas y escalables.

// Ejemplo de implementación
public class ExampleService
{
    private readonly Kernel _kernel;
    private readonly ILogger<ExampleService> _logger;

    public ExampleService(Kernel kernel, ILogger<ExampleService> logger)
    {
        _kernel = kernel;
        _logger = logger;
    }

    public async Task<string> ProcessAsync(string input)
    {
        try
        {
            _logger.LogInformation("Procesando input: {Input}", input);

            var function = _kernel.CreateFunctionFromPrompt(
                "Procesa: {{\}}");

            var result = await _kernel.InvokeAsync(function, new KernelArguments
            {
                ["input"] = input
            });

            return result.GetValue<string>() ?? string.Empty;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error procesando input");
            throw;
        }
    }
}

Implementación Práctica

Paso 1: Configuración

Configura los componentes necesarios en tu aplicación:

builder.Services.AddScoped<ExampleService>();
builder.Services.AddLogging();

Paso 2: Uso

Implementa la lógica específica para tu caso de uso:

var service = serviceProvider.GetRequiredService<ExampleService>();
var result = await service.ProcessAsync("ejemplo");
Console.WriteLine(result);

Mejores Prácticas

  1. Validación: Siempre valida las entradas y salidas
  2. Logging: Implementa logging estructurado
  3. Manejo de Errores: Usa try-catch apropiadamente
  4. Testing: Escribe tests unitarios e de integración
  5. Documentación: Documenta tu código y APIs
  6. Monitoreo: Implementa métricas y alertas
  7. Seguridad: Protege credenciales y datos sensibles

Patrones Avanzados

Patrón 1: Factory

public interface IServiceFactory
{
    ExampleService Create();
}

public class ServiceFactory : IServiceFactory
{
    private readonly IServiceProvider _serviceProvider;

    public ServiceFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public ExampleService Create()
    {
        return _serviceProvider.GetRequiredService<ExampleService>();
    }
}

Patrón 2: Strategy

public interface IProcessingStrategy
{
    Task<string> ProcessAsync(string input);
}

public class StandardStrategy : IProcessingStrategy
{
    public async Task<string> ProcessAsync(string input)
    {
        // Implementación estándar
        return await Task.FromResult(input);
    }
}

public class AdvancedStrategy : IProcessingStrategy
{
    public async Task<string> ProcessAsync(string input)
    {
        // Implementación avanzada
        return await Task.FromResult(input.ToUpper());
    }
}

Testing

Unit Tests

using Xunit;
using Moq;

public class ExampleServiceTests
{
    [Fact]
    public async Task ProcessAsync_WithValidInput_ReturnsResult()
    {
        // Arrange
        var mockKernel = new Mock<Kernel>();
        var mockLogger = new Mock<ILogger<ExampleService>>();
        var service = new ExampleService(mockKernel.Object, mockLogger.Object);

        // Act
        var result = await service.ProcessAsync("test");

        // Assert
        Assert.NotNull(result);
    }
}

Integration Tests

[Collection("Integration")]
public class ExampleServiceIntegrationTests
{
    [Fact]
    public async Task ProcessAsync_EndToEnd_Success()
    {
        // Configurar servicio real
        var kernel = CreateRealKernel();
        var logger = NullLogger<ExampleService>.Instance;
        var service = new ExampleService(kernel, logger);

        // Ejecutar
        var result = await service.ProcessAsync("integration test");

        // Verificar
        Assert.NotEmpty(result);
    }

    private Kernel CreateRealKernel()
    {
        // Configuración real para tests de integración
        return Kernel.CreateBuilder().Build();
    }
}

Optimización

Performance

  1. Usa caché cuando sea apropiado
  2. Implementa batching para operaciones múltiples
  3. Considera async/await correctamente
  4. Monitorea métricas de rendimiento

Escalabilidad

  1. Diseña para procesamiento distribuido
  2. Usa message queues para operaciones asíncronas
  3. Implementa load balancing
  4. Considera sharding de datos

Conclusión

La implementación correcta de estos conceptos es fundamental para aplicaciones de IA robustas y escalables. Sigue las mejores prácticas, implementa testing exhaustivo, y monitorea constantemente el rendimiento en producción.

Recursos Adicionales

  • Documentación oficial de Semantic Kernel
  • Guías de Azure OpenAI
  • Patrones de diseño en .NET
  • Mejores prácticas de arquitectura

Palabras clave: structured output, JSON, schema validation, type safety, .NET, C#, Semantic Kernel, Azure OpenAI, best practices

Share this content:

Introducción a Microsoft Semantic Kernel

0. Manejo de Errores en Aplicaciones de IA con .NET 2. Testing de Servicios de IA en .NET

por David Cantón Nadales

David Cantón Nadales, ingeniero de software de Sevilla, España, es autor del bestseller Build Your own Metaverse with Unity. Reconocido como Microsoft MVP y Top Voices en Aplicaciones Móviles de LinkedIn. Con más de 20 años de experiencia, David ha liderado cientos proyectos a lo largo de su carrera, incluyendo videojuegos y aplicaciones de realidad virtual y aumentada con Oculus, Hololens, HTC Vive, DayDream y LeapMotion. Ha trabajado como Tech Lead en importantes multinacionales como Grupo Viajes El Corte Inglés y actualmente en SCRM Lidl del Grupo Schwarz. Fue embajador de la comunidad Samsung Dev Spain y organizador del Google Developers Group Sevilla. Durante el confinamiento por COVID-19, destacó como emprendedor social con la creación de Grita, una red social que facilitaba el apoyo psicológico entre personas. En 2022, ganó los Samsung Top Developers Awards.