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 服务,并在您的机器人应用程序中定义多个具有不同 kbQnAMakerRecognizer,然后利用 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);
        })
    }
])