【问题标题】:Splitting LuisDialog methods (LuisIntents) into multiple files or categories将 LuisDialog 方法 (LuisIntents) 拆分为多个文件或类别
【发布时间】:2016-08-06 12:26:49
【问题描述】:

我正在开发一个 Microsoft 机器人框架项目,在该项目中我创建了一个 LuisDialog 来与用户交互。我可能会有很多不同的意图,可以分为多个类别。

最好的组织方式是什么?

  • 我应该用所有LuisIntent 方法创建一个大的LuisDialog 类吗?

    这对我来说似乎有点杂乱无章。

  • 我应该为每个类别创建多个LuisDialog 类吗?

    这可能会带来很多问题。如果我有一个应涵盖所有类别的意图怎么办?如何确保每个LuisDialog 都检查用户消息?这可能不是一个好主意。

  • 我是否应该创建一个大的LuisDialog 类,以某种方式“包含”来自其他文件/类的方法,其中每个文件/类代表一个类别?

    这似乎是个好主意,但是,我不知道如何在 C# 中执行此操作

如果您有其他建议,请告诉我,提前谢谢!

【问题讨论】:

  • 我也遇到了同样的问题,您是使用部分类还是使用了其他解决方案?
  • 我使用了部分类

标签: c# botframework azure-language-understanding


【解决方案1】:

编辑

谢谢!这似乎是一个不错的解决方案,但是,我该怎么做 context.Wait(MessageReceived) 如果 MessageReceived 方法不是 可从 categoryXHandler 类访问(受保护)?

我要做的是让CategoryHandler 返回我想发布给用户的活动。请查看我的代码示例(HandleCategoryA 方法)。


假设你有

  1. category-A 其中有 Intent1Intent2Intent3Intent4
  2. category-B 其中有 Intent1, Intent2
  3. category-C 其中有 Intent1

我认为最好的方法仍然是拥有一个 LuisDialog,定义 3 种方法 来处理每个类别。

public class MyDialog : LuisDialog<string>
{
    [LuisIntent(CategoryA.Intent1)]
    [LuisIntent(CategoryA.Intent2)]
    [LuisIntent(CategoryA.Intent3)]
    [LuisIntent(CategoryA.Intent4)]
    public async Task HandleCategoryA(IDialogContext context, LuisResult result)
    {
        var returnActivity = CategoryAHandler.Handle(result); // your business logic will be put inside this method

        await context.PostAsync(returnActivity);
        context.Wait(MessageReceived);
    }

    [LuisIntent(CategoryB.Intent1)]
    [LuisIntent(CategoryB.Intent2)]
    public async Task HandleCategoryB(IDialogContext context, LuisResult result)
    {
        CategoryBHandler.Handle(result); // your business logic will be put inside this method
    }

    [LuisIntent(CategoryC.Intent1)]
    public async Task HandleCategoryC(IDialogContext context, LuisResult result)
    {
        CategoryCHandler.Handle(result); // your business logic will be put inside this method
    }
}

希望对你有帮助。

【讨论】:

  • 谢谢!这似乎是一个不错的解决方案,但是,如果不能从 categoryXHandler 类(受保护)访问 MessageReceived 方法,我该怎么做 context.Wait(MessageReceived)
  • 感谢您的帮助!我认为使用部分类是最好的解决方案。
【解决方案2】:

对于任何想知道是否有更好的解决方案的人;

在 C# 中使用 partial 类似乎是这里最好的解决方案, 阅读this了解更多信息。

【讨论】:

    【解决方案3】:

    我实际上做了不同的事情。

    我有一个主要的 Luis 对话框,用于检测所有意图。 根据意图,我将消息转发到我的第二个 LUIS 对话框。 这会捕获相关的意图和一个空字符串意图以“捕获所有其余部分”

    如果我到达“所有其余部分”,我设置 context.DOne,返回到我的根 LUIS 对话框,它重新解释从第二个接收到的 LuisResult 并处理它。

    一个例子是“天气”意图。它到达 LuisDialog1 我做了一个 context.forward(new LuisDialog2(), ResumeAfter...)

    LuisDialog2() 也处理“天气”意图,但例如也处理“更多天气” 如果没有检测到这些,它将进入 LuisDialog2 [LuisIntent("")] 处理程序方法。 这将设置一个 context.Done(luisresultobject) 返回到此代码所在的 LuisDialog1 ResumeAfter 方法

    var lLuisResult = await result as LuisResult;
    IntentRecommendation lRecommendation = this.BestIntentFrom(lLuisResult);
    await DispatchToIntentHandler(context, null, lRecommendation, lLuisResult);
    

    仍然不确定 null 参数,但到目前为止它在我的所有测试中都能正常工作

    希望清楚:(

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多