Botframework findEntity()问题

我遇到了一个奇怪的问题。 最初我有这个让我的实体,它正常工作。

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

然而,由于某种原因,我似乎无法弄清楚为什么,它停止了工作,我不得不改变它添加一个额外的intent ,让它再次工作。

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

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

有什么我改变,可能会导致这个?

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

编辑2:我的args返回我这个:

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

最初我可以使用args.entitiesfind我的实体,但现在格式改变了,我必须使用args.intent.entitiesfind我的实体。

我find了这个使用args.entities例子,而这个使用了args.intent.entities 。 我知道这并不影响我,因为我可以改变我的代码,但我很想知道为什么会发生这种情况?

谢谢。

你有没有检查你的机器人LuisRecognizers的初始化,并将它们相互比较? 他们很可能在代码上稍有不同, BotBuilder-Sample / Node / intelligence-LUIS示例仅使用第27行的botbuilder的LuisRecognizer 。

 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

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

以下代码取自“意图对话”文档的实体识别部分(您的第一个示例):

 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()将匹配的意图后,将匹配的全部细节传递到瀑布或对话框中的第一步。 但是,它将parsing到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>); 

甚至不同types的识别器…

 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', [...]);