// effettua una predizione e restituisce il risultato private static void MakePrediction() { ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema); AsiQuestion singleQuestion = new AsiQuestion() { Question = "Sto avendo problemi con la valorizzazione di magazzino di fine anno, aiuto!" }; var predictionEngine = _mlContext.Model.CreatePredictionEngine <AsiQuestion, QuestionPrediction>(loadedModel); var prediction = predictionEngine.Predict(singleQuestion); var dict = ConvertScoresArrayIntoScoresDictionary(predictionEngine.OutputSchema, "Score", prediction.Score); Console.WriteLine($"=============== Single Prediction - Result: {prediction.Category} Accuracy: ==============="); }
// metodo che viene invocato per ogni messaggio che viene inviato dall'utente protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { // creo un accessor per accedere ai dati salvati della conversazione var conversationStateAccessors = _conversationState.CreateProperty <ConversationData>(nameof(ConversationData)); var conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData()); // ottengo la stringa del messaggio inviato dall'utente string messageText = turnContext.Activity.Text; switch (conversationData.state) { case ConversationData.AsiBotState.Ready: AsiQuestion singleQuestion = new AsiQuestion() { Question = messageText }; var categoriesReponse = _mlManager.MakePrediction(singleQuestion); if (categoriesReponse.Count == 0) { var noCategoryMessage = new ChatBotMessage(new string[] { "Non è stato possibile identificare la categoria del problema, si prega di contattare l'assistenza clienti alla mail [email protected]" }); typeAnswers(noCategoryMessage.GetActivities(), turnContext, cancellationToken); conversationData.state = ConversationData.AsiBotState.Ready; conversationData.lastActivity = MessageFactory.Text(""); conversationData.originalMessage = ""; conversationData.possibleCategory = ""; } else if (categoriesReponse.Count == 1) { string firstMessage = $"Categoria trovata: {categoriesReponse.First().getCategoryName()}"; string secondMessage = $"Puoi provare a risolvere il problema al seguente link -url-{categoriesReponse.First().getDocumentationUrl()}-url-"; string thirdMessage = "Questa risposta ti è stata utile?"; var oneCategoryMessage = new ChatBotMessage(new string[] { firstMessage, secondMessage, thirdMessage }, new string[] { "Si", "No" }); var oneCategoryActivities = oneCategoryMessage.GetActivities(); typeAnswers(oneCategoryActivities, turnContext, cancellationToken); conversationData.state = ConversationData.AsiBotState.WaitingApproval; conversationData.lastActivity = oneCategoryActivities.Last(); conversationData.originalMessage = messageText; conversationData.possibleCategory = categoriesReponse.First().getCategoryName(); } else { var ambiguosMessage = new ChatBotMessage(new string[] { "Di quali di queste categorie stai parlando?" }, categoriesReponse.Select(category => category.getCategoryName()).ToArray()); var ambiguosActivities = ambiguosMessage.GetActivities(); typeAnswers(ambiguosActivities, turnContext, cancellationToken); conversationData.state = ConversationData.AsiBotState.WaitingDisambiguation; conversationData.lastActivity = ambiguosActivities.Last(); conversationData.originalMessage = messageText; conversationData.possibleCategory = ""; } break; case ConversationData.AsiBotState.WaitingDisambiguation: var inputCategory = new AsiCategoryHandler(messageText); // se l'utente non risponde correttamente alla domanda, gli viene riproposta rimanendo nello stesso stato if (inputCategory.category == AsiCategoryHandler.AsiCategory.Undefined) { await turnContext.SendActivityAsync(conversationData.lastActivity); return; } var disambiguationMessage = new ChatBotMessage() { TextMessages = new string[] { $"Il manuale di riferimento è disponibile al link -url-{inputCategory.getDocumentationUrl()}-url-", "Ti è stato utile?" }, Options = new string[] { "Si", "No" } }; var activities = disambiguationMessage.GetActivities(); typeAnswers(activities, turnContext, cancellationToken); conversationData.lastActivity = activities.Last(); conversationData.state = ConversationData.AsiBotState.WaitingApproval; conversationData.possibleCategory = inputCategory.getCategoryName(); break; case ConversationData.AsiBotState.WaitingApproval: // se l'utente non risponde Si o No gli viene riproposta la domanda if (!messageText.Equals("Si") && !messageText.Equals("No")) { await turnContext.SendActivityAsync(conversationData.lastActivity, cancellationToken); return; } if (messageText.Equals("Si")) { _datasetManager.insertNewQuestion(conversationData.originalMessage, conversationData.possibleCategory); await turnContext.SendActivityAsync(MessageFactory.Text("Grazie per aver utilizzato il nostro servizio, arrivederci")); conversationData.lastActivity = MessageFactory.Text(""); conversationData.state = ConversationData.AsiBotState.Ready; conversationData.originalMessage = ""; conversationData.possibleCategory = ""; } else { var quickResponsesMessage = generateWorkInProgressActivity(); await turnContext.SendActivityAsync(quickResponsesMessage, cancellationToken); conversationData.state = ConversationData.AsiBotState.EvaluatingQuickResponses; conversationData.possibleCategory = ""; } break; case ConversationData.AsiBotState.EvaluatingQuickResponses: var inCategory = new QuickResponseCategoryHandler(messageText); if (inCategory.category == QuickResponseCategoryHandler.QuickResponseCategory.Undefined && !(messageText.Equals("Nessuna delle precedenti"))) { await turnContext.SendActivityAsync(generateWorkInProgressActivity()); return; } if (inCategory.category == QuickResponseCategoryHandler.QuickResponseCategory.Undefined) { await turnContext.SendActivityAsync(MessageFactory.Text("Ci dispiace non essere riusciti a risolvere il tuo problema, buona giornata")); } else { _datasetManager.insertNewWorkInProgressQuestion(conversationData.originalMessage, inCategory.getCategoryName()); await turnContext.SendActivityAsync(MessageFactory.Text("Grazie per il tuo feedback e per aver utilizzato il nostro servizio, arrivederci")); } conversationData.lastActivity = MessageFactory.Text(""); conversationData.state = ConversationData.AsiBotState.Ready; conversationData.originalMessage = ""; conversationData.possibleCategory = ""; break; } }