【问题标题】:Microsoft Bot Framework with LUIS not detecting all intents带有 LUIS 的 Microsoft Bot Framework 未检测到所有意图
【发布时间】:2017-04-24 16:48:44
【问题描述】:

我正在使用 MS Bot 框架和节点 js 中的 LUIS 创建一个聊天机器人。我在 LUIS 中创建了两个名为“Book”和“Pending”的意图以及一个名为“Annual Leave”的实体。我已将 LUIS URL 添加到我的聊天机器人代码中,当我在控制台中对其进行测试时,我发现某些话语得到了响应,而有些则没有。

例如,当我说“我如何查看剩余的年假?”时,我收到的回复是“您可以在此处找到剩余的 A/L”。但是当我说“如何查看我的待处理年假?”时,我没有得到任何回复。

我对工作话语的 Git Bash 响应

ChatConnector:收到消息。

session.beginDialog(/)

/ - session.sendBatch() 发送 0 条消息

/ - IntentDialog.matches(待定)

/ - 瀑布()第 1 步,共 1 步

/ - session.beginDialog(BotBuilder:Prompts)

.Prompts.text - session.send()

.Prompts.text - session.sendBatch() 发送 1 条消息

我对无效话语的 Git Bash 响应

ChatConnector:收到消息。

.Prompts.text - session.endDialogWithResult()

/ - session.endDialogWithResult()

session.sendBatch() 发送 0 条消息

但是,当我在 LUIS 上测试完全相同的话语时,它会检测到具有高置信度分数的意图和实体。

这发生在很多话语中。我不知道是什么导致了这个问题。

我的聊天机器人代码

var restify = require('restify');
var builder = require('botbuilder');

//=========================================================
// Bot Setup
//=========================================================

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
  
// Create chat bot
var connector = new builder.ChatConnector({
    appId: 'MY_APP_ID',
    appPassword: 'MY_APP_PASSWORD'
});
var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());

server.get('/', restify.serveStatic({
 directory: __dirname,
 default: '/index.html'
}));


//=========================================================
// Bots Dialogs
//=========================================================
    
var recognizer = new builder.LuisRecognizer('MY_LUIS_URL');
var intents = new builder.IntentDialog({ recognizers: [recognizer] });
bot.dialog('/', intents);
   

intents.matches('Book', [
    function (session, args, next) {
       var task = builder.EntityRecognizer.findEntity(args.entities, 'Annual Leave');
                  builder.Prompts.text(session, "You can book your A/L here.");  
    }
]),

intents.matches('Pending', [
    function (session, args, next) {
        var task = builder.EntityRecognizer.findEntity(args.entities, 'Annual Leave');
                  builder.Prompts.text(session, "You can find your remaining A/L here.");
       
    }
]);

【问题讨论】:

  • 嗨,Anish,您最近是否重新训练和更新了您的模型? (或者至少在您的示例话语之后?)
  • 嗨@StevenG.,我已经在我的示例话语之后训练了它们,现在我再次训练了它们,我上面提供的示例现在可以工作,但某些新的话语不是。例如,我说“我想知道我还剩多少假期”,但没有得到任何回应,但 LUIS 以 0.95 的置信度正确回答。我已经用大约 30 句话训练了它。我应该用每一种可能性来训练它吗?
  • 嗯,LUIS 是……一开始并不聪明,但你不应该对每一种可能性都进行训练。我应该在我最初的评论中问你这个问题,但你已经重新发布了你的模型,对吗?
  • 是的,每次训练时都会重新发布。那么我应该在这里采取什么方法呢?用我遇到的每一个失败的话语来训练它?或者 LUIS 最终会学会吗?
  • 请看下面 Pavel 的回答;我相信他的第二点是正确的。我猜想与你的机器人交谈它会识别第一个话语,然后就不起作用了?那是因为你没有打电话给session.endDialog()session.endConversation()。没有这些,你的机器人就会卡在当前的对话框中。

标签: node.js botframework azure-language-understanding


【解决方案1】:

首先,我建议您添加intents.onDefault() 对话框,这样您就有了None 意图的后备。这样您就可以知道是 LUIS 无法识别意图,还是其他原因。

其次,如果您使用IntentDialog,我会明确结束对话。当您执行builder.Prompts.text() 时,机器人框架将在堆栈上推送一个特殊的Prompts 对话框,并等待答案将其传递给您的瀑布中不存在的next。我想知道这是否是你正在经历的。尝试将您的 Prompts.text(message) 替换为 session.endDialog(message)

最后,考虑使用新的triggerAction 语法。我在这里解释了一些:http://www.pveller.com/smarter-conversations-part-2-open-dialogs/#Trigger-Actions

附言你也可以调试你的机器人。我是 VS Code 的忠实粉丝,它就像在 node_modulesbotbuilder 源中设置断点一样简单,以查看发生了什么、如何识别和路由用户话语。

【讨论】:

    【解决方案2】:

    如果有其他人有这个问题。首先检查您的 appsettings.json LuisSlot 是否指向 Staging,然后在发布 luis 使用 (bf luis:generate:cs) 命令后再次将您的 json 转换为 cs 文件并在 botframework 中更新您的 LuisModel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多