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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare comandi nella dashboard .NET Aspire
Integrare OpenTelemetry direttamente in Azure Monitor
Gestire lo streaming AI con Angular Signals e React State
Structured Output con Microsoft.Extensions.AI: ottenere oggetti C# da un LLM
Importare un servizio esterno in .NET Aspire
Mappare una complex property di una entity su un campo JSON
Eseguire i pre-commit hook di git con dependabot
Lockfiles per le GitHub Actions
Running workloads and operations with Azure Kubernetes Service
Semplificare i deployment con le label in Azure Container App
Evitare il cache poisoning nei workflow di GitHub
Creare popup e menu nativi in HTML con la Popover API
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


