Ошибка при использовании образца QnAMaker с QnAMakerDialog - PullRequest
0 голосов
/ 11 июня 2018

Я пытался создать конструктор класса, используя Microsoft Cognitive и AI toolkit с QnAMaker API, чтобы создать упрощенный чат-бот.

Хотя мой обычный чат-бот qnaMakerAi работает нормально, естьпроблема, когда я пытался улучшить его функцию и включить конструктор.и во время выполнения кода в эмуляторе я получаю сообщение об ошибке:

сообщение: Извините, у моего бота-кода проблема.POST: 500 directline.postActivity

У меня возникает проблема: «Ссылка на объект не установлена ​​для экземпляра объекта.»

Пожалуйста, проверьте и предложите.

Основываясь на комментариях пользователей, вот код для RootDialog - `

пространство имен Microsoft.Bot.Sample.QnABot {

 [Serializable]
public class RootDialog : QnAMakerDialog        //IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        /* Wait until the first message is received from the conversation and call MessageReceviedAsync 
        *  to process that message. */
        context.Wait(this.MessageReceivedAsync);
    }

    public RootDialog() : base(new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnASubscriptionKey"], ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "Sorry, I couldn't find an answer for that")))
    {
    }
    protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
    {
    }
    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        /* When MessageReceivedAsync is called, it's passed an IAwaitable<IMessageActivity>. To get the message,
         *  await the result. */
        var message = await result;
       // var qnaAuthKey = Utils.GetAppSetting("QnAAuthKey");
            var qnaAuthKey = GetSetting("QnAAuthKey");
        // var qnaKBId = Utils.GetAppSetting("QnAKnowledgebaseId");
        // var endpointHostName = Utils.GetAppSetting("QnAEndpointHostName");
        var qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
         var endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];

        // QnA Subscription Key and KnowledgeBase Id null verification
        if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
        {
            // Forward to the appropriate Dialog based on whether the endpoint hostname is present
            if (string.IsNullOrEmpty(endpointHostName))
                await context.Forward(new BasicQnAMakerPreviewDialog(), AfterAnswerAsync, message, CancellationToken.None);
            else
                await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
        }
        else
        {
            await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
        }

    }

    private async Task AfterAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        // wait for the next user message
        context.Wait(MessageReceivedAsync);
    }

    public static string GetSetting(string key)
    {
        var value = ConfigurationManager.AppSettings[key];
        if (String.IsNullOrEmpty(value) && key == "QnAAuthKey")
        {
            value = ConfigurationManager.AppSettings["QnASubscriptionKey"]; // QnASubscriptionKey for backward compatibility with QnAMaker (Preview)
        }
        return value;
    }
}

// Dialog for QnAMaker Preview service
[Serializable]
public class BasicQnAMakerPreviewDialog : QnAMakerDialog
{
    // Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
    // Parameters to QnAMakerService are:
    // Required: subscriptionKey, knowledgebaseId, 
    // Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
    public BasicQnAMakerPreviewDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "No good match in FAQ.", 0.5)))
    { }
}

// Dialog for QnAMaker GA service
[Serializable]
public class BasicQnAMakerDialog : QnAMakerDialog
{
    // Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
    // Parameters to QnAMakerService are:
    // Required: qnaAuthKey, knowledgebaseId, endpointHostName
    // Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
    public BasicQnAMakerDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), ConfigurationManager.AppSettings["QnAKnowledgebaseId"], "No good match in FAQ.", 0.5, 1, ConfigurationManager.AppSettings["QnAEndpointHostName"])))
    { }

}}

`

Для RootDialog -

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Проблема, с которой я столкнулся: «Ссылка на объект не установлена ​​для экземпляра объекта.»

На основе предоставленного вами кода я могу воспроизвести проблему.Похоже, что вы создаете сервис Bot с шаблоном Question and Answer (c #) и загружаете исходный код с портала Azure, а затем модифицируете код, чтобы RootDialog наследовал класс QnAMakerDialog.Как отметил в комментарии Эрик Дальванг, если вы проверите определение QnAMakerDialog, вы обнаружите, что реализация вашего RootDialog недействительна.

Кроме того, на основании моего теста, если вы используете QnAAuthKey и QnAKnowledgebaseId из Служба GA QnAMaker для запуска вашего QnAMakerDialog, но не для предоставления QnAEndpointHostName , исключение будет действительным.

enter image description here

Примечание: Для получения дополнительной информации об услуге GA QnAMaker вы можете обратиться к этому блогу .

0 голосов
/ 05 января 2019

если вы создаете какие-либо объекты вне методов, попробуйте создать объект внутри метода.например

class1 myclass1 = new class1();

public string void MyMethod()
{

}

//above line might be an error.

//do it as



public string void MyMethod()
{
class1 myclass1 = new class1();
}
0 голосов
/ 11 июня 2018

Я не могу понять, где именно вы получаете сообщение об ошибке.

Просто для предложения вы можете попробовать вот так тоже

 using Microsoft.Bot.Builder.CognitiveServices.QnAMaker;
    namespace Test.Qna
    {
        [Serializable]
        [QnAMaker(authKey: "AuthKey", knowledgebaseId: "KnowledgebaseId", defaultMessage: "please rephrase, I could not understand.", scoreThreshold: 0.5, top: 1, endpointHostName: "https://yourAccount.azurewebsites.net/qnamaker")]
        public class QnADialog : QnAMakerDialog
        {
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...