使用LUIS的多语言机器人

时间:2018-02-01 13:29:36

标签: c# botframework luis

我正在尝试通过检测语言并选择正确的LUIS键和字符串集来创建多语言机器人。我的问题是,我的LuisDialog自行序列化,MakeRoot方法不再被调用。

我的代码(大致):

 public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
 {
    if (activity.Type == ActivityTypes.Message)
    {
        var languageData = DetectLanguage(activity); // here I have the keys, strings etc.

        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog(languageData));
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

我尝试过使用中间对话框,它选择语言并将context.Forward所有内容都添加到LuisDialog中,但我正在努力管理它。如果这是一个好策略,我可以分享更多代码。我也在考虑得分。

1 个答案:

答案 0 :(得分:0)

如果您需要在开始时切换LUIS Dialog的语言

您必须创建一个方法来按语言获取每个LUIS参数,并且您知道DetectLanguage的语言,请选择正确的语言。

然后将它们传递给您的LuisDialog,如下所示:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        var languageData = DetectLanguage(activity); // here I have the keys, strings etc.

        var luisService = new LuisService(new LuisModelAttribute("yourLuisAppIdGivenTheLanguageData", "yourLuisAppKeyGivenTheLanguageData", domain: "yourLuisDomainGivenTheLanguageData"));
        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog(luisService));
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

你的RootDialog看起来像这样:

public class RootDialog : LuisDialog<object>
{
    public RootDialog(params ILuisService[] services) : base(services)
    {
    }

如果你有一个更复杂的项目

我们实施了一个允许语言切换的复杂项目。由于这种可能性,即使您在处理开始时覆盖活动的区域设置字段,也无法完全信任它。

策略如下:

  • 在MessagesController的Post方法中检测用户的每种传入消息的语言
  • 将用户语言存储在bot状态(userData)中

然后:

  • 显示文本时,使用userData
  • 以正确的语言获取值
  • 使用LUIS等语言特定工具时,请使用userData
  • 获取正确的参数

您需要一个中间RootDialog来处理这个LUIS语言切换,并且您必须在每次检测后完成LuisDialog(或者在LuisDialog上的每个MessageReceived之前检查语言)。