как закрыть диалог QnAMaker?

Я пытаюсь закрыть диалоговое окно QnAMaker, чтобы пользователь мог вернуться к диалоговому окну Луиса и использовать его снова.

вот мой код, который я использую в luisdialog.cs:

    [LuisIntent("FAQ")]
    public async Task FAQ(IDialogContext context, LuisResult result)
    {
        await context.PostAsync("FAQ");
        var userQuestion = (context.Activity as Activity).Text;
        await context.Forward(new QnADialog(), ResumeAfterQnA, context.Activity, CancellationToken.None);

        //await Task.Run(() => context.Call(new QnADialog(), Callback));
    }
    private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)
    {
        context.Done<object>(null);
    }

А вот диалог QnA:

[Serializable]
[QnAMakerService("endpoint", "knowledge base id", "subscription key")]
public class QnADialog : QnAMakerDialog<object>
{

}

Я попытался переопределить метод start async, чтобы он выходил из диалогового окна с помощью context.done (0), если пользователь вводит «готово», но производитель QnA вообще не запускается, что сбивает с толку.

Также почему, вызывая намерение luis с помощью «FAQ», он также пытался перейти в базу знаний без того, чтобы пользователь снова набирал его, можно ли это исправить?


person user3646742    schedule 26.07.2018    source источник


Ответы (1)


Я пытаюсь закрыть диалоговое окно QnAMaker, чтобы пользователь мог вернуться к диалоговому окну Луиса и использовать его снова.

Вы можете попытаться переопределить DefaultMatchHandler и вызвать context.Done, чтобы закрыть диалоговое окно QnAMaker и передать управление обратно родительскому диалоговому окну. Следующий измененный фрагмент кода мне подходит, обратитесь к нему.

В LuisDialog:

[LuisIntent("FAQ")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
    await context.PostAsync("FAQ");
    await context.Forward(new QnADialog(), ResumeAfterQnA, context.Activity, CancellationToken.None);
}

private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)
{
    //context.Done<object>(null);
    context.Wait(MessageReceived);
}

В QnADialog:

public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
{
    await context.PostAsync($"I found {result.Answers.Length} answer(s) that might help...{result.Answers.First().Answer}.");
    context.Done(true);
}

Результат теста:

введите описание изображения здесь

person Fei Han    schedule 27.07.2018
comment
у вас есть образец или документ для вышеуказанного кода, которому я могу следовать? - person Ronak Shethia; 27.07.2018
comment
Вы можете обратиться к этим примерам на github, чтобы начать работу с диалоговым окном QnA Maker и диалоговым окном Луиса. - person Fei Han; 31.07.2018
comment
спасибо за работу, но просто хочу спросить, можно ли войти в намерение FAQ, а затем, основываясь на вопросе пользователя, он начнет переходить к базам знаний? не сразу? так что что-то вроде ниже: FAQ Добро пожаловать в FAQ намерение, пожалуйста, начните задавать вопрос, какой предел скорости составляет 100, есть ли еще вопросы? нет, спасибо. после этого он возвращается к намерению Луиса. Я могу выйти из намерения FAQ, проверив, набирает ли пользователь «нет», проверив, если originalQueryText == no, context.Done (true), но не слишком уверен, как оттуда действовать. - person user3646742; 02.08.2018