我正在开发一个Microsoft bot框架项目,我在其中创建一个LuisDialog
来与用户进行交互。我可能会有很多不同的意图,可以分为多个类别。
组织此活动的最佳方式是什么?
我应该使用所有LuisDialog
方法制作一个大的LuisIntent
课程吗?
这对我来说似乎有点无组织。
我应该为每个类别制作多个LuisDialog
课程吗?
这可能会带来很多问题。如果我的意图应涵盖所有类别,该怎么办?如何确保每个LuisDialog
都检查用户消息?这可能不是一个好主意。
我应该制作一个大的LuisDialog
课程,以某种方式包含'来自其他文件/类的方法,其中每个文件/类代表一个类别?
这似乎是一个好主意,但是,我不知道如何在C#中做到这一点
如果您有其他建议,请提前告知我们!
答案 0 :(得分:2)
编辑:
谢谢!这似乎是一个不错的解决方案,但是,我该怎么办 context.Wait(MessageReceived),如果MessageReceived方法不是 可以从categoryXHandler类(受保护的)访问?
我会做的是让CategoryHandler
返回我要发布给用户的活动。请参阅我的代码示例( HandleCategoryA
方法)。
假设你有
category-A
其中包含Intent1
,Intent2
,Intent3
,Intent4
category-B
其中包含Intent1
,Intent2
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
}
}
希望它有所帮助。
答案 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参数,但它在我目前为止的所有测试中都能正常工作
希望很清楚:(