【问题标题】:Multi-language bot using LUIS使用 LUIS 的多语言机器人
【发布时间】:2018-02-01 22:41:01
【问题描述】:

我正在尝试通过检测语言并选择正确的 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 的所有内容,但我正在努力管理它。如果这是一个好的策略,我可以分享更多代码。我也在考虑得分。

【问题讨论】:

  • 请添加您的 RootDialog 实现。通过动态设置 AppId / Secret,可以“非常轻松”地在 LUIS 应用之间切换
  • 我的 Root(Luis)Dialog 在几个基类中有数百行,你能告诉我你想到的是 RootDialog 的哪一部分吗?我在 LuisDialog 的 base 构造函数中设置键

标签: c# botframework azure-language-understanding


【解决方案1】:

如果您需要在开始时切换 LUIS 对话框的语言

您必须制定一种方法来按语言获取每个 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 方法中检测每个传入消息的用户语言
  • 当用户语言发生变化时,将用户语言存储在机器人状态 (userData) 中

然后:

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

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

【讨论】:

  • 现在我正在这样做(在派生自 LuisDialog 的 RootDialog 的基类中):) 问题是当用户编写新消息时,我想再次检测语言,但是我的 RootDialog 实例不是从头开始创建的,而是反序列化的,并且没有使用我的新 ILuisService 调用构造函数。也许我在 RootDialog 中搞砸了,它永远挂在context.Wait(MessageReceived) 而不是完成?
  • context.Done() 完成LuisDialog 的每个部分在这里至关重要。我们又花了几个小时弄清楚对话流程,但你的策略奏效了,谢谢:)
  • 好消息,很高兴它有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2019-08-11
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多