Hubot 是网络上最著名的机器人创建框架之一,这是因为 github 使创建变得容易。如果您可以在 RegExp 参数中定义命令,那么基本上您可以使用 Hubot 执行任何操作。这是对 ChatOps 文化的巨大贡献。
受此启发,我们希望为我们的社区提供同样的简单性,以开发能够真正处理自然语言和执行任务的聊天机器人,就像构建面向正则表达式的机器人一样简单。
因此,我们找到了一个非常迷人的项目,可以从 Digital Ocean 的 Heartbot 开始,为您最喜欢的聊天客户端注入爱意=)
基于 Heartbot,我们引入了 NaturalNode 团队的一些 NLP 功能,这是一个令人印象深刻的自然语言处理库集合,用于 NodeJS。
于是,奇迹发生了……
欢迎来到HubotNatural ,这是一个基于 Hubot 和 NaturalNode 库的令人兴奋的新聊天机器人框架,具有由 Digital Ocean 的 HeartBot 团队设计的简单且可扩展的架构,由 Rocket.Chat 团队精心制作。
我们希望您喜欢这个项目并抽出一些时间做出贡献。
HubotNatural 易于训练和扩展。因此,您基本上必须了解的是,它有一个 YAML 语料库,您可以在其中仅使用 YAML 符号来设计聊天机器人交互。
语料库中设计的所有 YAML 交互都可以有自己的参数,这些参数将由事件类处理。
事件类提供了扩展 HubotNatural 的可能性。通过编写自己的事件类,您可以为聊天机器人提供与您需要的任何服务进行交互的技能。
YAML 文件在scripts/index.js
中加载,解析并传递给聊天机器人绑定,该绑定位于scripts/bot/index.js
中,即机器人的皮质,所有信息流和控制都在其中进行编程。
YAML 语料库位于training_data/corpus.yml
中,其基本结构如下所示:
trust : .85
interactions :
- name : salutation
expect :
- hi there
- hello everyone
- what's up bot
- good morning
answer :
- - Hello there $user, how are you?
- Glad to be here...
- Hey there, nice to see you!
event : respond
该语法的含义:
trust
:分类器必须返回才能运行此交互的最低确定级别。值为 0 到 1(0% 到 100%)。如果分类器返回的确定性值小于trust
,则机器人会使用错误交互节点进行响应。interactions
:具有大量将被解析的交互节点的向量。为聊天机器人设计的每个交互都必须位于interaction.node 对象结构下。name
:这是识别交互的唯一名称。不要使用相同的node.name
属性创建多个交互。expect
:这些是将给机器人训练的句子。它们可以是字符串或关键字向量,例如['consume','use']
。answer
:如果分类器的分类高于信任级别,则将发送给用户的消息。 node.message
将由事件类解析并发送。为了在 YAML 中使用多行字符串,您必须遵循 YAML 多行字符串语法。您可以在消息中指定变量。默认情况下,HubotNatural 附带$user
、 $bot
和$room
变量。event
:是scripts/events
中 CoffeeScript 或 JavaScript 类的名称,不带文件扩展名。可以编写事件类来扩展聊天机器人的技能。他们接收交互对象并解析消息,如下所示:
class respond
constructor : (@interaction) ->
process : (msg) =>
sendMessages(stringElseRandomKey(@interaction.answer), msg)
module.exports = respond
它的基本构造函数是@interaction
节点,因此您只需使用@interaction.attribute
即可访问交互内的所有属性。在这里您可以解析文本、调用 API、读取文件、访问数据库以及您需要的一切。
如果参数是列表,您可能需要使用函数stringElseRandomKey
获取列表的随机元素,并使用函数sendMessages
向用户发送消息。
NaturalNode 库附带两种分类器:朴素贝叶斯分类器(称为BayesClassifier
和LogisticRegressionClassifier
函数。默认情况下,HubotNatural 使用LogisticRegressionClassifier
。它在我们的测试中取得了更好的结果。
词干分析器也不止一种。您应该设置词干分析器来定义您的语言。默认情况下,我们使用 PorterStemmerPt 来表示葡萄牙语,但您可以在 NaturalNode 库中找到英语、俄语、意大利语、法语、西班牙语和其他词干分析器,甚至可以根据这些词干分析器编写自己的词干分析器。
只需检查node_modules/natural/lib/natural/stemmers/
内部即可。
要更改词干分析器语言,只需将环境变量HUBOT_LANG
设置为pt
、 en
、 es
以及与上述目录中的词干分析器文件对应的任何其他语言终止符。
我们有一个 Dockerfile,它可以构建一个基于 Linux Alpine 的轻量级映像,其中包含所有存储库内容,因此您可以将该映像上传到 Docker 注册表并从那里部署您的聊天机器人。它位于docker
文件夹中。
您还可以使用docker-compose.yml
文件加载 Rocket.Chat、MongoDB 和 HubotNatural 服务的本地实例,如果需要,您可以在其中更改参数。
docker-compose 文件如下所示:
version : ' 2 '
services :
rocketchat :
image : rocketchat/rocket.chat:latest
restart : unless-stopped
volumes :
- ./uploads:/app/uploads
environment :
- PORT=3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- MAIL_URL=smtp://smtp.email
# - HTTP_PROXY=http://proxy.domain.com
# - HTTPS_PROXY=http://proxy.domain.com
depends_on :
- mongo
ports :
- 3000:3000
mongo :
image : mongo:3.2
restart : unless-stopped
volumes :
- ./data/db:/data/db
# - ./data/dump:/dump
command : mongod --smallfiles --oplogSize 128 --replSet rs0
mongo-init-replica :
image : mongo:3.2
command : ' mongo mongo/rocketchat --eval "rs.initiate({ _id: '' rs0 '' , members: [ { _id: 0, host: '' localhost:27017 '' } ]})" '
depends_on :
- mongo
hubot-natural :
build : .
restart : unless-stopped
environment :
- HUBOT_ADAPTER=rocketchat
- HUBOT_NAME='Hubot Natural'
- HUBOT_OWNER=RocketChat
- HUBOT_DESCRIPTION='Hubot natural language processing'
- HUBOT_LOG_LEVEL=debug
- HUBOT_CORPUS=corpus.yml
- HUBOT_LANG=pt
- RESPOND_TO_DM=true
- RESPOND_TO_LIVECHAT=true
- RESPOND_TO_EDITED=true
- LISTEN_ON_ALL_PUBLIC=false
- ROCKETCHAT_AUTH=password
- ROCKETCHAT_URL=rocketchat:3000
- ROCKETCHAT_ROOM=GENERAL
- ROCKETCHAT_USER=botnat
- ROCKETCHAT_PASSWORD=botnatpass
- HUBOT_NATURAL_DEBUG_MODE=true
volumes :
- ./scripts:/home/hubotnat/bot/scripts
- ./training_data:/home/hubotnat/bot/training_data
depends_on :
- rocketchat
ports :
- 3001:8080
您可以根据您的特定需求更改变量和卷的属性,并在终端中运行docker-compose up
以在http://localhost:3000
启动 Rocketchat 服务。注意:您必须记住 hubot 必须创建一个真正的 Rocketchat 用户才能登录。因此,第一次运行此命令时,必须首先进入 Rocketchat 并为 hubot 创建一个新用户,更改 docker-compose.yml 文件中的ROCKETCHAT_USER
和ROCKETCHAT_PASSWORD
变量,然后使用docker-compose stop && docker-compose up
重新加载服务docker-compose stop && docker-compose up
一切重新开始。
如果您只想运行 hubot-natural 服务来连接已经运行的 Rocket.Chat 实例,您只需记住将ROCKETCHAT_URL
设置为正确的值,例如https://open.rocket.chat
。
为了正确使用Hubot Natural,在运行docker-compose up
命令后,需要执行一些配置步骤。为此,有两个主要选项:
第一个是手动执行机器人配置文档中描述的步骤。
第二个选项是执行位于项目根目录下的脚本bot_config.py
。这将根据脚本中定义的以下变量自动配置机器人: admin_name, admin_password, bot_name
和bot_password
。重要的是要记住根据上下文正确设置该变量的值。 bot_name
和bot_password
上使用的值必须与 docker-compose.yml 上分别在变量ROCKETCHAT_USER
和ROCKETCHAT_PASSWORD
上定义的值相同。 admin_name
和admin_password
变量中定义的值必须是 Rocketchat 上现有用户的凭据,该用户具有管理员权限。
要自动创建管理员用户,在执行服务之前,只需在docker-compose.yml
上为 Rocketchat 服务定义变量ADMIN_USERNAME
和ADMIN_PASS
。
要部署 HubotNatural,首先您必须安装 yo hubot-generator:
npm install -g yo generator-hubot
然后您将克隆 HubotNatural 存储库:
git clone https://github.com/RocketChat/hubot-natural.git mybot
将上面 git clone 命令中的“mybot”更改为您的机器人名称,然后安装 hubot 二进制文件,而不会覆盖文件夹内的任何文件:
cd mybot
npm install
yo hubot
_____________________________
/
// | Extracting input for |
//// _____ | self-replication process |
////// /_____ /
======= | [^_/ _ ] | /----------------------------
| | _ | ___@@__ | __
+===+/ /// _
| | _ /// HUBOT/ \
| ___/ / / / \
/ +---+
_ ___/ | |
| // | +===+
/ / | xx |
? Owner Diego < [email protected] >
? Bot name mybot
? Description A simple helpful chatbot for your Company
? Bot adapter rocketchat
create bin/hubot
create bin/hubot.cmd
conflict Procfile
? Overwrite Procfile ? do not overwrite
skip Procfile
conflict README.md
? Overwrite README.md ? do not overwrite
skip README.md
create external-scripts.json
create hubot-scripts.json
conflict .gitignore
? Overwrite .gitignore ? do not overwrite
skip .gitignore
conflict package.json
? Overwrite package.json ? do not overwrite
skip package.json
create scripts/example.coffee
create .editorconfig
现在,要在 shell 中运行聊天机器人,您应该运行:
bin/hubot
加载过程稍等一下,然后就可以与 mybot 对话了。
查看适配器以在其他平台上运行您的机器人。
当机器人无法为用户提供所需的帮助时,可以将 Hubot Natural 配置为将对话重定向到真人。要激活和配置Live Transfer
功能,请按照实时传输配置文档中描述的步骤进行操作。
在终端窗口中,运行:
export HUBOT_ADAPTER=rocketchat
export HUBOT_OWNER=RocketChat
export HUBOT_NAME= ' Bot Name '
export HUBOT_DESCRIPTION= ' Description of your bot '
export ROCKETCHAT_URL=https://open.rocket.chat
export ROCKETCHAT_ROOM=GENERAL
export LISTEN_ON_ALL_PUBLIC=false
export RESPOND_TO_DM=true
export RESPOND_TO_LIVECHAT=true
export ROCKETCHAT_USER=catbot
export ROCKETCHAT_PASSWORD= ' bot password '
export ROCKETCHAT_AUTH=password
export HUBOT_LOG_LEVEL=debug
export HUBOT_CORPUS= ' corpus.yml '
export HUBOT_LANG= ' en '
bin/hubot -a rocketchat --name $HUBOT_NAME
您可以查看 hubot-rocketchat 适配器项目以了解更多详细信息。
作为 NodeJS 开发人员,我们逐渐喜欢上了 Process Manager PM2,并且我们非常鼓励您使用它。
npm install pm2 -g
创建一个mybot.json
文件并将其内容设置为:
{
"apps" : [{
"name" : " mybot " ,
"interpreter" : " /bin/bash " ,
"watch" : true ,
"ignore_watch" : [ " client/img " ],
"script" : " bin/hubot " ,
"args" : " -a rocketchat " ,
"port" : " 3001 " ,
"env" : {
"ROCKETCHAT_URL" : " https://localhost:3000 " ,
"ROCKETCHAT_ROOM" : " general " ,
"RESPOND_TO_DM" : true ,
"ROCKETCHAT_USER" : " mybot " ,
"ROCKETCHAT_PASSWORD" : " 12345 " ,
"ROCKETCHAT_AUTH" : " password " ,
"HUBOT_LOG_LEVEL" : " debug "
}
}
]
}
例如,如果您想要运行多个机器人实例,您还可以使用 PM2 实例化多个进程:
{
"apps" : [{
"name" : " mybot.0 " ,
"interpreter" : " /bin/bash " ,
"watch" : true ,
"ignore_watch" : [ " client/img " ],
"script" : " bin/hubot " ,
"args" : " -a rocketchat " ,
"port" : " 3001 " ,
"env" : {
"ROCKETCHAT_URL" : " https://localhost:3000 " ,
"ROCKETCHAT_ROOM" : " general " ,
"RESPOND_TO_DM" : true ,
"ROCKETCHAT_USER" : " mybot " ,
"ROCKETCHAT_PASSWORD" : " 12345 " ,
"ROCKETCHAT_AUTH" : " password " ,
"HUBOT_LOG_LEVEL" : " debug "
}
}, {
"name" : " mybot.1 " ,
"interpreter" : " /bin/bash " ,
"watch" : true ,
"ignore_watch" : [ " client/img " ],
"script" : " bin/hubot " ,
"args" : " -a rocketchat " ,
"port" : " 3002 " ,
"env" : {
"ROCKETCHAT_URL" : " https://mycompany.rocket.chat " ,
"ROCKETCHAT_ROOM" : " general " ,
"RESPOND_TO_DM" : true ,
"ROCKETCHAT_USER" : " mybot " ,
"ROCKETCHAT_PASSWORD" : " 12345 " ,
"ROCKETCHAT_AUTH" : " password " ,
"HUBOT_LOG_LEVEL" : " debug "
}
}
]
}
当然,您可以为不同的平台疯狂设置配置,例如 facebook mensenger、twitter 或 telegram;P。
Hubot 配备了至少 38 个适配器,当然包括 Rocket.Chat 适配器。
要连接到 Rocket.Chat 实例,您可以设置环境变量,即我们的配置 pm2 json 文件。
查看其他 hubot 适配器以获取更多信息。
在 Rocket.Chat,我们非常热爱我们所做的事情,因此我们不能忘记感谢所有使这一切成为可能的人!
感谢大家提供这个令人惊叹的框架,hubots 位于 Rocket.Chat 的核心,我们建议大家查看 https://hubot.github.com 并找到有关 hubot 的更多信息!
我们对 NaturalNode 团队表示最诚挚的感谢:“非常感谢!我们喜欢您的项目,我们很高兴能够做出贡献!”。
查看 https://github.com/NaturalNode/natural 并让您大吃一惊!
我们对 Digital Ocean 感激不尽,不仅感谢这个美丽的 HeartBot 项目,还感谢所有出色的教程以及对开源运动的所有贡献。
最后但并非最不重要的一点是,感谢我们由贡献者、测试人员、用户、合作伙伴以及所有热爱 Rocket.Chat 的人组成的庞大社区,使这一切成为可能。