将 LuisDialog 方法 (LuisIntents) 拆分为多个文件或类别

Splitting LuisDialog methods (LuisIntents) into multiple files or categories

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

最好的组织方式是什么?

如果您有其他建议,请告诉我,在此先感谢!

编辑

Thank you! This seems like a decent solution, however, how can I do context.Wait(MessageReceived) if the MessageReceived method is not accessible from a categoryXHandler class (protected)?

我会做的是让 CategoryHandler return activity 我想 post 给用户.请查看我的代码示例(HandleCategoryA 方法)。


假设你有

  1. category-A 其中有 Intent1Intent2Intent3Intent4
  2. category-B 其中有 Intent1Intent2
  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
    }
}

希望对您有所帮助。

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

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

实际上我的做法有所不同。

我有一个主要的 Luis 对话框,可以检测所有意图。 根据我的意图,我将消息转发到我的第二个 LUIS 对话框。 这会捕获相关意图和 "catch all the rest"

的空字符串意图

如果我到达 "all the rest",我设置 context.DOne,返回到我的根 LUIS 对话框,它重新解释从第二个对话框收到的 LuisResult 并处理它。

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

LuisDialog2() 也处理 'weather' 意图,但例如 'MoreWeather' 如果检测到其中 none 个,它将进入 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 参数,但到目前为止它在我的所有测试中都正常工作

希望清楚:(