我正在尝试通过检测语言并选择正确的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中,但我正在努力管理它。如果这是一个好策略,我可以分享更多代码。我也在考虑得分。
答案 0 :(得分:0)
您必须创建一个方法来按语言获取每个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)
{
}
我们实施了一个允许语言切换的复杂项目。由于这种可能性,即使您在处理开始时覆盖活动的区域设置字段,也无法完全信任它。
策略如下:
Post
方法中检测用户的每种传入消息的语言然后:
您需要一个中间RootDialog来处理这个LUIS语言切换,并且您必须在每次检测后完成LuisDialog(或者在LuisDialog上的每个MessageReceived之前检查语言)。