将 LuisDialog 方法 (LuisIntents) 拆分为多个文件或类别
Splitting LuisDialog methods (LuisIntents) into multiple files or categories
我正在开发一个 Microsoft 机器人框架项目,我在其中创建了一个 LuisDialog
来与用户交互。我可能会有很多不同的意图,可以分为多个类别。
最好的组织方式是什么?
我应该用所有 LuisIntent
方法做一个大 LuisDialog
class 吗?
我觉得这有点杂乱无章。
我应该为每个类别制作多个 LuisDialog
class 吗?
这可能会带来很多问题。如果我有一个应该包含在所有类别中的意图怎么办?如何确保每个 LuisDialog
都检查用户消息?这可能不是一个好主意。
我是否应该制作一个大的 LuisDialog
class 以某种方式 'includes' 来自其他 files/classes 的方法,其中每个 file/class 代表一个类别?
这似乎是个好主意,但是,我不知道如何在 C# 中执行此操作
如果您有其他建议,请告诉我,在此先感谢!
编辑:
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
方法)。
假设你有
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
}
}
希望对您有所帮助。
对于任何想知道是否有更好的解决方案的人;
在 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 参数,但到目前为止它在我的所有测试中都正常工作
希望清楚:(
我正在开发一个 Microsoft 机器人框架项目,我在其中创建了一个 LuisDialog
来与用户交互。我可能会有很多不同的意图,可以分为多个类别。
最好的组织方式是什么?
我应该用所有
LuisIntent
方法做一个大LuisDialog
class 吗?我觉得这有点杂乱无章。
我应该为每个类别制作多个
LuisDialog
class 吗?这可能会带来很多问题。如果我有一个应该包含在所有类别中的意图怎么办?如何确保每个
LuisDialog
都检查用户消息?这可能不是一个好主意。我是否应该制作一个大的
LuisDialog
class 以某种方式 'includes' 来自其他 files/classes 的方法,其中每个 file/class 代表一个类别?这似乎是个好主意,但是,我不知道如何在 C# 中执行此操作
如果您有其他建议,请告诉我,在此先感谢!
编辑:
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
方法)。
假设你有
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
}
}
希望对您有所帮助。
对于任何想知道是否有更好的解决方案的人;
在 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 参数,但到目前为止它在我的所有测试中都正常工作
希望清楚:(