Botframework findEntity()问题

时间:2017-04-03 21:27:37

标签: node.js botframework luis

我遇到了一个奇怪的问题。最初我有这个来获取我的实体并且它正常工作。

x = builder.EntityRecognizer.findEntity(args.entities, 'get_x');

但是,出于某些原因,我似乎无法弄清楚原因,它已停止工作,我不得不将其更改为添加额外的intent以使其再次发挥作用。

x = builder.EntityRecognizer.findEntity(args.intent.entities, 'get_x');

当我认为这种情况开始发生时,我正在改变我对LUIS的一种意图。然后我立即撤消对该意图的所有更改,但是我的所有意图都以某种方式受到影响,因为我需要在intent方法的entity参数中添加另一个findEntity()

我有什么改变可能导致这种情况吗?

编辑:实际上改变我的LUIS意图不应该影响它,因为我使用相同的LUIS模型的另一个机器人并且它仍然正常工作。

Edit2:我的args将此返回给我:

{ action: '*:SomeIntent',
  intent:
   { score: 0.999846458,
     intent: 'SomeIntent',
     intents:
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object] ],
     entities: [ [Object], [Object], [Object], [Object] ] },
  libraryName: '*' }

最初我可以使用args.entities来查找我的实体,但现在格式已更改,并且我已使用args.intent.entities来查找我的实体。

我找到了this one使用args.entitiesthis one使用args.intent.entities时的示例。我知道这并不会影响我,因为我可以改变我的代码,但我很想知道为什么会这样?

感谢。

1 个答案:

答案 0 :(得分:4)

您是否检查了机器人LuisRecognizers的初始化并将它们相互比较?它们很可能在代码中略有不同,BotBuilder-Sample/Node/intelligence-LUIS示例仅使用LuisRecognizer上的botbuilder line 27

var recognizer = new builder.LuisRecognizer(process.env.LUIS_MODEL_URL); // Line 27
bot.recognizer(recognizer);

bot.dialog('SearchHotels', [
    function (session, args, next) {
        ...
        var cityEntity = builder.EntityRecognizer.findEntity(args.intents.entities, 'builtin.geography.city');

如果仅使用LuisRecognizer,则需要使用args.intent.entities而不是args.entities

如果您将IntentDialog与LuisRecognizer一起使用,则设置的不同之处在于您将var recognizer = new builder.LuisRecognizer(<model>)传递给new builder.IntentDialog({ recognizers: [recognizer] })。 IntentDialog中的对象是它在构造中接收的唯一参数,可选属性recognizers采用IIntentRecognizers数组(由LuisRecognizer实现)。

以下代码取自Intent Dialog docs的Entity Recognition部分(您的第一个示例):

var recognizer = new builder.LuisRecognizer('<your models url>');
var intents = new builder.IntentDialog({ recognizers: [recognizer] });
bot.dialog('/', intents);

intents.matches('AddTask', [
    function (session, args, next) {
        var task = builder.EntityRecognizer.findEntity(args.entities, 'TaskTitle');
        if (!task) {
            builder.Prompts.text(session, "What would you like to call the task?");
        } else {
            next({ response: task.entity });
        }
    },
    ...
]);
在匹配意图后,

intents.matches()pass the full details of the match到瀑布或对话框的第一步。但是,它会解析为intent属性/对象,这意味着您只需使用args.intent.entities而不必使用args.entities

编辑:

  啊,那可能就是这样。出于某种原因,我记得它在我改变它之后正常工作。只是想知道,两者之间是否有任何利弊?或者只是编码风格不同?

这不一定是一个利弊项目,但两种方法之间的区别在于,在第一种方法中,您只能合并一个Luis模型。 (见下文)

var mySingleRecognizer = new builder.LuisRecognizer(<model>);
bot.recognizer(mySingleRecognizer);

但是,如果您使用IntentDialog({ recognizers: ... }),您将能够传入一系列识别器;例如多个LUIS模型......

var HotelRecognizer = new builder.LuisRecognizer(<HotelModel>);
var DogRecognizer = new builder.LuisRecognizer(<DogModel>);

甚至不同类型的识别器......

var RegularRecognizer = new builder.RegExpRecognizer('Cats', /^cat$/i);

进入你的IntentDialog:

var intents = new builder.IntentDialog({ recognizers: [HotelRecognizer, DogRecognizer, RegularRecognizer] });

intents.matches('GetDog', [...]);
intents.matches('SearchHotels', [...]);
intents.matches('Cats', [...]);