【问题标题】:BotFramework Step by step questions where each dialog has an assigned LUIS intentBotFramework 分步问题,其中每个对话框都有一个分配的 LUIS 意图
【发布时间】:2017-11-03 09:55:29
【问题描述】:

我有一个逐步向用户提出的问题,其中每个问题都是一个对话。我可以有一个分步流程并且每个流程都有不同的 LUIS 意图吗?最好的方法是什么?

我想要的是:

我不确定如何为每个对话框分配一个意图,因为在RoomReservationDialog 中,我只是为第一步实例化对话框,即RoomReservationNameDialog。然后在 RoomReservationNameDialog 内部,我只是在 MessageReceived 方法中实例化下一步是 RoomReservationDateTimeDialog

class RoomReservationDialog
{
    protected override async Task StartAsync(IDialogContext context)
            {
                context.Call(new RoomReservationNameDialog(), MessageReceived);
            }

}

class RoomReservationNameDialog
{
    public override async Task StartAsync(IDialogContext context)
    {
        // ask question
    }

    protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item)
            {
                 …
                 context.Call(new RoomReservationDateTimeDialog(), HandleResult);
            }
}

【问题讨论】:

  • 你能在这里解释一下你的用例吗?为什么你希望每个意图都有一个对话框,而不是把所有的意图都放在一个对话框中?
  • @JasonSowers,这是因为要求信息的一步一步的性质。基本上,当用户回答房间名称时,我们只希望 LUIS 获取特定于 Room.AnswerName 的意图和实体。例如,如果用户在询问房间名称时回答了日期,我们不希望 LUIS 将其处理为 Room.AnswerDateTime,因为这是一个不同的步骤。

标签: c# botframework azure-language-understanding


【解决方案1】:

通常,人们将他们的意图放在同一个对话框中,如下面的代码。如果您希望以这种方式构建代码,则可以从此对话框中调用 Intent 中的另一个对话框。

[Serializable]
[LuisModel("Luis app id", "Luis key")]
public class LuisDialog : LuisDialog<object>
{
    [LuisIntent("")]
    [LuisIntent("None")]
    public async Task None(IDialogContext context, LuisResult result)
    {
        string message = $"Sorry, I did not understand '{result.Query}'. Type 'help' if you need assistance.";
        await context.PostAsync(message);
        context.Wait(this.MessageReceived);
    }

    [LuisIntent("greeting")]
    public async Task Greeting(IDialogContext context, LuisResult result)
    {
        string message = $"Hello there";
        await context.PostAsync(message);
        context.Wait(this.MessageReceived);
    }
    [LuisIntent("Room.AnswerName")]
    public async Task Left(IDialogContext context, LuisResult result)
    {
        //do stuff 
        //or call new dialog to do stuff
        context.Call(new RoomReservationNameDialog(), ResumeAfterMethod);
    }
    [LuisIntent("Room.AnswerDateTime")]
    public async Task Right(IDialogContext context, LuisResult result)
    {
        //do stuff 
        //or call new dialog to do stuff
        context.Call(new RoomReservationDateTimeDialog(), ResumeAfterMethod);
    }
    [LuisIntent("Room.AnswerFloor")]
    public async Task Middle(IDialogContext context, LuisResult result)
    {
        //do stuff 
        //or call new dialog to do stuff
        context.Call(new RoomReservationFloorDialog(), ResumeAfterMethod);
    }
}

【讨论】:

  • 是的,我同意这就是它的主要结构。对于我们的场景,尽管我们希望他们首先进入“预留房间”意图,而不是说出可能首先触发其他意图的内容,例如 Room.AnswerDateTime。例如,如果用户去聊天机器人并说他们想要一个给定日期的房间,它可能会先去 Room.AnswerDateTime。我们的步骤实际上比这更复杂,房间预订只是一个示例。
【解决方案2】:

您看过 FormFlow (Microsoft Docs) 吗?这似乎是您逐步流程的合适答案。

还专门将 FormFlow 与 LUIS 结合使用,您可以查看之前提出的问题 (Stack Overflow) 和最近的 blog post,这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2020-05-04
    相关资源
    最近更新 更多