0

我有一个我目前正在开发的机器人,它利用了LuisRecognizer我模型中定义的匹配意图。启动机器人的初始消息使用提及来识别后续操作的目标。

LUIS 模型正确地识别了意图的主题,但它们的实体显然只引用了已识别用户的原始字符串值。从文档中,我被告知原始消息应该有一个自己的实体数组,其中包括原始提及。我应该能够session.message.entities从我的 NodeJS 机器人实现中访问它。但是,session.message在与 LUIS 意图匹配的任何传入消息中都不存在。

如何检索原始邮件的实体列表?

这是我的机器人的初始化方式:

const recognizer = new builder.LuisRecognizer(config.get('bot.model'))
const intents = new builder.IntentDialog({ recognizers: [recognizer] })

intents.matches('reward', '/reward')
bot.dialog('/', intents)

bot.dialog('/reward', [(session, context, next) => {
  // session.message does not exist here
}])
4

1 回答 1

4

为了解决您关于实体列表的问题,您是否尝试过使用 context.entities 而不是 session.message.entities?虽然 session.message 确实具有“实体”属性,但与上下文对象不同,会话对象本身不会从 LUIS 调用接收数据。

您在瀑布步骤中作为第二个参数传入的上下文(或argsresults)对象包含从 LUIS 生成的意图和实体。

我创建了一个机器人,其中包含 Cortana 为其 LUIS 应用程序的预构建警报应用程序。下面是对话框“/set_alarm”的第一个瀑布步骤的代码。它将控制台记录来自 LUIS 调用的 session.message 和上下文对象(此处称为 args):

bot.dialog('/', intents);
intents.matches('builtin.intent.alarm.set_alarm', '/set_alarm');

bot.dialog('/set_alarm', [
    function (session, args, next) {
        if (session.message) {
            console.log('===\n1st waterfall step, session.message object found:');
            console.log(session.message);
        } else {
            console.log('session.message object not found.');
        }
        if (args) {
            console.log('===\nargs object found:');
            console.log(args);
        }
        ...
    }, 
    // additional waterfall steps
])

这是第一个瀑布步骤的控制台输出的输出。这是通过模拟器进行的聊天机器人交互的屏幕截图。

如果您仍然遇到问题,您可以记录您的上下文对象以便我们可以查看它包含的内容吗?关于缺少 session.message 对象,您是否收到任何错误消息?您发布的代码看起来没有任何问题。

你可以在 github 上找到这个聊天机器人的 repo:https ://github.com/stevengum97/SO_Q43146320

于 2017-04-01T00:12:03.883 回答