Bot Framework V4 Многооборотная подсказка Проблема с функцией QnaMaker - PullRequest
1 голос
/ 17 октября 2019

У меня есть бот с прямой линией, подключенный к QnaMaker и тестирующий новую функцию подсказки о том, как ответить пользователю, ниже образец Qna от QnaMaker

1) 
q) How to get New York Printer details(QnAID: 13)
a) details are below NY73889-B0

2)
q) How to get Dallas printer details (QnAID: 14)
a) details are below DL093883-B1

3)
q) printer location 
a) please chose from the 2 options below
   Dallas(QnAID: 13)  New York(QnAID: 14)    (Prompts)
4)
q)Dallas
a) Dallas is a beautiful city

5)
q)New York
a) City of lights

Проблема: theПользователь задает вопрос «Расположение принтера» и получает ответ с подсказкой Нью-Йорк и Даллас. Затем, когда пользователь выбирает одно из мест, скажем, Даллас, в идеале он должен ответить с ответом

2) q) Как получить подробности о принтере Далласа (QnAID: 14) a) подробности ниже DL093883-B1 , так как у нас есть приглашение, связанное с вопросом 4, и мы используем старое состояние, в котором выбран вариант QnaID для Далласа ... но вместо этого он дает ответ ниже, поскольку он соответствует только тексту приглашения Далласа, на который ответил пользователь безУчитывая старое государство, любая помощь приветствуется

4) q) Даллас a) Даллас - прекрасный город

protected override async Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(object oldState, Activity inputActivity)
{
    Activity outputActivity = null;
    QnABotState newState = null;
    var query = inputActivity.Text; ;


    //Step 4) We Build the json based on the value selected user so we make a call to the Qna Maker using the response from the user on the button click and the previous state
    //here we check if there was a prompt  from the previous question and update the state to send to the bot for response based on the option selected
    if (((QnAPrompting.Models.QnABotState)oldState) != null)
    {
        for (int i = 0; i < ((QnABotState)oldState).PreviousPromptValues.Length; i++)
        {
            if (((QnABotState)oldState).PreviousPromptValues[i].DisplayText == query)
            {
                ((QnABotState)oldState).qnaId = ((QnABotState)oldState).PreviousPromptValues[i].QnaId;
                ((QnABotState)oldState).question = query;
            }
        }
    } //Step5). when we get the response from the user after the choosing an option from the prompt, it queries the qnamaker and filters based on the old state as well
    //Step1). we get the prompts based on the question asked for the first time the old state is empty
    var qnaResult = await _qnaService.QueryQnAServiceAsync(query, (QnABotState)oldState);
    var qnaAnswer = qnaResult[0].Answer;
    var prompts = qnaResult[0].Context?.Prompts;

    if (prompts == null || prompts.Length < 1)
    {

        if (((QnAPrompting.Models.QnABotState)oldState) != null)
        {
            if (((QnAPrompting.Models.QnABotState)oldState).IsPreviousPrompt)
            {
                string method = "/knowledgebases/{0}/{1}/qna/";
                var method_with_id = String.Format(method, "KBID", "prod");
                var uri = "https://westus.api.cognitive.microsoft.com" + "/qnamaker/v4.0" + method_with_id;
                Console.WriteLine("Calling " + uri + ".");
                var response = await Get(uri);
            }
        }
        outputActivity = MessageFactory.Text(qnaAnswer);
    }
    else //Step 2.)prompt parameters are stored in the state
    {

        ContextValues ctx = new ContextValues();
        ctx.PreviousQnaId = qnaResult[0].Id;
        ctx.PreviousUserQuery = query;
        //store here in azure table
        newState = new QnABotState
        {
            question = string.Empty,
            top=10,
            userId = "Default",
            context = ctx,
            PreviousPromptValues = prompts,
        };

        outputActivity = CardHelper.GetHeroCard(qnaAnswer, prompts);
    }
    //Step 3) Prompt is displayed to the user
    return (newState, new Activity[] { outputActivity }, null);
}

1 Ответ

0 голосов
/ 22 октября 2019

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

...