Вопрос:

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

node.js botframework azure-bot-service qnamaker

355 просмотра

2 ответа

54 Репутация автора

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

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

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

Автор: Fraangel Источник Размещён: 29.12.2017 12:28

Ответы (2)


1 плюс

60 Репутация автора

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

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

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

Автор: dividor Размещён: 29.12.2017 06:15

1 плюс

12403 Репутация автора

Решение

Вообще говоря, вы можете создать несколько услуг QnAmaker, и определить несколько QnAMakerRecognizerс разными kbх в приложении бота, а затем рычаги 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);
        })
    }
])
Автор: Gary Liu - MSFT Размещён: 01.01.2018 06:29
Вопросы из категории :
32x32