2

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

组织这个的最佳方式是什么?

  • 我应该用所有方法做一个大LuisDialog课吗?LuisIntent

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

  • 我应该LuisDialog为每个类别制作多个课程吗?

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

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

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

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

4

3 回答 3

2

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

在 C# 中使用partial类似乎是最好的解决方案,请阅读内容以获取更多信息。

于 2016-08-10T19:40:44.960 回答
2

编辑

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

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


假设你有

  1. category-A其中有Intent1, Intent2, Intent3,Intent4
  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
    }
}

希望能帮助到你。

于 2016-08-08T09:48:22.350 回答
1

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

我有一个主要的 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 参数,但到目前为止它在我的所有测试中都能正常工作

希望很清楚:(

于 2017-12-08T09:45:13.093 回答