Negli ultimi script abbiamo introdotto i concetti fondamentali per realizzare applicazioni che sfruttino Semantic Kernel e i Large Language Model, e integrarle con ASP.NET Core. In particolare, abbiamo visto come con i Plugin possiamo esporre i nostri servizi applicativi a questi modelli, così da fornire all'utente un'esperienza davvero mirata al tipo di applicazione che abbiamo realizzato.
Ma cosa succede quando uno di questi servizi solleva un'eccezione? Come dobbiamo comportarci? E soprattutto come possiamo fornire un feedback al modello stesso?
La buona notizia è che non dobbiamo fare granché, visto che SemanticKernel si occupa di girare ogni eventuale eccezione al modello, così che quest'ultimo possa interpretarla.
Pertanto, una buona pratica è quella di sfruttare queste casistiche per restituire un messaggio di errore comprensibile, così che il model possa comportarsi di conseguenza.
Guardiamo per esempio il codice in basso:
[KernelFunction("add_order")]
[Description("This function allows you to add a new order to the database")]
[return: Description("The order with the generated Id")]
public async Task<Order> AddOrderAsync(Order order)
{
throw new Exception("Insufficient funds");
}In questa funzione abbiamo sollevato un'eccezione comunicando la mancanza di fondi per procedere all'acquisto. Questo è sufficiente per far sì che, provando a creare un nuovo ordine
User: I would like to purchase a new laptop
il model risponda nel modo seguente:

Queste eccezioni, se sapientemente utilizzate, possono anche essere sfruttate per logiche di retry, nel caso in cui abbia senso. Per esempio, immaginiamo che la ricerca di ordini supporti solo nomi di prodotto scritti in minuscolo (dovremmo spiegare questo requisito tramite le annotation, ma in questo caso non l'abbiamo fatto):
[KernelFunction("search_orders")]
[Description("This functions allows you to search the orders in the database.")]
[return: Description("A list of orders matching the search criteria.")]
public async Task<IEnumerable<Order>> SearchOrdersAsync(OrderSearch search)
{
if (search.Product.Any(char.IsUpper))
{
throw new Exception("The product name must be only in lowercase letters");
}
...
}A questo punto, chiediamo al model qualcosa come:
How many iPhones have been ordered?
Spulciando il log possiamo notare come il model abbia effettuato un'invocazione sbagliata, ricevuto un errore e poi riprovato con il parametro correttamente in minuscolo:

Ovviamente questo avviene in maniera del tutto trasparente per l'utente, che semplicemente riceverà la risposta
Agent: There have been no orders for iPhones.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Le cron expression di un workflow di GitHub
Gestire gli errori nelle Promise JavaScript con try()
.NET Aspire per applicazioni distribuite
Collegare applicazioni server e client con .NET Aspire
Configurare OpenAI in .NET Aspire
Mischiare codice server side e client side in una query LINQ con Entity Framework
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Arricchire l'interfaccia di .NET Aspire
Anonimizzare i dati sensibili nei log di Azure Front Door
Utilizzare i command service nei test con .NET Aspire
Importare un servizio esterno in .NET Aspire
Integrare un servizio esterno con .NET Aspire
I più letti di oggi
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Gli oggetti CallOut di Expression Blend 4.0
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Sfruttare una CDN con i bundle di ASP.NET
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Le DirectInk API nella Universal Windows Platform
- Inserire le news di Punto Informatico nel proprio sito


