Bot Framework: как создать меню в Node.js SDK?

Я разрабатываю чат-бота с использованием Bot Framework и Node.js. Моя цель - помочь пользователю с меню. Я предполагаю, что пользователь открывает бота, и он автоматически запрашивает: «Привет, я твой бот, ты что ищешь? - option1 - option2»

Как только пользователь нажимает на одну из опций, он может задать мне несколько вопросов, связанных с этой опцией, и я полагаю, что прикреплю определенную базу знаний QnA Maker.

Я пробовал искать в Интернете и искал образцы, опубликованные на Github, но они не так полезны. Кто-нибудь может помочь мне практическим примером? Заранее спасибо.


person Fraangel    schedule 29.12.2017    source источник


Ответы (2)


Вообще говоря, вы можете создать несколько служб QnAmaker и определить несколько QnAMakerRecognizer с разными kb в своем бот-приложении, а затем использовать _ 3_ из 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);
        })
    }
])
person Gary Liu    schedule 01.01.2018
comment
Отлично, спасибо! Еще один вопрос, как я могу объединить QnA Recognizer и Luis? Я все еще что-то читал, но это было не очень полезно, сценарий тот же, у меня все еще есть 2 службы Luis, настроенные на двух QnA maker kb, как будет работать интеграция? - person Fraangel; 03.01.2018
comment
Да, вы можете обратиться к github.com/Microsoft/BotBuilder- CognitiveServices / tree / master / за образец, который должен удовлетворить ваши требования. - person Gary Liu; 04.01.2018

Вы можете сделать это с помощью подсказки. выбор. Это предоставит пользователю кнопки для каждой опции - пользователь может щелкнуть по ним или ввести ответ.

Итак, если у вас есть диалог 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');
}

Может не сработать для всех, но в том числе, если это будет полезно.

person dividor    schedule 29.12.2017
comment
Идея должна заключаться в том, чтобы создать еще один var распознаватель2, в который я поместил бы данные второй базы знаний в QnA, верно? Глядя на второй фрагмент, я попытался скопировать и вставить код в свой, но он генерировал ошибку, поэтому я попробовал следующее: 'bot.dialog (' / ', [function (session, result) {builder.Prompts.choice (session, Hi Я твой бот, ты чего ищешь ?, [Задайте вопрос, Другие интересные вещи], {listStyle: builder.ListStyle.button});} ... 'Но как выглядит мой диалог' / QnAMakerDialogue ' если я хочу использовать QnA kb? Я хочу, чтобы при нажатии я перехожу в spec kb - person Fraangel; 30.12.2017
comment
Для объединения QnA Maker и LUIS эти образцы работают очень хорошо. , вы сможете проверить репо и запустить его. - person dividor; 03.01.2018
comment
Я добавил правку выше в ответ на ваш второй вопрос - person dividor; 03.01.2018