nlp.js 对话树 - 后续意图

zphenhs4  于 4个月前  发布在  其他
关注(0)|答案(8)|浏览(70)

再次感谢您在nlp.js上所做的出色工作,它非常庞大!

是否有办法在使用该库时使用后续意图(对话树)?

后续意图在其先前意图的上下文中有意义。例如:
用户:JavaScript有lambda函数吗?
机器人:是的,自ES6以来就有箭头函数。您想了解更多吗?
用户:是的
机器人:让我告诉您关于它的所有信息......
“是”的答案是针对后续意图的,而在不同的意图下,“是”的意义会有所不同。

我已经查看了源代码,似乎没有支持这方面的功能。在这种情况下,如果核心开发人员需要帮助,我将很高兴提供帮助并合作开发这个功能。

dfuffjeb

dfuffjeb1#

简短回答:这个库是一个NLP库,而不是一个聊天机器人编排器,我们建议使用Microsoft Bot Framework来实现。

长答案:我正在准备一个聊天机器人编排器,这将是版本5的主要功能,但也可以在版本4中使用。这里有一个示例:https://github.com/jesus-seijas-sp/nlpjs-examples/tree/master/04.bot

示例的解释:
有一个脚本script.dlg,它是机器人的编排器,这是其内容:

dialog main
  nlp
dialog hellodialog
  run greet
  run help
  run bye
dialog greet
  run ask name
  call uppers user_name
  say Hello {{ user_name }}
dialog help
  say This is the help
  say This is the second help
dialog bye
  say Bye user
dialog ask name
  say What's your name?
  ask user name

这里的不同命令有:

  • dialog:创建一个新的对话,将对话理解为一段对话的小片段。
  • say:机器人对用户说一些话
  • ask:等待用户的输入并将其存储在一个变量中。你会看到"ask user name",这将存储变量"user_name"。
  • run:开始一个新的对话并将其放在堆栈上。当对话结束时,它将从堆栈中移除,对话流程将返回堆栈中的上一个对话。
  • call:执行程序化操作,提供参数。
  • nlp:在这个层面上执行NLP作为问题和答案。

你会在语料库中看到这个:

{
      "intent": "greetings.hello",
      "utterances": [
        "hello",
        "hi",
        "howdy"
      ],
      "answers": [
        "/hellodialog"
      ]
    },

答案/hellodialog`表示,而不是对用户说些什么,它将触发名为"hellodialog"的对话。

  • index.js*如下所示:
const { dockStart } = require('@nlpjs/basic');

(async () => {
  const dock = await dockStart();
  const bot = dock.get('bot');
  bot.registerAction('uppers', (session, context, params) => {
    const variableName = params && params[0] ? params[0] : undefined;
    if (variableName) {
      context[variableName] = (context[variableName] || '').toUpperCase();
    }
  });
})();

我们从IoC容器中检索机器人,并注册一个名为uppers的操作,该操作将传递一个变量名并将其转换为大写。
如果你执行这段代码并转到 http://localhost:3000 ,你将能够看到类似这样的东西:

你有问题和答案,但是意图"hello"触发了这个编排好的对话。

ff29svar

ff29svar2#

你好,Jesus,

感谢你快速的回复,祝你在巴塞罗那一切顺利。我有一些朋友在那里学习,他们喜欢这个城市和这里的人。

你的工作非常出色,我一定会尝试这个例子看看它是如何工作的。我在包中看到了代码,很高兴能得到更多的清晰度。

阅读了代码后,对我来说,它不是立刻就很明显地告诉我如何使用常规语料库。如果机器人对话只针对特定的情况触发,或者所有语料库都需要在机器人中进行Map。但我会通过玩弄代码来找出答案。

另外,它是可以与网络构建一起使用的吗?还是只能作为基本包的扩展?

谢谢!
马丁

wbrvyc0a

wbrvyc0a3#

你好,
在本周,我将发布这部分的进展,但作为对你问题的回答:机器人类从容器中获取fs,因此如果你想的话,它可以在网络上工作。我现在正在进行的进展是与NER的集成,并使用自定义NER来实现诸如"askDate"或"askEmail"的功能。此外还有一个基于@nlpjs/basic的webbot包,因此它不会在前端工作,但可以从文件夹结构中自动加载所有内容。

6rqinv9w

6rqinv9w4#

你好,Martin和Jesus,
感谢你们在NLP.JS上所做的出色工作!
马丁 -我一直在尝试使用你们的nlpjs-web,并希望在其中加入一个script.dlg,以及相应的corpus.dlg和conf.json文件。我该如何做到这一点?
伊恩

wnvonmuf

wnvonmuf5#

你好,@archegyral ,

在由Jesus提供的example中,您可以看到如何在conf.json中指定脚本位置。语料库是从脚本.dlg文件本身导入的。

gijlo24d

gijlo24d6#

感谢@jordi-carbonell -我已经按照传统方式使用Directline Connector运行了.dlg文件。
我想做的是将这部分内容融入到@MeetMartin的工作成果中,他在https://betterprogramming.pub/natural-language-processing-in-the-browser-8ca5fdf2488b上发表了一篇很棒的文章,所以我可以像Martin展示的那样在浏览器中运行nlp.js,同时也要将.dlg文件的使用纳入其中。

u7up0aaq

u7up0aaq7#

你好@archegyral,
作为一个提示,如果你检查bot.js(loadScript)和dialog-parse.js,你会看到fs插件是用来加载脚本的:
nlp.js/packages/bot/src/bot.js
第438行到第440行
| | asyncloadScript(fileName){ |
| | constfs=this.container.get('fs'); |
| | constscript=awaitloadScript(fileName,fs); |
所以也许注册一个能够在需要时返回脚本内容的fs插件,会帮助你得到你想要的。

fykwrbwg

fykwrbwg8#

感谢@aigloss的提示,这非常有帮助,尽管我不太确定如何做到这一点。我会尝试一下,如果你们有任何进一步的提示,将非常受欢迎。

相关问题