Действительные KnowledgeBaseId и SubscriptionKey не предоставлены - PullRequest
0 голосов
/ 21 мая 2018

Мне нужна помощь, после перехода на новый QNAMaker, я теперь получаю сообщение об ошибке: Valid KnowledgeBaseId и SubscriptionKey не предоставлены.Используйте QnAMakerServiceAttribute или установите поля в QnAMakerDialog.Что мне не хватает?Ключ подписки и KnowledgebaseID уже добавлены.Я просто следовал примеру http-запроса до публикации на портале qnamaker.

enter image description here

using Microsoft.Bot.Builder.Dialogs;
using QnAMakerDialog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
using Microsoft.Bot.Connector;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.CognitiveServices.QnAMaker;

namespace TEST.Dialog
{
[Serializable]

[QnAMaker(authKey:"013ffd97-XXXX-XXXX-981f-ea298085591c", knowledgebaseId:"f81ce668-XXXX-XXXX-XXXX-ad20c5f4d3fa", endpointHostName:"https://XXXX.azurewebsites.net/qnamaker")]
public class QnADialog : QnAMakerDialog<object>
{
   public async Task StartAsync(IDialogContext context)
    {
        context.PrivateConversationData.TryGetValue("Name", out name);
        await context.PostAsync($"Hello {name}. The QnA Dialog was started. Ask a question.");
        context.Wait(MessageReceivedAsync);

    }

    public async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
    {
        try
        {
            // ProcessResultAndCreateMessageActivity will remove any attachment markup from the results answer
            // and add any attachments to a new message activity with the message activity text set by default
            // to the answer property from the result
           // var messageActivity = ProcessResultAndCreateMessageActivity(context, ref result);
            if (result.Score > 30 && result.Answer != NOMATCH)
            {
                await context.PostAsync(result.Answer);
                context.Wait(this.MessageReceived);
                return;
            }
            else
            {
                await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
            }
        }
        catch (Exception ex)
        {
            throw;
        }

    }

    public override async Task NoMatchHandler(IDialogContext context, string originalQueryText)
    {
        try
        {
            await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
        }
        catch (Exception ex)
        {
            throw;
        }

    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        // calculate something for us to return
        int length = (activity.Text ?? string.Empty).Length;

        // return our reply to the user
        //await context.PostAsync($"You sent {activity.Text} which was {length} characters");

        context.Wait(this.MessageReceived);
        return;
    }

     private async Task DialogsCompleted(IDialogContext context, IAwaitable<object> result)
    {
        var success = await result;
        //if (!(bool)success)
        //    await context.PostAsync("I'm sorry. I didn't understand you.");

        //context.UserData.Clear();
        context.Wait(MessageReceived);
    }


    [QnAMakerResponseHandler(30)]
    public async Task LowScoreHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
    {
        //await context.PostAsync($"I found an answer that might help: {result.Answer}");
        await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
        //context.Wait(MessageReceived);
    }
}
}

RootDialog, который вызывает QNAMaker:

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace Test.Dialog
{
[Serializable]
public class RootDialog : IDialog<object>
{
    public string name = string.Empty;
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
        return Task.CompletedTask;
    }


     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        try
       {
            //Some User Code that retreives user via PrivateConversationData




            //Calls QNADialog

            context.Call(new QnADialog(), MessageReceivedAsync);
       }
}

}

Моя версия CognitiveServices: Microsoft.Bot.Builder.CognitiveServices.1.1.7 Bot Builder, Соединитель ботов: 3.15.2.2 QNADialog: 1.2.0

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Похоже, что вы используете QnAMakerDialog со службой QnA Maker v4.0, но в описании пакета NuGet QnAMakerDialog и GitHub readme QnAMakerDialog (обновлено для работы сAPI QnA Maker v3) , мы можем обнаружить, что этот пакет слепков QnAMakerDialog может работать с v3 API QnA Maker, а не со службой QnA Maker v4.0.

Для работы со службой QnA Maker v4.0Как сказал Николас Р., вы можете использовать этот пакет NuGet: Microsoft.Bot.Builder.CognitiveServices , чтобы создать свой QnAMakerDialog.

[Serializable]
public class QnADialog : QnAMakerDialog
{
    public QnADialog() : base(new QnAMakerService(new QnAMakerAttribute("{qnaAuthKey_here}", " {knowledgebaseId_here}", "No good match in FAQ.", 0.5, 1, "https://xxxx.azurewebsites.net/qnamaker")))
    { }

    //other code logic
}
0 голосов
/ 21 мая 2018

Как объяснено в общем доступном объявлении, вы все равно можете использовать пакет Microsoft.Bot.Builder.CognitiveServices в своем коде: код был изменен для обработки вызовов с бот v1 на v3 и нового v4 (версия GA).

Вам просто нужно добавить необходимую информацию, то есть имя хоста конечной точки , как это было ранее на стороне Microsoft.

Таким образом, ваш диалоговый код будет выглядеть следующим образом (см. Официальный пример Github). здесь ):

[Serializable]
[QnAMaker("set yout authorization key here", "set your kbid here", <score threshold>, <number of results>, "endpoint hostname")]
public class SimpleQnADialog : QnAMakerDialog
{
}
...