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

时间:2016-08-06 12:26:49

标签: c# botframework luis

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

组织此活动的最佳方式是什么?

  • 我应该使用所有LuisDialog方法制作一个大的LuisIntent课程吗?

    这对我来说似乎有点无组织。

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

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

  • 我应该制作一个大的LuisDialog课程,以某种方式包含'来自其他文件/类的方法,其中每个文件/类代表一个类别?

    这似乎是一个好主意,但是,我不知道如何在C#中做到这一点

如果您有其他建议,请提前告知我们!

3 个答案:

答案 0 :(得分:2)

编辑

  

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

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

假设你有

  1. category-A其中包含Intent1Intent2Intent3Intent4
  2. category-B其中包含Intent1Intent2
  3. category-C,其中包含Intent1
  4. 我认为最好的方法是使用一个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
        }
    }
    

    希望它有所帮助。

答案 1 :(得分:2)

有人想知道是否有更好的解决方案;

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

答案 2 :(得分:1)

我实际上是这样做的。

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

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

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

LuisDialog2()也处理'天气'意图,但也可以处理'MoreWeather' 如果没有检测到这些,它将进入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参数,但它在我目前为止的所有测试中都能正常工作

希望很清楚:(