LUIS 中用于多轮对话的新意图

New intent in LUIS for multi turn dialogs

我要创建一个多轮对话。我不明白它应该如何与 LUIS 模型连接。我查看了文档,但有些样本只有一轮对话。另外,我使用虚拟助手模板。 我想做这样的事情。

User: I want to book a flight

Bot: What is the destination?

User: London

Bot: When?

User: 21st of September.

Bot: The ticket was bought.

问题是第二步会发生什么?我应该检查调度员吗?我应该为意图中的所有步骤添加所有可能的短语吗?

一般 LUIS 内容

对于您的 LUIS 模型,您将需要您的意图 - BookFlightNone。在您的 BookFlight 意图下,您将拥有 Utterances - 您希望能够触发 BookFlight 意图的所有短语。

MyLuisApp
--BookFlight
----I want to book a flight
----Book a flight
----I need a plane ticket
----etc
--None
----Utterances that don't match any of your intents

根据 this documentation,none 意图非常重要。


将此功能添加到新机器人或核心机器人模板

提供了几个不同的示例来说明如何实现此目的,但最好的方法是使用对话框。你要的是一个Waterfall Dialog。在此对话框中,您可以定义瀑布中的每个阶段,例如询问目的地,询问日期等

为了触发 BookFlight 瀑布,您需要一个 MainDialog 来处理每个请求,并使用 LUIS 调度程序进行检查 link1 and link2 to find out the users intent as per this example。如果意图是 BookFlight 那么您将启动包含预订航班瀑布的 BookFlightDialog。

...
// Check dispatch result
var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync<DispatchLuis>(dc.Context, CancellationToken.None);
var intent = dispatchResult.TopIntent().intent;

if (intent == "BookFlight")
{
    // Start BookFlightDialog
    await dc.BeginDialogAsync(nameof(BookFlightDialog));
}


常规瀑布对话框内容

您可以将步骤定义为:

var waterfallSteps = new WaterfallStep[]
{
    AskDestinationAsync,
    AskDepartureDateAsync,
    ConfirmStepAsync,
    FinishDialogAsync,
};

对于您的场景,实际上已经创建了一个示例,其中包含可用的 BookFlight 意图 here. There is a full guide on how to get this setup and working in the official documentation。因此,您可以测试以了解一切如何工作,然后根据需要进行修改。

其他有趣的链接:


虚拟助手东西

一旦您了解了上述工作原理,您将能够修改虚拟助手模板以通过执行以下操作来处理 BookFlight 意图:

  • 将 BookFlight 意图添加到连接到您的 VA 模板的现有 LUIS DISPATCH 应用。
  • 向 BookFlight 意图添加话语。
  • 保存并训练您的 LUIS 应用。
  • 发布您的 LUIS 应用。
  • 运行 update_cognitive_models.ps1 脚本按照 步骤 3 的说明 here 将下拉变化(你的新意图和话语)。
    • .\Deployment\Scripts\update_cognitive_models.ps1 -RemoteToLocal
      • 注意:此命令必须 运行 使用 PowerShell Core 并且来自项目目录的根目录,即在虚拟助手文件夹中。

运行此脚本的结果应该是在本地创建的一堆文件,以及正在更新的 DispatchLuis.cs 文件以包含您的新意图。您还应该检查创建的 Summary.html 文件以查看您的新意图是否存在。您现在必须更新 VA 代码以在触发新意图时实际执行某些操作 - 在 MainDialog.cs 文件的 RouteAsync 方法中添加另一个 if/case 语句 - 请参阅 here 举个例子。

像这样:

MainDialog.cs

protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
    // Call to dispatch to get intent

    if (intent == DispatchLuis.Intent.bookflight)
    {
        // Start BookFlightDialog
        await dc.BeginDialogAsync(nameof(BookFlightDialog));
    }
    ...
}