2017-06-16 23 views
0

我在bot框架中使用luis.ai創建了一個bot。如何在不同語言的兩個luis.ai對話框之間切換

在我的luis帳戶中,我創建了兩個具有不同語言文化的應用程序。一個應用程序的英文和其他法語。兩者都有他們的意圖。

在我的代碼中,我打電話一次英語對話框,和其他時間法語luis對話框。

我的問題是,當我開始在英語Facebook頻道(信使)的談話我得到正確的答案。當我輸入法語時,在這個機器人和通道里面,我的機器人不會調用法語對話框。

當我開始在Facebook上的法語版本的談話......機器人無法識別正確的對話框......但捕獲錯誤:「哎呀有一些問題與我們的系統

我試着鍵入英語發音,然後我得到:哎呀!太多嘗試:(但不用擔心,我正在處理該例外,你可以再試一次!

我的想法是:當我在facebook裏面英語,然後點擊:開始......我的對話以英文對話框開始(AlltheBot.cs)。如果我輸入法語單詞:salut,demarrer bot可以轉到法語對話框(FrenchLuis.cs)。周圍,​​當我在Facebook的法語版本米當我點擊Demarrer以法語開始時,然後如果我在英語對話框中輸入hello來轉發,則會出現y對話。

我的代碼是在這裏:

MessageController.cs

namespace MultiDialogsBot 
{ 
using System.Net; 
using System.Net.Http; 
using System.Threading.Tasks; 
using System.Web.Http; 
using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Connector; 
using FirstBotApplication.Dialogs; 
using System.Linq; 
using System; 

[BotAuthentication] 
public class MessagesController : ApiController 
{ 
    /// <summary> 
    /// POST: api/Messages 
    /// Receive a message from a user and reply to it 
    /// </summary> 
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity) 
    { 
     if (activity.Type == ActivityTypes.Message) 
     { 
      await Conversation.SendAsync(activity,() => new RootDialog()); 
     } 
     else 
     { 
      this.HandleSystemMessage(activity); 
     } 

     var response = Request.CreateResponse(HttpStatusCode.OK); 
     return response; 
     } 

    private Activity HandleSystemMessage(Activity message) 
    { 
     if (message.Type == ActivityTypes.DeleteUserData) 
     { 
      // Implement user deletion here 
      // If we handle user deletion, return a real message 
     } 
     else if (message.Type == ActivityTypes.ConversationUpdate) 
     { 
      // Handle conversation state changes, like members being added 
     and removed 
      // Use Activity.MembersAdded and Activity.MembersRemoved and 
     Activity.Action for info 

      IConversationUpdateActivity update = message; 
      var client = new ConnectorClient(new Uri(message.ServiceUrl), 
      new MicrosoftAppCredentials()); 
      if (update.MembersAdded != null && update.MembersAdded.Any()) 
      { 
       foreach (var newMember in update.MembersAdded) 
       { 
        if (newMember.Id != message.Recipient.Id && newMember.Id 
      != message.Conversation.Id) 
        { 
         var reply = message.CreateReply(); 
         reply.Text = $"Welcome" + " " + 
     message.Recipient.Name + " ! You are a new member! If you want to see 
        help menu , type : help"; 
         client.Conversations.ReplyToActivityAsync(reply); 
        } 
       } 
      } 
      // Not available in all channels 
     } 
     else if (message.Type == ActivityTypes.ContactRelationUpdate) 
     { 
      // Handle add/remove from contact lists 
      // Activity.From + Activity.Action represent what happened 
     } 
     else if (message.Type == ActivityTypes.Typing) 
     { 
      // Handle knowing tha the user is typing 
     } 
     else if (message.Type == ActivityTypes.Ping) 
     { 
     } 

     return null; 
    } 


} 

}

RootDialog.cs

