未提供有效的 KnowledgeBaseId 和 SubscriptionKey

Valid KnowledgeBaseId and SubscriptionKey not provided

我需要帮助,在迁移到新的 QNAMaker 后,我现在收到一个错误:未提供有效的 KnowledgeBaseId 和 SubscriptionKey。使用 QnAMakerServiceAttribute 或在 QnAMakerDialog 上设置字段。我错过了什么?订阅密钥和知识库 ID 已添加。在 qnamaker 门户中发布时,我只是简单地遵循了示例 http 请求。

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);
    }
}
}

调用QNAMaker的RootDialog:

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);
       }
}

}

我的认知服务版本: Microsoft.Bot.Builder.CognitiveServices.1.1.7 机器人生成器,机器人连接器:3.15.2.2 QNADialog: 1.2.0

如一般可用公告中所述,您仍然可以在代码中使用 Microsoft.Bot.Builder.CognitiveServices 包:代码已更改为处理 bot v1 到 v3 的调用和新的 v4(正式版)。

您只需添加必要的信息,即端点主机名,因为它以前托管在 Microsoft 端。

因此您的对话框代码将如下所示(参见 Github 官方示例 here):

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

您似乎在使用 QnAMakerDialog with QnA Maker service v4.0, but in description of NuGet package QnAMakerDialog and GitHub readme of QnAMakerDialog (updated to work with QnA Maker v3 API),我们可以发现此 QnAMakerDialog nugget 包可以与 QnA Maker API 的 v3 一起使用,而不是 QnA Maker 服务 v4.0。

如 Nicolas R 所说,要使用 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
}