如何在问答 Azure 机器人中设置默认答案

How can i set default answer in Q&A Azure bot

我想在 Q&A Maker Azure Framework Bot 中更改默认答案,但找不到响应此值的字段。我正在阅读文档(但看起来它使用的是较旧的界面),我正在尝试查找此字段,但有结果。

这是我当前的配置屏幕:

我假设您指的是这些文档:QnaMaker - Change Default Answer

它们有点令人困惑,但它们的关键部分是:

You can override this default response in the bot or application code calling the endpoint.

文档中有这张图片的地方:

他们的实际意思是,在 QnAMaker 测试控制台中,您可以从应用程序设置中编辑默认答案。请务必保存、训练和发布您的应用,否则设置可能不会显示。

还有一种方法可以将此设置用于机器人中的默认答案:

在 Node/JS 中,您的机器人根本不会收到 DefaultAnswer。如果没有匹配,它什么也接收不到,所以你必须用类似的东西硬编码它:

const qnaResults = await this.qnaMaker.getAnswers(context);

// If an answer was received from QnA Maker, send the answer back to the user.
if (qnaResults[0]) {
    await context.sendActivity(qnaResults[0].answer);

// If no answers were returned from QnA Maker, show this reply.
// Note: .getAnswers() does NOT return the default answer from the App Service's Application Settings
} else {
    const defaultAnswer = 'No QnA Maker answers were found. This example uses a QnA Maker Knowledge Base that focuses on smart light bulbs. To see QnA Maker in action, ask the bot questions like "Why won\'t it turn on?" or "I need help."'
    await context.sendActivity(defaultAnswer);
}

创建 Azure Web Bot 时,其中一个默认的网络聊天客户端是 Microsoft BotBuilder-Samples project, specifically 49 - QnAMaker All Features

的一个分支

Dialog/QnAMakerBaseDialog.cs 的源代码定义常量 DefaultNoAnswer:

public const string DefaultNoAnswer = "No QnAMaker answers found.";

然后在从 GetQnAResponseOptionsAsync 返回响应时使用该值:

protected async override Task<QnADialogResponseOptions> GetQnAResponseOptionsAsync(DialogContext dc)
{
    var noAnswer = (Activity)Activity.CreateMessageActivity();
    noAnswer.Text = DefaultNoAnswer; // <- used right here

    var cardNoMatchResponse = (Activity)MessageFactory.Text(DefaultCardNoMatchResponse);


    var responseOptions = new QnADialogResponseOptions
    {
        ActiveLearningCardTitle = DefaultCardTitle,
        CardNoMatchText = DefaultCardNoMatchText,
        NoAnswer = noAnswer,
        CardNoMatchResponse = cardNoMatchResponse,
    };

    return responseOptions;
}

这个特定的示例存储库似乎没有在任何地方利用 DefaultAnswer 配置密钥。

您可以通过像这样更新 noAnswer.Text 选择在可用时包含它:

- noAnswer.Text = DefaultNoAnswer;
+ noAnswer.Text = this._configuration["DefaultAnswer"] ?? DefaultNoAnswer;

您还必须通过依赖管理系统传入配置对象。有关完整示例,请参阅 this commit

将 qamakerBaseDialog.js 中的行更改如下

var noAnswer = ActivityFactory.DefaultNoAnswer;

删除 ActivityFactory。并重建代码。

constructor(knowledgebaseId, authkey, host) {
        //ActivityFactory.
        var noAnswer = DefaultNoAnswer;
        var filters = [];
        super(knowledgebaseId, authkey, host, noAnswer, DefaultThreshold, DefaultCardTitle, DefaultCardNoMatchText,
            DefaultTopN, ActivityFactory.cardNoMatchResponse, filters, QNAMAKER_BASE_DIALOG);
        this.id = QNAMAKER_BASE_DIALOG;
    }