namespace FirstBotApplication.Dialogs 
{ 
using System; 
using System.Collections.Generic; 
using System.Threading; 
using System.Threading.Tasks; 
using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Connector; 

[Serializable] 
public class RootDialog : IDialog<object> 
{ 


    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(this.MessageReceivedAsync); 
    } 

    public virtual async Task MessageReceivedAsync(IDialogContext context, 
     IAwaitable<IMessageActivity> result) 
    { 
     var message = await result; 

     if (message.Text.ToLower().Contains("Get Started") || 
     message.Text.ToLower().Contains("hello") || 
     message.Text.ToLower().Contains("hi")) 
     { 
      context.Call(new AllTheBot(), this.ResumeAfterOptionDialog); 

     } 

     else if (message.Text.ToLower().Contains("Démarrer") || 
    message.Text.ToLower().Contains("salut") || 
     message.Text.ToLower().Contains("french")) 
     { 
      context.Call(new FrenchLuis(), this.ResumeAfterOptionDialog); 

     } 
     else 
     { 
      await context.PostAsync($"Ooops! There are some problems with our system"); 
     } 

    } 

    private async Task ResumeAfterOptionDialog(IDialogContext context, 
    IAwaitable<object> result) 
    { 
     await context.PostAsync($"Ooops! Too many attemps :(. But don't 
    worry, I'm handling that exception and you can try again!"); 
    } 

     } 
    } 

FrenchLuis.cs

using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Builder.Luis; 
using Microsoft.Bot.Builder.Luis.Models; 
using Microsoft.Bot.Connector; 
using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Linq; 
using System.Threading.Tasks; 
using System.Web; 


    namespace FirstBotApplication 
    { 
    // [LuisModel("Please Enter Your LUIS Model ID", "Please Enter Your 
    LUIS 
    Subscription Key")] 

    [Serializable] 

[LuisModel("aaaaaaa", "xxxxxxxxx")] 



public class FrenchLuis : LuisDialog<object> 
{ 
    internal static string results; 

    // internal static string results; 
    [LuisIntent("None")] 
    [LuisIntent("")] 
    public async Task None(IDialogContext context, LuisResult result) 
    { 
     string message = $"Désolé je n'ai pas compris '{result.Query}'. 
    Veuillez reformuler votre question"; 

     await context.PostAsync(message); 

     context.Wait(this.MessageReceived); 
     context.Done(true); 

    } 



    //french luis.ai 
    [LuisIntent("demarrerintent")] 
    public async Task demarrerintent(IDialogContext context, 
    IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 

     await context.PostAsync("Bienvenue :) "); 

     context.Done(true); 


    } 

    [LuisIntent("denous")] 
    public async Task denous(IDialogContext context, 
    IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 

     await context.PostAsync(" Nous sommes ....."); 

     context.Done(true); 
    } 

    [LuisIntent("quisommes")] 
    public async Task quisommes(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 

     await context.PostAsync("Je suis un robot"); 
     context.Done(true); 
     // context.Wait(MessageReceived); 

    } 
    }} 

AllTheBot.cs

using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Builder.Luis; 
using Microsoft.Bot.Builder.Luis.Models; 
using Microsoft.Bot.Connector; 
    using System; 
    using System.Collections.Generic; 
    using System.IO; 
using System.Linq; 
    using System.Threading.Tasks; 
