如何在 Bot Framework (C# SDK) 中的单个 Luis 对话框中集成多个 Luis 语言模型
How to integrate multiple Luis languge models in single Luis Dialog in Bot Framework (C# SDK)
我希望我的机器人支持 德语 语言。因此,我为德语创建了一个单独的模型,其意图和实体与 English 模型中的相同。我如何 select 根据用户语言在 运行 时间上使用特定模型。显然,我可以要求用户选择他们的语言偏好,将其保存在 Bot Databag 中,然后设置文化“en”或“de”在那上面。但是,我如何 select German/English 在 运行 时间建模?我有以下 Luis 模型,其中包含德语和英语模型键作为属性。
P.S。我已经阅读了其他相关帖子,它们是关于两个具有不同意图和实体的模型。我有两个不同语言环境的模型。
[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)
{
}
}
有两种解决方案:
- 自己控制对 LUIS 的 Rest 调用。
- 创建两个对话框 LUISDialogClassDe 和 LUISDialogClassUs。
详述第二个解决方案:
a) 实现抽象中的所有逻辑class:
[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) 创建一个扩展抽象 class 的具体 class,其唯一目的是提供 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());
}
我希望我的机器人支持 德语 语言。因此,我为德语创建了一个单独的模型,其意图和实体与 English 模型中的相同。我如何 select 根据用户语言在 运行 时间上使用特定模型。显然,我可以要求用户选择他们的语言偏好,将其保存在 Bot Databag 中,然后设置文化“en”或“de”在那上面。但是,我如何 select German/English 在 运行 时间建模?我有以下 Luis 模型,其中包含德语和英语模型键作为属性。 P.S。我已经阅读了其他相关帖子,它们是关于两个具有不同意图和实体的模型。我有两个不同语言环境的模型。
[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)
{
}
}
有两种解决方案:
- 自己控制对 LUIS 的 Rest 调用。
- 创建两个对话框 LUISDialogClassDe 和 LUISDialogClassUs。
详述第二个解决方案:
a) 实现抽象中的所有逻辑class:
[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) 创建一个扩展抽象 class 的具体 class,其唯一目的是提供 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());
}