如何在 LuisIntent 中调用 PromptDialog?

How do I call PromptDialog inside of a LuisIntent?

我有一个带有多个 LUIS 意图的 LuisDialog。在其中一些意图中,我可能需要向用户询问更多信息。在这些情况下,我尝试使用 PromptDialog 或 PromptString。

我已经试过了:

[LuisIntent("MyIntent")]
public async Task MyIntent(IDialogContext context, LuisResult result)
{
    if (result.Entities.Count == 0)
    {

        PromptDialog.Text(context, AfterUserInputSymbol, "Message to the user", "Try again message", 2);
        result.Entities[0].Entity = userSymbol;                
    }

    //some other code

    context.Wait(MessageReceived);
}

private async Task AfterUserInputSymbol(IDialogContext context, IAwaitable<string> result)
{
    userSymbol = await result;
    context.Wait(MessageReceived);
}

还有这个:

[LuisIntent("MyIntent")]
public async Task MyIntent(IDialogContext context, LuisResult result)
{
    if (result.Entities.Count == 0)
    {
        PromptString dialog = new PromptString("Message to the user", "Try again message", 2);
        context.Call(dialog, AfterUserInputSymbol);
        result.Entities[0].Entity = userSymbol;                
    }

    //some other code

    context.Wait(MessageReceived);
}

private async Task AfterUserInputSymbol(IDialogContext context, IAwaitable<string> result)
{
    userSymbol = await result;
    context.Wait(MessageReceived);
}

在这两种情况下,提示都不会出现在用户面前,userSymbol 的值变为空。当我调试时,代码只进入 AfterUserInputSymbol 当它到达这一部分时:result.Entities[0].Entity = userSymbol;

如何在 LuisIntent 中提示更多信息?

不确定到底发生了什么,因为您的问题中没有发布任何错误,但是可能发生的事情是您正在启动一个新的对话,而且您还有 context.Wait(MessageReceived ) 那里。如果您要启动一个对话框,则不必等待该流程中的消息,这就是为什么我会在那里添加一个 else 子句。

 if (result.Entities.Count == 0)
    {
        PromptDialog.Text(context, AfterUserInputSymbol, "Message to the user", "Try again message", 2);
        // The following line shouldn't be here
        result.Entities[0].Entity = userSymbol;                
    }
    //here you should put an else
   else 
   {
    context.Wait(MessageReceived);
   }

此外,请记住,在调用对话框后,您将无法将 userSymbol 分配给 Luis Result 实体,就像您尝试做的那样。这必须在 ResumeAfter 方法 "AfterUserInputSymbol" 中完成。

执行此操作后,您可以手动调用 Intent 传递上下文和较新的 Luis 结果(您可能必须保存前一个结果,具体取决于您要实现的目标)