我有3个独立的瀑布模型,这些模型是由使用Luis的意图触发的。
我想顺序地链接这3个模型,我一直遵循PictureBot编码风格,并且每个对话框/瀑布都具有状态属性。

3种瀑布方法如下:


WaterFall_1-查询Azure搜索,基于用户提供的过滤器,“响应”是“名称”列表
WaterFall_2-将执行一些REST操作,并从waterFall_1中获取名称
WaterFall_3-再次执行一些REST操作,取自WaterFall_1的名称


到目前为止,我一直在通过聊天窗口传递值,因为3个瀑布步骤是松散耦合的,因此用户可以将它们作为机器人的独立组件/功能进行调用,所以我的问题是


如何链接这三个模型,即在如果用户已触发Waterfall_1并转到2或3的情况下,将跳过询问“用户”的对话框?我认为每个瀑布都需要全局和本地Getters和Setters。
在WaterFall_1中,最后一个响应从Azure搜索发送查询结果(即“名称”),我应该在endDialog之后还是WaterFall_1调用WaterFall_2和/或WaterFall_3,然后为3,2,1调用endDialog?


该图可能提供更多上下文Simple figure

最佳答案

您对问题1的一般想法有所了解。您需要的是一个“共享”或全局状态,与Bot Framework的CafeBot中展示的状态不同(请看示例=> dotnet =>#50)。

如果设置了“全局”状态,则可以将在Waterfall 1中检索到的用户名列表保存到该列表中。然后,当通过LUIS意图调用第二个或第三个瀑布时,会将状态1的状态访问器传递给瀑布2的父类,从而使其他瀑布可以访问它们。

如果您依靠LUIS,则无需使它们连续。您可以使用LUIS来使“搜索用户”触发WF1,“对用户执行XYZ”触发2和“对用户执行ABC”触发3。这将使您的机器人对机器人用户的僵化程度降低,因为他们可以进行搜索,然后根据需要执行2或3(或两者)。

我可以通过简单地在Bot Framework MessageRoutingBot中添加一个基于瀑布的额外类来进行模拟(样本=> dotnet =>#09)。

c# - 具有复杂对话框流的顺序瀑布模型Bot Framework C#v4-LMLPHP

这是“收藏夹动物”提示的瀑布设置,包括从原始示例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();
    }


希望这可以帮助!

关于c# - 具有复杂对话框流的顺序瀑布模型Bot Framework C#v4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53361886/

10-16 19:44