我有三个独立的瀑布模型,这是由意图使用路易斯。我想按顺序链接这三个模型,我一直遵循PictureBot编码风格,每个对话框/瀑布都有状态属性。
3种瀑布方法如下,
到目前为止,我一直在通过聊天窗口传递这些值,因为三个瀑布步骤是松散耦合的,用户可以将它们作为bot的一个独立组件/特性调用,所以我的问题是
这个数字可能会提供更多的上下文简单图形
发布于 2018-11-28 22:40:46
在问题1中,您有了大致的想法。您需要的是一个“共享”或全局状态,这与Bot的CafeBot中所演示的状态没有什么不同(参见示例=> dotnet => #50)。
如果您有“全局”状态集,则可以将瀑布1中检索的用户名列表保存到该状态集。然后,当您的第二个或第三个瀑布通过您的LUIS意图被调用时,您将瀑布1结果的状态访问器传递给瀑布2的父类,从而使其他瀑布能够访问它们。
如果你依赖路易斯,你就不需要把它们按顺序排列。您可以使用LUIS来让‘搜索用户’触发器WF1,‘对用户的触发器2执行XYZ,以及’对用户执行ABC‘触发器3。这将使您的bot对您的bot用户来说不那么严格,因为他们可以进行搜索,然后根据需要执行2或3 (或两者兼用)。
我能够通过在Bot中添加一个额外的基于瀑布的类来模拟这个过程(示例=> dotnet => #09)
下面是“最喜欢的动物”提示的瀑布设置,包括从原始示例bot访问greetingState:
public TestDialog(IStatePropertyAccessor<TestState> testStateAccessor, IStatePropertyAccessor<GreetingState> greetingStateAccessor, ILoggerFactory loggerFactory)
: base(nameof(TestDialog))
{
TestStateAccessor = testStateAccessor ?? throw new ArgumentNullException(nameof(testStateAccessor));
GreetingStateAccessor = greetingStateAccessor ?? throw new ArgumentNullException(nameof(greetingStateAccessor));
// Add control flow dialogs
var waterfallSteps = new WaterfallStep[]
{
InitializeStateStepAsync,
PromptForAnimalStepAsync,
// PromptForCityStepAsync,
DisplayTestStateStepAsync,
};
AddDialog(new WaterfallDialog(ProfileDialog, waterfallSteps));
// AddDialog(new TextPrompt(NamePrompt, ValidateName));
AddDialog(new TextPrompt(AnimalPrompt));
}
有了greetingState访问器,我就可以继续从第二个瀑布调用用户的名字,而不需要重新提示:
private async Task<DialogTurnResult> GreetUser(WaterfallStepContext stepContext)
{
var context = stepContext.Context;
var testState = await TestStateAccessor.GetAsync(context);
var greetingState = await GreetingStateAccessor.GetAsync(context);
// Display their profile information and end dialog.
await context.SendActivityAsync($"Hi {greetingState.Name}, who likes {testState.Animal}s, nice to meet you!");
return await stepContext.EndDialogAsync();
}
希望这能有所帮助!
https://stackoverflow.com/questions/53361886
复制相似问题