如何识别机器人无法回答的问题?

问题描述 投票:0回答:1

我的组织正在开始尝试使用微软机器人框架。我们的企业架构师提出的一个问题如下。

我们如何识别机器人无法回答的问题?

我已经检查了文档,但我仍然不清楚。谁能详细介绍一下他们用来识别未回答问题的技术?我们认为这很重要,因为它可以识别进一步发展的机会。

botframework luis qnamaker
1个回答
1
投票

你可以使用一些技术来实现这一点。从本质上讲,你要做的是存储Bot未能提供答案的任何问题,以便分析。

您可以使用QnAMaker中的計分機制來做到這一點。例如,如果QnAMaker返回的分数为0,则说明答案不存在,所以我们需要将该问题写回存储进行分析。

在Azure堆栈中,你可以使用很多存储方案来实现,比如Application Insights、Cosmos、Blob、SharePoint Lists等。

在下面的例子中(为简洁起见,代码有所删减),我使用Application Insights来存储这些信息。我已经导入了 机器人必达-应用心得 包,并创建了一个简单的自定义事件,以捕获任何在QnAMaker中得分为零的回答。

const {
    ApplicationInsightsTelemetryClient,
    ApplicationInsightsWebserverMiddleware
} = require('botbuilder-applicationinsights');

const {
    MessageFactory,
    CardFactory
} = require('botbuilder');

const {
    QnAServiceHelper
} = require('../helpers/qnAServiceHelper');

const {
    CardHelper
} = require('../helpers/cardHelper');

const {
    FunctionDialogBase
} = require('./functionDialogBase');

// Setup Application Insights
settings = require('../settings').settings;
const appInsightsClient = new ApplicationInsightsTelemetryClient(settings.instrumentationKey);

class QnADialog extends FunctionDialogBase {

    constructor() {
        super('qnaDialog');
    }

    async processAsync(oldState, activity) {

        var newState = null;
        var query = activity.text;
        var qnaResult = await QnAServiceHelper.queryQnAService(query, oldState);
        var qnaAnswer = qnaResult[0].answer;
        var qnaNonResponse = qnaResult[0].score;

        var prompts = null;
        if (qnaResult[0].context != null) {
            prompts = qnaResult[0].context.prompts;
        }

        var outputActivity = null;
        if (prompts == null || prompts.length < 1) {
            outputActivity = MessageFactory.text(qnaAnswer);

        } else {
            var newState = {
                PreviousQnaId: qnaResult[0].id,
                PreviousUserQuery: query
            }

            outputActivity = CardHelper.GetHeroCard(qnaAnswer, prompts);
        }

        if (qnaNonResponse === 0) {

                const {
                    NonResponseCard
                } = require('../dialogs/non-response');
                const quicknonresponseCard = CardFactory.adaptiveCard(NonResponseCard);
                outputActivity = ({
                    attachments: [quicknonresponseCard]
                });
                console.log("Cannot find QnA response for" + " " + query);
                appInsightsClient.trackEvent({
                    name: "Non-response",
                    properties: {
                        question: query
                    }
                });
            }
        return ([newState, outputActivity, null]);
    }
}

module.exports.QnADialog = QnADialog;

然后,我可以在Power Bi的Application Insights中连接查询,以显示那些未回答的问题。

有多种方法可以实现这一点,但这是我最终选择的一种。


0
投票

根据你的模型的大小和复杂程度,你会想要使用LUIS或者qnamaker。如果你的母体非常简单,qnamaker就可以了。如果你的母体比较复杂,特别是如果你想使用实体,LUIS绝对是最佳选择。他们每个人都有自己的技术,@steviebleeds描述了如何在qnamaker上做。对于Louis来说,你要看看你的置信度阈值,你应该记录那些低于你设置的置信度阈值的信息。每次你从Lewis那里得到一个预测,它就会给你发送一个意图列表,每个意图都有一个预测的置信度百分比。你应该评估这个置信度的百分比,并根据你的新持有决定是否要或不回答你的用户。你也想看看所有的问题,有返回没有意图。

© www.soinside.com 2019 - 2024. All rights reserved.