我目前正在使用Azure的Bot服务构建聊天机器人。我使用NLU-Bot,与瀑布流混合,因为依赖于我想获得一些特定信息的意图。
因此,我匹配intent1
并希望
var intents = new builder.IntentDialog({ recognizers: [recognizer] })
.matches('intent1', (session, args, results) =>{
session.beginDialog("getRequiredInformations");
session.send("I received your information");
})
bot.dialog('getRequiredInformations', [
(session) =>{
var levels = ['Beginner', 'Intermediate', 'Expert'];
builder.Prompts.choice(session, "What's your level ?", levels, { listStyle: builder.ListStyle.button, maxRetries: 0 });
},
(session, results) => {
session.conversationData.level = results.response.entity;
}
]);
我想要做的是等到我们从getRequiredInformations
对话框收到答案,然后继续包含已识别意图的原始对话框。使用上面的代码,session.send("I received your information");
将在用户输入答案之前发送。
我也试过bot.beginDialogAction('getRequiredInformations', 'getRequiredInformations');
,但我认为不可能在对话框中调用它。
我如何实现这一目标?
答案 0 :(得分:1)
将发送移至intent1
对话框的下一个瀑布步骤。我认为这应该有用。
var intents = new builder.IntentDialog({ recognizers: [recognizer] })
.matches('intent1', [(session, args, results) =>{
session.beginDialog("getRequiredInformations");
}, (session, args, results) =>{
session.send("I received your information");
}]);
matches
方法需要 IWaterfallStep 或 IWaterfallStep [] 。更多信息EnvironmentConfig。
答案 1 :(得分:1)
在您的代码段中发现了一些错误信息,请参阅以下修改:
bot.dialog('intent1', [(session, args, next) => {
session.beginDialog("getRequiredInformations");
}, (session, args, next) => {
session.send("I received your information");
session.send(session.conversationData.level)
}]).triggerAction({
matches: 'intent1'
})
bot.dialog('getRequiredInformations', [
(session) => {
var levels = ['Beginner', 'Intermediate', 'Expert'];
builder.Prompts.choice(session, "What's your level ?", levels, {
listStyle: builder.ListStyle.button,
maxRetries: 0
});
},
(session, results) => {
session.conversationData.level = results.response.entity;
session.endDialog();
}
]);
但这意味着没有机会等待对话完成回调或任何事情,我需要用瀑布做这个吗?
如果我理解正确,只有在堆栈中没有对话框时,您才可以尝试使用以下代码段来启用luis识别器。
var recognizer = new builder.LuisRecognizer(luisAppUrl)
.onEnabled(function (context, callback) {
var enabled = context.dialogStack().length == 0;
callback(null, enabled);
});