【发布时间】:2020-04-07 02:25:54
【问题描述】:
我正在使用 Bot Dialogs 扩展构建一个机器人,但我的项目中的瀑布对话框出现问题。如果用户对机器人说“我想输入一条新消息”,机器人会回答一系列问题,例如“你希望什么时候将消息传递给用户”、“你想让消息说什么” “等等。我正在寻找的是,当用户被要求提供日期时,如果它响应“明天”,luis 将返回相应的日期,但如果用户说“foo”,机器人将再次要求日期.
我来做的是这样的代码:
public class NewMessageDialog : ComponentDialog
{
private readonly BotStateService _botStateService;
private readonly BotServices _botServices;
public NewMessageDialog(string dialogId, BotStateService botStateService, BotServices botServices) : base(dialogId)
{
_botStateService = botStateService ?? throw new ArgumentNullException(nameof(botStateService));
_botServices = botServices ?? throw new ArgumentNullException(nameof(botServices));
InitializeWaterfalls();
}
private void InitializeWaterfalls()
{
var waterfallSteps = new WaterfallStep[]
{
DateToSendStep,
ExpirationTimeStep,
BodyContentStep,
SummaryStep
};
AddDialog(new WaterfallDialog($"{nameof(NewMessageDialog)}.mainFlow", waterfallSteps));
AddDialog(new DateTimePrompt($"{nameof(NewMessageDialog)}.dateCreation")); //tb
AddDialog(new NumberPrompt<double>($"{nameof(NewMessageDialog)}.expirationTime"));
AddDialog(new TextPrompt($"{nameof(NewMessageDialog)}.body.content"));
InitialDialogId = $"{nameof(NewMessageDialog)}.mainFlow";
}
private async Task<DialogTurnResult> DateCreatedStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.dateCreation", new PromptOptions
{
Prompt = MessageFactory.Text("What is the date you want to send the message?"),
RetryPrompt = MessageFactory.Text("Please enter a date")
}, cancellationToken);
}
private async Task<DialogTurnResult> ExpirationTimeStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
stepContext.Values["dateToSend"] = Convert.ToDateTime(((List<DateTimeResolution>)stepContext.Result).FirstOrDefault().Value);
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.expirationTime", new PromptOptions
{
Prompt = MessageFactory.Text("What is the expiration time?"),
RetryPrompt = MessageFactory.Text("Please enter a decimal number")
}, cancellationToken);
}
private async Task<DialogTurnResult> BodyContentStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
stepContext.Values["expirationTime"] = Convert.ToDateTime(((List<DateTimeResolution>)stepContext.Result).FirstOrDefault().Value);
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.body.content", new PromptOptions
{
Prompt = MessageFactory.Text("What is the message body?")
}, cancellationToken);
}
等等……
我还没有找到正确的方法来执行此操作:我可以询问 LUIS 两次(一次在验证器中查看是否要设置日期,一次在下一步中从实体),我可以在验证器中询问 luis,然后将其保存到类属性中以最终从那里获取日期值......有没有一种有效的方法来做到这一点?
另外我对聊天工具一无所知,我在其他网站上搜索时看到过...
【问题讨论】:
-
一般情况下,你可以为所有的提示编写验证函数,当响应正常时返回true,否则返回false。你有没有尝试过这样的事情?
标签: c# botframework azure-language-understanding