我有一个带有几个LUIS意图的LuisDialog。在其中一些意图中,我可能需要向用户询问更多信息。在这些情况下,我正在尝试使用PromptDialog或PromptString。
我alredy试过这个:
[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中提示更多信息?
答案 0 :(得分:2)
由于您的问题中没有发布任何错误,因此不确定它到底发生了什么,但是可能发生的事情是您正在启动一个新对话框,并且您还有上下文。等等(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方法&#34; AfterUserInputSymbol&#34;中完成。
一旦你这样做,你可以手动调用你的Intent传递上下文和更新的Luis结果(你可能必须根据你想要达到的目的保存前一个)