From e4fe4b2a1e00c499ff370cefb6663b46af248755 Mon Sep 17 00:00:00 2001 From: "haiping008@gmail.com" Date: Thu, 21 Jun 2018 14:14:06 -0500 Subject: [PATCH] fix missing parameter promote --- BotSharp.Core/Engines/Rasa/RasaAi.cs | 20 ++++++++++++--- BotSharp.Core/Engines/RequestExtension.cs | 30 +++++++++++++++++------ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/BotSharp.Core/Engines/Rasa/RasaAi.cs b/BotSharp.Core/Engines/Rasa/RasaAi.cs index 9856e5e6..42d23ab2 100644 --- a/BotSharp.Core/Engines/Rasa/RasaAi.cs +++ b/BotSharp.Core/Engines/Rasa/RasaAi.cs @@ -85,7 +85,6 @@ namespace BotSharp.Core.Engines public void TrainWithContexts() { var corpus = agent.GrabCorpus(dc); - var client = new RestClient($"{Database.Configuration.GetSection("Rasa:Nlu").Value}"); var contextHashs = corpus.UserSays @@ -95,10 +94,25 @@ namespace BotSharp.Core.Engines contextHashs.ForEach(ctx => { + var common_examples = corpus.UserSays.Where(x => x.ContextHash == ctx || x.ContextHash == Guid.Empty.ToString("N")).ToList(); + + // assemble entity and synonyms + var usedEntities = new List(); + common_examples.ForEach(x => + { + if (x.Entities != null) + { + usedEntities.AddRange(x.Entities.Select(y => y.Entity)); + } + }); + usedEntities = usedEntities.Distinct().ToList(); + + var entity_synonyms = corpus.Entities.Where(x => usedEntities.Contains(x.EntityType)).ToList(); + var data = new RasaTrainingData { - Entities = corpus.Entities, - UserSays = corpus.UserSays.Where(x => x.ContextHash == ctx).ToList() + Entities = entity_synonyms, + UserSays = common_examples }; // meet minimal requirement diff --git a/BotSharp.Core/Engines/RequestExtension.cs b/BotSharp.Core/Engines/RequestExtension.cs index b271f9ea..7ca82f5e 100644 --- a/BotSharp.Core/Engines/RequestExtension.cs +++ b/BotSharp.Core/Engines/RequestExtension.cs @@ -44,10 +44,10 @@ namespace BotSharp.Core.Engines aiResponse.Timestamp = DateTime.UtcNow; var intentResponse = HandleIntentPerContextIn(rasa, request, result.Data); - bool missedRequiredField = HandleParameter(rasa.agent, intentResponse, response, request); + HandleParameter(rasa.agent, intentResponse, response, request); HandleMessage(intentResponse); - + aiResponse.Result = new AIResponseResult { Source = "agent", @@ -137,7 +137,7 @@ namespace BotSharp.Core.Engines var intent = (dc.Table().Where(x => x.AgentId == rasa.agent.Id && x.Name == response.Intent.Name) .Include(x => x.Responses).ThenInclude(x => x.Contexts) - .Include(x => x.Responses).ThenInclude(x => x.Parameters) + .Include(x => x.Responses).ThenInclude(x => x.Parameters).ThenInclude(x => x.Prompts) .Include(x => x.Responses).ThenInclude(x => x.Messages)).First(); var intentResponse = ArrayHelper.GetRandom(intent.Responses); @@ -155,9 +155,9 @@ namespace BotSharp.Core.Engines /// /// /// Required field is missed - private static bool HandleParameter(Agent agent, IntentResponse intentResponse, RasaResponse response, AIRequest request) + private static void HandleParameter(Agent agent, IntentResponse intentResponse, RasaResponse response, AIRequest request) { - if (intentResponse == null) return false; + if (intentResponse == null) return; intentResponse.Parameters.ForEach(p => { string query = request.Query.First(); @@ -193,15 +193,29 @@ namespace BotSharp.Core.Engines } } }); - - return intentResponse.Parameters.Any(x => x.Required && String.IsNullOrEmpty(x.Value)); } private static void HandleMessage(IntentResponse intentResponse) { if (intentResponse == null) return; - intentResponse.Messages = intentResponse.Messages.OrderBy(x => x.UpdatedTime).ToList(); + var missingRequiredParameter = intentResponse.Parameters.FirstOrDefault(x => x.Required && String.IsNullOrEmpty(x.Value)); + if (missingRequiredParameter != null) + { + intentResponse.Messages = new List { + new IntentResponseMessage { + Type = AIResponseMessageType.Text, + Speech = ArrayHelper.GetRandom(missingRequiredParameter.Prompts).Prompt, + IntentResponseId = intentResponse.Id, + UpdatedTime = DateTime.UtcNow + } + }; + } + else + { + intentResponse.Messages = intentResponse.Messages.OrderBy(x => x.UpdatedTime).ToList(); + } + intentResponse.Messages.ToList() .ForEach(msg => {