Как можно получить тег isContextOnly от Microsoft QnA Maker для многооборотных диалогов с C#? - PullRequest
0 голосов
/ 19 июня 2020

В JSON присутствует тег isContextOnly (находится в https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/multiturn-conversation)

Но с c# с использованием Microsoft.Bot.Builder.Dialogs нет возможности чтобы получить, например, response.Answers [0] .isContextOnly

QnA-Maker

Есть ли какое-нибудь решение?

1 Ответ

0 голосов
/ 24 июня 2020

Один из образцов в Microsoft Botframework do tnet образцы репозитория, # 49.QnABot-All-Features , предназначен для обработки различных функций, предлагаемых разработчиком QnA, включая активное обучение и контекст. -только. В частности, класс диалога в примере QnAMakerBaseDialog наследуется от QnAMakerDialog.

В родительском QnAMakerDialog есть метод, который проверяет многооборотный контекст:

private async Task<DialogTurnResult> CheckForMultiTurnPromptAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var dialogOptions = ObjectPath.GetPathValue<QnAMakerDialogOptions>(stepContext.ActiveDialog.State, Options);
    if (stepContext.Result is List<QueryResult> response && response.Count > 0)
    {
        // -Check if context is present and prompt exists 
        // -If yes: Add reverse index of prompt display name and its corresponding QnA ID
        // -Set PreviousQnAId as answer.Id
        // -Display card for the prompt
        // -Wait for the reply
        // -If no: Skip to next step

        var answer = response.First();

        if (answer.Context != null && answer.Context.Prompts.Count() > 0)
        {
            var previousContextData = ObjectPath.GetPathValue(stepContext.ActiveDialog.State, QnAContextData, new Dictionary<string, int>());

            foreach (var prompt in answer.Context.Prompts)
            {
                previousContextData[prompt.DisplayText] = prompt.QnaId;
            }

            ObjectPath.SetPathValue(stepContext.ActiveDialog.State, QnAContextData, previousContextData);
            ObjectPath.SetPathValue(stepContext.ActiveDialog.State, PreviousQnAId, answer.Id);
            ObjectPath.SetPathValue(stepContext.ActiveDialog.State, Options, dialogOptions);

            // Get multi-turn prompts card activity.
            var message = QnACardBuilder.GetQnADefaultResponse(answer, dialogOptions.ResponseOptions.DisplayPreciseAnswerOnly);
            await stepContext.Context.SendActivityAsync(message, cancellationToken).ConfigureAwait(false);

            return new DialogTurnResult(DialogTurnStatus.Waiting);
        }
    }

    return await stepContext.NextAsync(stepContext.Result, cancellationToken).ConfigureAwait(false);
}

Это часть внутреннего водопада получения ответа QnA от QnAMaker.ai. Он ищет контекст в if (answers.Context != null ....

QnAResponseContext QueryResult.Context определение изображения при наведении

В QueryResult.cs контекст определяется как:

/// <summary>
/// Gets or sets context for multi-turn responses.
/// </summary>
/// <value>
/// The context from which the QnA was extracted.
/// </value>
[JsonProperty(PropertyName = "context")]
public QnAResponseContext Context { get; set; }

Итак, чтобы ответить на ваш вопрос, чтобы получить результат тега isContextOnly в C#, выполните отладку результатов из запрос QnAMaker, и вы найдете атрибут с именем Context. Это то, что вы ищете.

...