Scenari di Botler - RetiSpA/botler GitHub Wiki
Interfaccia IScenario
Questa interfaccia rappresenta con le sue proprietà uno scenario di conversazione, uno scenario è un insieme di dialoghi, anche con fini diversi, ma che fanno parte dello stesso argomento, come lo scenario che riguarda Outlook avrà vari dialoghi tra cui 'LeggiMail' o 'VisualizzaAppuntamento'.
public interface IScenario
{
Intent ScenarioIntent{ get; set; }
bool NeedAuthentication { get; set; }
string ScenarioID { get; set; }
string AssociatedScenario { get; set; }
Task HandleScenarioStateAsync(ITurnContext turn, BotlerAccessors accessors, LuisServiceResult luisServiceResult);
}
Classi astratte che estendono IScenario
Esistono due classi astratte che estodono l'interfaccia IScenario:
-
DescritpionScenario : il quale rappresenta uno stato in cui l'utente vuole svolgere un attività, ma non ha abbastanza informazioni per concluderla ( crea un ticket e.g ), per cui il bot in questo stato controllerà se sono state raggiunte le entità necessario per l'azione (un azione è un Intent in LUIS, nel bot viene mappata con una classe model Intent che rappresenterà tutte le caratteristiche) in caso il bot avrò raccolto le entità necessarie per continuare, cambierà stato.
-
ExecutionScenario : Stato in cui vengono eseguite le azioni, e quindi i dialoghi, con le entità raccolte, eventualmente precedentemente dallo scenario DescriptionScenario.
Casi in cui uno stato può cambiare
- ExecutionScenario -> DescriptionScenario : Nel turno viene riconosciuto un TopIntent con Score > 0.75 , ma non ci sono tutte le entità necessarie.
Prendiamo un frammento di codice preso nel metodo nella classe
public static class ScenarioRecognizer
{
private static IScenario GetScenarioFromLuis(LuisServiceResult luisServiceResult, BotlerAccessors accessors,
ITurnContext turn)
}
// Se è stato riconosciuto un (topIntent.Equals(RichiestaSupportoIntent) && (score >= 0.75))
if (isASupportIntent(luisServiceResult))
{
// Controlla se il turno e quindi il messaggio contiene le entità necessarie per continuare
// Crea e ritorna lo scenario Description relativo al supporto
if (intent.EntitiesCollected.Count < intent.EntityLowerBound)
{
return ScenarioFactory.FactoryMethod(accessors, turn, SupportoDescription, intent);
}
// Altrimenti ritorna lo scenario Execution relativo
else
{
return ScenarioFactory.FactoryMethod(accessors, turn, Supporto, intent);
}
}
- Descripition -> Execution : Siamo già in uno scenario di tipo Description, ma le entità raccolte sono abbastanza da poter eseguire l'azione che l'utente ci ha chiesto. Questo cambio di stato avviene nella classe BotStateContextController perchè bisogna sapere il contesto precedente, cioè le entità raccolte nei turni precedenti.
public static IScenario CheckLastDescriptionScenario(IScenario scenario, DescriptionScenario lastDescriptionScenario,
BotlerAccessors accessors, ITurnContext turn, LuisServiceResult luisServiceResult)
{
if (scenario.ScenarioIntent.EntitiesCollected.Count > 0)
{
foreach(var ent in scenario.ScenarioIntent.EntitiesCollected)
{
lastDescriptionScenario.ScenarioIntent.EntitiesCollected.Add(ent);
}
if (lastDescriptionScenario.EntityLowerBoundReach())
{
return ChangeScenarioState(accessors, turn, lastDescriptionScenario);
}
return lastDescriptionScenario;
}
return scenario;
}
Per una lista aggiornata di Scenari attivi controllare : Botler\Dialogs\Scenari