如何在Bot Framework中的单个Luis Dialog中集成多个Luis语言模型(C#SDK)

时间:2017-09-17 10:18:24

标签: c# botframework luis

我希望我的机器人支持德语语言。因此,我为德语创建了一个单独的模型,其意图和实体与英语模型中的意图和实体相同。如何根据用户语言在运行时选择特定型号。显然,我可以要求用户选择他们的语言偏好,将其保存在Bot Databag中,然后设置文化" en "或" de "基于此。但是,如何在运行时选择德语/英语模型?我遵循Luis模型,将德语和英语模型键作为属性。 附:我已阅读其他相关帖子,它们是关于两个具有不同意图和实体的模型。我有两个不同语言环境的模型。

[LuisModel("LuisID", "English Model-Key")]
[LuisModel("LuisID", "German Model-Key")]
[Serializable]
public class LUISDialogClass : LuisDialog<object>
{
    public LUISDialogClass(params ILuisService[] services) : base(services)
        {

        }
    [LuisIntent("A")]
    public async Task A(IDialogContext context, LuisResult result)
    {

    }
    [LuisIntent("B")]
    public async Task B(IDialogContext context, LuisResult result)
    {

    }
}

1 个答案:

答案 0 :(得分:4)

有两种解决方案:

  1. Control Rest自己调用LUIS。
  2. 创建两个对话框LUISDialogClassDe和LUISDialogClassUs。
  3. 阐述第二个解决方案:

    a)实现抽象类中的所有逻辑:

    [Serializable]
    public abstract class LUISDialogClass : LuisDialog<object>
    {
        public LUISDialogClass(params ILuisService[] services) : base(services)
        {
    
        }
    
        [LuisIntent("A")]
        public async Task A(IDialogContext context, LuisResult result)
        {
    
        }
    
        [LuisIntent("B")]
        public async Task B(IDialogContext context, LuisResult result)
        {
    
        }
    }
    

    b)创建一个扩展抽象类的具体类,其唯一目的是提供Luis凭据。

    [Serializable]
    [LuisModel("key_DE", "programmatic_key_DE")]
    public class LUISDialogClassDe : LUISDialogClass
    {
    }
    

    c)根据需要重复。

    [Serializable]
    [LuisModel("key_US", "programmatic_key_US")]
    public class LUISDialogClassUs : LUISDialogClass
    {
    }
    

    d)在您的代码中使用它,如下所示:

    var state = activity.GetStateClient();
    var userdata = state.BotState.GetUserData(activity.ChannelId, activity.From.Id);
    var cultureInfo = userdata.GetProperty<CultureInfo>("lang");
    
    if (cultureInfo.Equals(new CultureInfo("de-DE")))
    {
        await Conversation.SendAsync(activity, () => new LUISDialogClassDe());
    }
    else
    {
        await Conversation.SendAsync(activity, () => new LUISDialogClassUs());
    }
    
相关问题