0

我正在使用 Bot Framework 和 Node.js 开发一个聊天机器人。我的目的是用菜单引导用户。我想用户打开机器人,它会自动提示:“嗨,我是你的机器人,你在找什么? - option1 - option2”

一旦用户点击其中一个选项,他可以问我几个与该选项相关的问题,我想我会附上一个特定的 QnA Maker 知识库。

我尝试在网上搜索,并寻找发布在 Github 上的示例,但没有太大帮助。任何人都可以帮我举一个实际的例子吗?提前致谢。

4

2 回答 2

1

您可以使用prompts.Choice来执行此操作。这将为用户提供每个选项的按钮 - 用户可以单击它们或键入响应。

因此,如果您定义了QnAMaker 对话框...

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');
}

可能不适用于每个人,但包括以防万一。

于 2017-12-29T18:15:30.220 回答
1

一般来说,您可以创建多个 QnAmaker 服务,并在您的机器人应用程序中定义多个 QnAMakerRecognizer具有不同kbs 的服务,然后根据您自己的条件在机器人瀑布中利用 来匹配问题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);
        })
    }
])
于 2018-01-01T06:29:46.227 回答