Validare gli output dell'AI con Microsoft.Extensions.AI in ASP.NET Core

di Morgan Pizzini, in ASP.NET Core,

Fino ad ora abbiamo istruito l'AI e restituire uno Structured Output: una risposta che permetta di costruire oggetti C# da un LLM, evitando di dover interpretare manualmente le risposte testuali. Tuttavia, il fatto che il modello restituisca un oggetto conforme alla struttura richiesta non significa necessariamente che i dati siano corretti o utilizzabili dall'applicazione.

Un modello potrebbe, ad esempio, classificare una richiesta con una priorità non prevista, omettere un'informazione importante oppure restituire valori formalmente validi ma incoerenti con le regole applicative. Per questo motivo, è importante affiancare alla generazione strutturata un livello di validazione.

Possiamo sfruttare le funzionalità standard di .NET, come le Data Annotations, per definire i vincoli direttamente sul modello dei dati:

using System.ComponentModel.DataAnnotations;

public class SupportTicket
{
    [Required]
    public string Category { get; set; } = string.Empty;

    [Required]
    [MinLength(10)]
    public string Description { get; set; } = string.Empty;

    [Required]
    [RegularExpression("^(Low|Medium|High)$")]
    public string Priority { get; set; } = string.Empty;
}

Dopo aver ottenuto la risposta strutturata tramite GetResponseAsync<T>, possiamo utilizzare il validatore di .NET per verificare che l'oggetto rispetti i vincoli dichiarati:

var response = await chatClient.GetResponseAsync<SupportTicket>(
    "Analizza questa richiesta: non riesco ad accedere al mio account.");

var ticket = response.Result;

if (ticket is null)
    throw new InvalidOperationException("Risposta AI non disponibile.");

var context = new ValidationContext(ticket);
var results = new List<ValidationResult>();

if (!Validator.TryValidateObject(
    ticket, context, results, validateAllProperties: true))
{
    foreach (var error in results)
        Console.WriteLine(error.ErrorMessage);
}

La distinzione è importante: lo Structured Output cerca di garantire che la risposta rispetti uno schema, mentre la validazione applicativa verifica che i dati soddisfino effettivamente le regole definite dal sistema.

Quando una validazione fallisce, l'applicazione può decidere se scartare il risultato, richiedere una nuova generazione al modello oppure avviare un passaggio di correzione fornendo all'LLM gli errori rilevati. Quest'ultima possibilità permette di costruire flussi più resilienti, nei quali il modello perfeziona il prompt per tentare di correggere il proprio funzionamento futuro.

Commenti

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi