我遇到了一个奇怪的问题。最初我有这个来获取我的实体并且它正常工作。
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.entities
而this one使用args.intent.entities
时的示例。我知道这并不会影响我,因为我可以改变我的代码,但我很想知道为什么会这样?
感谢。
答案 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', [...]);