Bot Framework:如何在 Node.js SDK 中创建菜单?
Bot Framework: How to create a menu in Node.js SDK?
我正在使用 Bot Framework 和 Node.js 开发聊天机器人。我的目的是用菜单引导用户。我想象用户打开机器人并自动提示:“嗨,我是你的机器人,你在找什么? - 选项 1 - 选项 2 ”
一旦用户点击其中一个选项,他就可以问我几个与该选项相关的问题,我想我会附上一个特定的 QnA Maker 知识库。
我尝试在网络上搜索并寻找在 Github 上发布的样本,但没有太大帮助。任何人都可以帮我举一个实际的例子吗?
提前致谢。
您可以使用 prompts.Choice 来完成此操作。这将为用户显示每个选项的按钮 - 用户可以单击它们或键入响应。
因此,如果您 QnAMaker dialog 定义了...
var recognizer = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: 'set your kbid here',
subscriptionKey: 'set your subscription key here'});
var basicQnAMakerDialog = new cognitiveservices.QnAMakerDialog({
recognizers: [recognizer],
defaultMessage: 'No match! Try changing the query terms!',
qnaThreshold: 0.3
});
bot.dialog('/QnAMakerDialogue', basicQnAMakerDialog);
您可以根据用户的选择使用 replaceDialog 切换到此对话框...
function (session, results) {
builder.Prompts.choice(session, "Hi I'm your bot you what are you looking for?", ["Ask a question", "Other cool stuff"], {listStyle: builder.ListStyle.button});
},
function (session, results) {
if(results.response) {
switch (results.response.entity) {
case 'Ask a question':
session.replaceDialog('/QnAMakerDialogue');
case 'Other cool stuff':
session.replaceDialog('/CoolStuffDialog');
default:
session.send("Something went horribly wrong");
return;
}
}
}
如果您的用户回复说他们想提问,您将需要提示该问题。为此,我有时会使用包装对话 QnAPromptDialogue ...
function (session,args,next) {
//if the user just entered 'ask question' or similar, prompt for the actual question
var regex = new RegExp("^ask .*");
if(regex.test(session.message.text)) {
builder.Prompts.text(session, "Go ahead, what is your question?");
} else {
next();
}
},
function (session, results) {
session.replaceDialog('/QnAMakerDialogue');
}
可能不适合所有人,但万一它有用。
一般来说,您可以创建多个 QnAmaker 服务,并在您的机器人应用程序中定义多个具有不同 kb
的 QnAMakerRecognizer
,然后利用 recognize()
中的 QnAMakerRecognizer
您的机器人瀑布流可以根据您自己的条件匹配问题。
快速示例:
var recognizer1 = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: <knowledgeBaseId>,
subscriptionKey: <subscriptionKey>
});
var recognizer2 = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: <knowledgeBaseId>,
subscriptionKey: <subscriptionKey>
});
let QNARecognizer;
bot.dialog('/', [(session, args) => {
var msg = new builder.Message(session)
.text("Select a choice")
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "option1", "option1"),
builder.CardAction.imBack(session, "option2", "option2"),
]
)
);
builder.Prompts.choice(session, msg, ["option1", "option2"]);
}, (session, results,next) => {
console.log(results);
session.userData.kb = results.response.entity;
switch (results.response.entity) {
case 'option1':
QNARecognizer = recognizer1;
break;
case 'option2':
QNARecognizer = recognizer2;
break;
default:
session.endDialog('not matched');
}
builder.Prompts.text(session,'please ask your quesion');
}, (session, results) => {
QNARecognizer.recognize(session,(err,result)=>{
session.send(result.answers[0].answer);
})
}
])
我正在使用 Bot Framework 和 Node.js 开发聊天机器人。我的目的是用菜单引导用户。我想象用户打开机器人并自动提示:“嗨,我是你的机器人,你在找什么? - 选项 1 - 选项 2 ”
一旦用户点击其中一个选项,他就可以问我几个与该选项相关的问题,我想我会附上一个特定的 QnA Maker 知识库。
我尝试在网络上搜索并寻找在 Github 上发布的样本,但没有太大帮助。任何人都可以帮我举一个实际的例子吗? 提前致谢。
您可以使用 prompts.Choice 来完成此操作。这将为用户显示每个选项的按钮 - 用户可以单击它们或键入响应。
因此,如果您 QnAMaker dialog 定义了...
var recognizer = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: 'set your kbid here',
subscriptionKey: 'set your subscription key here'});
var basicQnAMakerDialog = new cognitiveservices.QnAMakerDialog({
recognizers: [recognizer],
defaultMessage: 'No match! Try changing the query terms!',
qnaThreshold: 0.3
});
bot.dialog('/QnAMakerDialogue', basicQnAMakerDialog);
您可以根据用户的选择使用 replaceDialog 切换到此对话框...
function (session, results) {
builder.Prompts.choice(session, "Hi I'm your bot you what are you looking for?", ["Ask a question", "Other cool stuff"], {listStyle: builder.ListStyle.button});
},
function (session, results) {
if(results.response) {
switch (results.response.entity) {
case 'Ask a question':
session.replaceDialog('/QnAMakerDialogue');
case 'Other cool stuff':
session.replaceDialog('/CoolStuffDialog');
default:
session.send("Something went horribly wrong");
return;
}
}
}
如果您的用户回复说他们想提问,您将需要提示该问题。为此,我有时会使用包装对话 QnAPromptDialogue ...
function (session,args,next) {
//if the user just entered 'ask question' or similar, prompt for the actual question
var regex = new RegExp("^ask .*");
if(regex.test(session.message.text)) {
builder.Prompts.text(session, "Go ahead, what is your question?");
} else {
next();
}
},
function (session, results) {
session.replaceDialog('/QnAMakerDialogue');
}
可能不适合所有人,但万一它有用。
一般来说,您可以创建多个 QnAmaker 服务,并在您的机器人应用程序中定义多个具有不同 kb
的 QnAMakerRecognizer
,然后利用 recognize()
中的 QnAMakerRecognizer
您的机器人瀑布流可以根据您自己的条件匹配问题。
快速示例:
var recognizer1 = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: <knowledgeBaseId>,
subscriptionKey: <subscriptionKey>
});
var recognizer2 = new cognitiveservices.QnAMakerRecognizer({
knowledgeBaseId: <knowledgeBaseId>,
subscriptionKey: <subscriptionKey>
});
let QNARecognizer;
bot.dialog('/', [(session, args) => {
var msg = new builder.Message(session)
.text("Select a choice")
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "option1", "option1"),
builder.CardAction.imBack(session, "option2", "option2"),
]
)
);
builder.Prompts.choice(session, msg, ["option1", "option2"]);
}, (session, results,next) => {
console.log(results);
session.userData.kb = results.response.entity;
switch (results.response.entity) {
case 'option1':
QNARecognizer = recognizer1;
break;
case 'option2':
QNARecognizer = recognizer2;
break;
default:
session.endDialog('not matched');
}
builder.Prompts.text(session,'please ask your quesion');
}, (session, results) => {
QNARecognizer.recognize(session,(err,result)=>{
session.send(result.answers[0].answer);
})
}
])