繁体   English   中英

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

[英]Sequential Waterfall Models with Complex Dialog flows Bot Framework C# v4

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

3瀑布方法如下,

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

截至目前,我已经通过聊天窗口传递值,因为3瀑布步骤松散耦合,用户可以将它们作为机器人的独立组件/功能调用,所以我的问题是

  1. 如何链接3个模型,即如果用户已触发waterfall_1,并转到2或3,则会跳过询问“用户”的对话框? 我想我每个瀑布都需要全局和本地吸气剂和固定器。

  2. 在WaterFall_1中,最后一个响应从Azure搜索发送查询结果,即“名称”,我应该立即结束对话,还是WaterFall_1调用WaterFall_2和/如果WaterFall_3然后我结束对话3,2,1?

该图可能会给出更多上下文简单的数字

在你的问题中,你有一般的想法1.你需要的是一个'共享'或全局状态,与Bot Framework的CafeBot中显示的状态不同(Look under samples => dotnet =>#50)。

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

如果你依赖LUIS,你不需要让它们顺序。 您可以使用LUIS让“搜索用户”触发器WF1,“对用户执行XYZ”触发器2和“对用户执行ABC”触发器3.这将使您的机器人对于机器人用户不那么严格,因为他们可以进行搜索,然后根据需要做2或3,(或两者)。

我能够通过简单地向Bot框架MessageRoutingBot添加一个额外的,基于瀑布的类来模拟这个(samples => dotnet =>#09)

AlteredStateBot

以下是“收藏动物”提示的瀑布设置,包括从原始示例机器人访问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();
    }

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM