From 562b5dd7c5bfe3e65d35b85795f0f1126eff8f4c Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Thu, 25 Oct 2018 21:30:59 -0500 Subject: [PATCH] Add fallback function. --- .../BotSharp/BotSharpIntentClassifier.cs | 5 +- .../Engines/BotSharp/BotSharpTokenizer.cs | 1 + BotSharp.Core/Engines/NlpDoc.cs | 1 + BotSharp.Core/PlatformBuilderBase.cs | 61 ++++++++++-------- .../IPlatformBuilder.cs | 2 + .../AiResponse}/TextClassificationResult.cs | 4 +- .../App_Data/AgentArchive/BotSharp_zh-cn.zip | Bin 5969 -> 5824 bytes BotSharp.WebHost/BotSharp.WebHost.csproj | 2 +- BotSharp.WebHost/Settings/app.json | 1 + BotSharp.sln | 26 ++++++++ 10 files changed, 70 insertions(+), 33 deletions(-) rename {BotSharp.Core/Engines => BotSharp.Platform.Models/AiResponse}/TextClassificationResult.cs (75%) diff --git a/BotSharp.Core/Engines/BotSharp/BotSharpIntentClassifier.cs b/BotSharp.Core/Engines/BotSharp/BotSharpIntentClassifier.cs index 3b4caf5a..4306effa 100644 --- a/BotSharp.Core/Engines/BotSharp/BotSharpIntentClassifier.cs +++ b/BotSharp.Core/Engines/BotSharp/BotSharpIntentClassifier.cs @@ -1,16 +1,13 @@ using BotSharp.Core.Abstractions; using BotSharp.NLP; using BotSharp.NLP.Classify; -using BotSharp.NLP.Txt2Vec; using BotSharp.Platform.Models; +using BotSharp.Platform.Models.AiResponse; using BotSharp.Platform.Models.MachineLearning; using Microsoft.Extensions.Configuration; -using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace BotSharp.Core.Engines.BotSharp diff --git a/BotSharp.Core/Engines/BotSharp/BotSharpTokenizer.cs b/BotSharp.Core/Engines/BotSharp/BotSharpTokenizer.cs index 835a4d59..70eebbe3 100644 --- a/BotSharp.Core/Engines/BotSharp/BotSharpTokenizer.cs +++ b/BotSharp.Core/Engines/BotSharp/BotSharpTokenizer.cs @@ -2,6 +2,7 @@ using BotSharp.NLP; using BotSharp.NLP.Tokenize; using BotSharp.Platform.Models; +using BotSharp.Platform.Models.AiResponse; using BotSharp.Platform.Models.MachineLearning; using Microsoft.Extensions.Configuration; using System; diff --git a/BotSharp.Core/Engines/NlpDoc.cs b/BotSharp.Core/Engines/NlpDoc.cs index e6155b09..17dafd33 100644 --- a/BotSharp.Core/Engines/NlpDoc.cs +++ b/BotSharp.Core/Engines/NlpDoc.cs @@ -1,5 +1,6 @@ using BotSharp.Core.Abstractions; using BotSharp.NLP.Tokenize; +using BotSharp.Platform.Models.AiResponse; using BotSharp.Platform.Models.Entities; using System; using System.Collections.Generic; diff --git a/BotSharp.Core/PlatformBuilderBase.cs b/BotSharp.Core/PlatformBuilderBase.cs index 789ef29a..9a4bf6f5 100644 --- a/BotSharp.Core/PlatformBuilderBase.cs +++ b/BotSharp.Core/PlatformBuilderBase.cs @@ -158,31 +158,15 @@ namespace BotSharp.Core if (predictedIntent.Confidence < Agent.MlConfig.MinConfidence) { - var data = new + predictedIntent = await FallbackResponse(request); + + predictedIntent.Confidence = Agent.MlConfig.MinConfidence; + predictedIntent.Label = "fallback"; + + Agent.Intents.Add(new Intent { - token = "openbot", - info = request.Text - }; - - using (var client = new HttpClient()) - { - var response = await client.PostAsync( - "https://api.ownthink.com/bot", - new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")); - var content = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(content); - - predictedIntent = new TextClassificationResult - { - Confidence = Agent.MlConfig.MinConfidence, - Classifier = "ownthink", - Label = "fallback" - }; - - Agent.Intents.Add(new Intent - { - Name = predictedIntent.Label, - Responses = new List + Name = predictedIntent.Label, + Responses = new List { new IntentResponse { @@ -191,14 +175,13 @@ namespace BotSharp.Core { new IntentResponseMessage { - Speech = "[\"" + result["text"] + "\"]", + Speech = "\"" + predictedIntent.Text + "\"", Type = AIResponseMessageType.Text } } } } - }); - } + }); } var aiResponse = new AiResponse @@ -215,6 +198,30 @@ namespace BotSharp.Core return await AssembleResult(aiResponse); } + public virtual async Task FallbackResponse(AiRequest request) + { + var data = new + { + token = "openbot", + info = request.Text + }; + + using (var client = new HttpClient()) + { + var response = await client.PostAsync( + "https://api.ownthink.com/bot", + new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")); + var content = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject(content); + + return new TextClassificationResult + { + Classifier = "ownthink", + Text = result["text"].ToString() + }; + } + } + public virtual async Task AssembleResult(AiResponse response) { throw new NotImplementedException(); diff --git a/BotSharp.Platform.Abstraction/IPlatformBuilder.cs b/BotSharp.Platform.Abstraction/IPlatformBuilder.cs index 499c2e63..10fe73c0 100644 --- a/BotSharp.Platform.Abstraction/IPlatformBuilder.cs +++ b/BotSharp.Platform.Abstraction/IPlatformBuilder.cs @@ -52,5 +52,7 @@ namespace BotSharp.Platform.Abstraction Task TextRequest(AiRequest request); Task AssembleResult(AiResponse response); + + Task FallbackResponse(AiRequest request); } } diff --git a/BotSharp.Core/Engines/TextClassificationResult.cs b/BotSharp.Platform.Models/AiResponse/TextClassificationResult.cs similarity index 75% rename from BotSharp.Core/Engines/TextClassificationResult.cs rename to BotSharp.Platform.Models/AiResponse/TextClassificationResult.cs index a415ec83..dcf3fbfe 100644 --- a/BotSharp.Core/Engines/TextClassificationResult.cs +++ b/BotSharp.Platform.Models/AiResponse/TextClassificationResult.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace BotSharp.Core.Engines +namespace BotSharp.Platform.Models.AiResponse { public class TextClassificationResult { @@ -10,6 +10,8 @@ namespace BotSharp.Core.Engines public String Label { get; set; } + public string Text { get; set; } + public double Confidence { get; set; } } } diff --git a/BotSharp.WebHost/App_Data/AgentArchive/BotSharp_zh-cn.zip b/BotSharp.WebHost/App_Data/AgentArchive/BotSharp_zh-cn.zip index 972a28efc10fa42947187218564398934a9f0079..f92eb7647e2a089db1a1bd5e53ae294f1eeabda0 100644 GIT binary patch delta 3159 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 delta 3350 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 K(+$YMyMF^1|9(>d diff --git a/BotSharp.WebHost/BotSharp.WebHost.csproj b/BotSharp.WebHost/BotSharp.WebHost.csproj index a833bf0d..cd448531 100644 --- a/BotSharp.WebHost/BotSharp.WebHost.csproj +++ b/BotSharp.WebHost/BotSharp.WebHost.csproj @@ -84,7 +84,7 @@ - + diff --git a/BotSharp.WebHost/Settings/app.json b/BotSharp.WebHost/Settings/app.json index c79a99a9..c05567cd 100644 --- a/BotSharp.WebHost/Settings/app.json +++ b/BotSharp.WebHost/Settings/app.json @@ -3,6 +3,7 @@ "assemblies": "BotSharp.Core", "platformModuleName": "DialogflowAi", + "overrideFallback": false, "modules": [ /*{ diff --git a/BotSharp.sln b/BotSharp.sln index 67bd1734..8e81b573 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -24,6 +24,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Models", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Dialogflow", "..\botsharp-dialogflow\BotSharp.Platform.Dialogflow\BotSharp.Platform.Dialogflow.csproj", "{6A7E5DC1-3AE3-42C1-8F67-3131783646EB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Channel.Weixin", "..\botsharp-channel-weixin\BotSharp.Channel.Weixin\BotSharp.Channel.Weixin.csproj", "{640AB037-2338-4550-A21A-0DB7C2A350F1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution ARTICULATE|Any CPU = ARTICULATE|Any CPU @@ -232,6 +234,30 @@ Global {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|Any CPU.Build.0 = Debug|Any CPU {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|x64.ActiveCfg = Debug|Any CPU {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|x64.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.ARTICULATE|Any CPU.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.ARTICULATE|Any CPU.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.ARTICULATE|x64.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.ARTICULATE|x64.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Debug|x64.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.RASA|Any CPU.ActiveCfg = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.RASA|Any CPU.Build.0 = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.RASA|x64.ActiveCfg = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.RASA|x64.Build.0 = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Release|Any CPU.Build.0 = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Release|x64.ActiveCfg = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Release|x64.Build.0 = Release|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Test|Any CPU.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Test|Any CPU.Build.0 = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Test|x64.ActiveCfg = Debug|Any CPU + {640AB037-2338-4550-A21A-0DB7C2A350F1}.Test|x64.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE