如何在 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 结果(您可能必须保存前一个结果,具体取决于您要实现的目标)
我有一个带有多个 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 结果(您可能必须保存前一个结果,具体取决于您要实现的目标)