LUIS Microsoft Bot Framework в каскадной беседе

У меня уже есть разговор о водопаде. Я хочу адаптировать его так, чтобы он мог извлекать данные из более сложных ответов пользователей на вопросы бота.

В моем приложении LUIS я создал намерение с именем GetLocation, которое обучено находить сущность с именем Location. Примером этого является ввод пользователя «Я ищу в Бристоле», что соответствует сущности «Бристоль». Вот что у меня сейчас есть:

function(session) {
       builder.Prompts.text(session, "Hello... Which city are you looking    in?");
},
function(session, results) {
    session.privateConversationData.city = results.response;
    builder.Prompts.number(session, "Ok, you are looking in " + results.response + ", How many bedrooms are you looking for?");
},
etc...

Вместо того, чтобы просто сохранять строку ответа, я хочу отправить строку ответа в LUIS и извлечь из нее местоположение города. Все примеры LUIS, которые я нашел, предназначены для сопоставления и перехода к новым намерениям, однако я просто хочу, чтобы разговор о водопаде продолжался. Как мне использовать LUIS для этого?


person Alex Douglas    schedule 27.02.2017    source источник


Ответы (1)


Я думаю, вы можете сделать это, установив два разных диалоговых окна:

Диалог 1:

Это диалоговое окно, показанное выше, обычное диалоговое окно «Водопад», которое ведет к разговору.

Диалог 2:

Этот диалог будет создан с помощью распознавателя намерений LUIS с использованием вашей модели LUIS. Диалог 1 выдаст запрос, затем перейдет к этому диалоговому окну и проанализирует текст, введенный пользователем. Поскольку ваша модель уже обучена распознавать местоположение, все, что вам нужно сделать, это извлечь объект.

После того, как диалоговое окно 2 проанализирует информацию о местоположении с помощью LUIS и извлечет объект, вы завершите диалог и вернете объект (расположение) обратно в диалоговое окно 1, которое все еще будет находиться в Стек диалогов.


Код

//create intent recognizer based on LUIS model
var luisModel = "<Your LUIS Model URL>";
var recognizer = new botbuilder.LuisRecognizer(luisModel);
//create dialog handler for info to be parsed by LUIS
var dialog = new botbuilder.IntentDialog({ recognizers: [recognizer] });

//root dialog
bot.dialog("/", [
    function(session){

        //prompt user and pop LUIS intent dialog onto dialog stack
        session.send("Hello, which city are you looking in?");
        session.beginDialog("/begin_loc_parse");

    },

    //this will be resumed after our location has been extracted
    function(session, results){

        //check for extracted location
        if(results.entity){
            //got location successfully
            session.send("Got city from user: " + results.entity);

            //resume normal waterfall with location.....

        } else {
            //start over
            session.beginDialog("/");
        }
    }
]);

//LUIS intent dialog
dialog.matches("input_location", function(session, args){

    //grab location entity
    var city = botbuilder.EntityRecognizer.findEntity(args.entities, "builtin.geography.city");

    if(city){
        //pop the LUIS dialog off of the dialog stack
        //and return the extracted location back to waterfall
        session.endDialogWithResult(city);
    } else session.endDialog("Couldn't extract city entity.");

});

//called if user doesn't enter something like "I am looking in [city]"
dialog.onDefault(function(session, args){
    session.send("I'm sorry, I didn't quite catch that. In which city are you looking?");
});

Итак, в основном, в корневом диалоговом окне, когда вы запрашиваете у пользователя местоположение, а затем вызываете session.beginDialog("/begin_loc_parse"), вы передаете диалог в свой диалог намерений LUIS.

Любой текст, введенный пользователем после этого момента, будет интерпретирован вашей моделью LUIS. Это позволяет вам использовать вашу модель для распознавания и извлечения информации о местоположении от пользователя.

Затем необходимо использовать session.endDialogWithResult() для извлечения диалогового окна LUIS из стека и возврата к исходному водопаду с новым извлеченным местоположением.

person Tony Anziano    schedule 08.03.2017