您如何识别机器人无法回答的问题
How do you identify questions that the bot could not answer
我的组织开始试验 Microsoft 机器人框架。我们的企业架构师提出的问题之一如下:
我们如何识别机器人无法回答的问题?
我已经查看了文档,但我仍然不清楚。任何人都可以详细说明他们用来识别未回答问题的技术吗?我们认为这很重要,因为它确定了进一步增长的机会。
您可以使用多种技术来实现这一点。本质上,您要做的是存储 Bot 无法提供分析答案的任何问题。
您可以使用 QnAMaker 中的评分机制来完成此操作。例如,如果 QnAMaker returns 得分为零,则答案不存在,因此我们需要将该问题写回存储以供分析。
您可以在 Azure 堆栈中为此使用多种存储解决方案,例如 Application Insights、Cosmos、Blob、SharePoint 列表等。
在下面的示例中(为简洁起见对代码进行了删减),我使用 Application Insights 来存储此信息。我导入了 botbuilder-applicationinsights 包并创建了一个简单的自定义事件来捕获针对 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 中使用的查询,以显示那些未回答的问题。
有多种方法可以实现这一点,但这是我最终选择的方法。
根据模型的大小和复杂性,您将需要使用 LUIS 或 qnamaker。如果你的妈妈很简单,qnamaker 就可以了。对于更复杂的东西,特别是如果你想使用实体 LUIS 绝对是可行的方法。他们每个人都有自己的技术,@steviebleeds 描述了如何在 qnamaker 上做到这一点。对于 Louis,您将查看您的置信度阈值,您应该记录低于您设置的置信度阈值的情况。每次你从 Lewis 那里得到一个预测时,它都会向你发送一个意图列表,每个人都有一个对预测的置信度百分比。您应该评估此置信度百分比,并根据您的新鲜度来决定是否要回答您的用户。您还想查看所有具有 return none 意图的问题。
我的组织开始试验 Microsoft 机器人框架。我们的企业架构师提出的问题之一如下:
我们如何识别机器人无法回答的问题?
我已经查看了文档,但我仍然不清楚。任何人都可以详细说明他们用来识别未回答问题的技术吗?我们认为这很重要,因为它确定了进一步增长的机会。
您可以使用多种技术来实现这一点。本质上,您要做的是存储 Bot 无法提供分析答案的任何问题。
您可以使用 QnAMaker 中的评分机制来完成此操作。例如,如果 QnAMaker returns 得分为零,则答案不存在,因此我们需要将该问题写回存储以供分析。
您可以在 Azure 堆栈中为此使用多种存储解决方案,例如 Application Insights、Cosmos、Blob、SharePoint 列表等。
在下面的示例中(为简洁起见对代码进行了删减),我使用 Application Insights 来存储此信息。我导入了 botbuilder-applicationinsights 包并创建了一个简单的自定义事件来捕获针对 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 中使用的查询,以显示那些未回答的问题。
有多种方法可以实现这一点,但这是我最终选择的方法。
根据模型的大小和复杂性,您将需要使用 LUIS 或 qnamaker。如果你的妈妈很简单,qnamaker 就可以了。对于更复杂的东西,特别是如果你想使用实体 LUIS 绝对是可行的方法。他们每个人都有自己的技术,@steviebleeds 描述了如何在 qnamaker 上做到这一点。对于 Louis,您将查看您的置信度阈值,您应该记录低于您设置的置信度阈值的情况。每次你从 Lewis 那里得到一个预测时,它都会向你发送一个意图列表,每个人都有一个对预测的置信度百分比。您应该评估此置信度百分比,并根据您的新鲜度来决定是否要回答您的用户。您还想查看所有具有 return none 意图的问题。