using System.Web; 


    namespace FirstBotApplication 
    { 

    [LuisModel("bbbbbb", "xxxxxxx")] 

    [Serializable] 


    public class AllTheBot : LuisDialog<object> 
    { 
    internal static string results; 

    // internal static string results; 
    [LuisIntent("None")] 
    [LuisIntent("")] 
    public async Task None(IDialogContext context, LuisResult result) 
    { 
     string message = $"Sorry, I did not understand '{result.Query}'. 
     Please reformulate your question"; 

     await context.PostAsync(message); 
     context.Done(true); 

     // context.Wait(this.MessageReceived); 

    } 


    [LuisIntent("grettings")] 
    [LuisIntent("intentfr")] 
    public async Task Greeting(IDialogContext context, 
    IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 


      await context.PostAsync("Welcome "); 

     context.Done(true); 

    } 



    [LuisIntent("test")] 
    public async Task test(IDialogContext context, 
    IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 
     await context.PostAsync("Do you want to test our bot ? We suggest to 
    type : hi or who are you, help etc.."); 
     context.Wait(MessageReceived); 
    } 
    }} 

回答

3

我看看你的項目,並得到了幾個問題。你應該去一步步地消除因爲你是混合很多東西的問題(對話管理,LUIS調用等)

RootDialog.cs

第一點:

message.Text.ToLower().Contains("Démarrer") 

message.Text.ToLower().Contains("Get Started") 

這兩個測試不能是有效的,因爲你正在比較小寫字母和大寫字母。

此外,有更好的方法來獲取Facebook Messenger'開始'按鈕點擊事件,但這不是重點。

第二點:

private async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result) 
{ 
    await context.PostAsync($"Ooops! Too many attemps :(. But don't worry, I'm handling that exception and you can try again!"); 
} 

這裏您的文字是一個對話的簡歷很奇怪!

AllTheBot.cs和FrenchLuis.cs

當你打電話給你2 LuisDialog,你是消息的價值永遠不會傳遞給那些對話,這正常嗎?

您應該使用context.Forward而不是context.Call:通過這種方式,您的消息將自動轉發到子對話框。

全球行爲

我不認爲你要管理語言的正確途徑。爲什麼不使用有效的語言檢測系統來檢查從用戶那裏收到的內容是哪種語言?

從微軟認知服務的文本分析API是在這裏爲這樣的:https://azure.microsoft.com/en-gb/services/cognitive-services/text-analytics/

對話管理你的情況

我做了2個對話框管理實施的樣品(不含LUIS這裏)至告訴你什麼工作:

[Serializable] 
public class Dialog44592511 : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     var message = await result; 

     if (message.Text.ToLower().Contains("Get Started") || 
      message.Text.ToLower().Contains("hello") || 
      message.Text.ToLower().Contains("hi")) 
     { 
      await context.Forward(new Dialog44592511_EN(), this.ResumeAfterOptionDialog, message); 
     } 
     else if (message.Text.ToLower().Contains("Démarrer") || message.Text.ToLower().Contains("salut") || message.Text.ToLower().Contains("french")) 
     { 
      await context.Forward(new Dialog44592511_FR(), this.ResumeAfterOptionDialog, message); 
     } 
     else 
     { 
      await context.PostAsync($"Ooops! There are some problems with our system"); 
     } 
    } 

    private async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result) 
    { 
     await context.PostAsync($"Resume!"); 
    } 
} 

[Serializable] 
public class Dialog44592511_FR : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
    { 
     var activity = await result as Activity; 
     await context.PostAsync($"Vous êtes dans le dialogue FR"); 
     context.Done<object>(null); 
    } 
} 

[Serializable] 
public class Dialog44592511_EN : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
    { 
     var activity = await result as Activity; 
     await context.PostAsync($"You are in the EN dialog"); 
     context.Done<object>(null); 
    } 
} 

Test

不要猶豫編輯您的問題了解更多詳情

+0

感謝@ ezequiel-jadib我改變了對話框的調用方式 –

0

而不是做context.Call,您應該使用context.Forward,它會將消息轉發到對話框。

使用context.Call您只需調用對話框並準備好接收新消息。

您應該查看啓動對話框的不同方法,解釋爲here

+0

@Nicolas thnx爲您的代碼...我仍然有問題(我的機器人只有錯誤:Ooops!我們的系統有一些問題)當我嘗試從facebook(用法語)開始對話時(法語或英語)...和其他英語版本中,如果我用英語說話並開始鍵入法語內容,我的機器人無法理解併發送給我:($「哎呀!我們的系統有一些問題」) – user38

+0

我繼續有問題...我做了所有更改,但沒有:( – user38

相關問題