Hubot es uno de los marcos de creación de bots más famosos de la web, eso se debe a que github facilitó su creación. Si puedes definir tus comandos en un parámetro RegExp, básicamente puedes hacer cualquier cosa con Hubot. Esa es una gran contribución a la cultura ChatOps.
Inspirados por eso, queríamos brindar la misma simplicidad a nuestra comunidad para desarrollar chatbots que realmente puedan procesar lenguaje natural y ejecutar tareas, tan fácil como crear bots orientados a RegExp.
Entonces, hemos encontrado un proyecto realmente encantador para iniciar, el Heartbot de Digital Ocean , una inyección de amor para tu cliente de chat favorito =)
Basado en Heartbot, presentamos algo de potencia de PNL del equipo de NaturalNode, una impresionante colección de bibliotecas de procesamiento de lenguaje natural diseñadas para usarse en NodeJS.
Y así ocurre la magia ...
Bienvenido a HubotNatural , un nuevo y emocionante marco de chatbot basado en las bibliotecas Hubot y NaturalNode, con una arquitectura simple y extensible diseñada por el equipo HeartBot de Digital Ocean, creada con amor y cuidado por el equipo Rocket.Chat.
Esperamos que disfrutes del proyecto y encuentres algo de tiempo para contribuir.
HubotNatural está hecho para que sea fácil de entrenar y ampliar. Entonces, lo que debes entender básicamente es que tiene un corpus YAML, donde puedes diseñar las interacciones de tu chatbot usando nada más que la notación de YAML.
Todas las interacciones YAML diseñadas en corpus pueden tener sus propios parámetros, que serán procesados por una clase de evento.
Las clases de eventos dan la posibilidad de ampliar HubotNatural. Al escribir tus propias clases de eventos, puedes darle a tu chatbot las habilidades para interactuar con cualquier servicio que necesites.
El archivo YAML se carga en scripts/index.js
, se analiza y se pasa al enlace del chatbot, que se encontrará en scripts/bot/index.js
, la corteza del bot, donde se programa todo el flujo y control de la información.
El corpus YAML se encuentra en training_data/corpus.yml
y su estructura básica se ve así:
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
Qué significa esta sintaxis:
trust
: el nivel mínimo de certeza que debe devolver el clasificador para ejecutar esta interacción. El valor es de 0 a 1 (0% a 100%). Si un clasificador devuelve un valor de certeza menor que trust
, los bots responden con un nodo de interacción de error.interactions
: un vector con muchos nodos de interacción que se analizarán. Cada interacción diseñada para su chatbot debe estar bajo una estructura de objeto interacción.nodo.name
: ese es el nombre único de la interacción por el cual será identificada. No cree más de una interacción con el mismo atributo node.name
.expect
: Esas son las frases que se darán al entrenamiento de los bots. Pueden ser cadenas o vectores de palabras clave, como ['consume','use']
.answer
: los mensajes que se enviarán al usuario, si los clasificadores se clasifican por encima del nivel de confianza. El node.message
será analizado y enviado por clase de evento. Para utilizar cadenas multilínea dentro de su YAML, debe seguir la sintaxis de cadenas multilínea de YAML. Puede especificar variables en el mensaje. Por defecto, HubotNatural viene con las variables $user
, $bot
y $room
.event
: es el nombre de la clase CoffeeScript o JavaScript dentro de scripts/events
, sin la extensión del archivo.Se pueden escribir clases de eventos para ampliar las habilidades del chatbot. Reciben el objeto de interacción y analizan el mensaje, así:
class respond
constructor : (@interaction) ->
process : (msg) =>
sendMessages(stringElseRandomKey(@interaction.answer), msg)
module.exports = respond
Su constructor base es el nodo @interaction
, por lo que puedes tener acceso a todos los atributos dentro de una interacción simplemente usando @interaction.attribute
. Aquí puede analizar textos, llamar a API, leer archivos, acceder a bases de datos y todo lo que necesite.
Es posible que desee utilizar la función stringElseRandomKey
para obtener un elemento aleatorio de una lista, si su parámetro es una lista, y utilizar la función sendMessages
para enviar mensajes a un usuario.
La biblioteca NaturalNode viene con dos tipos de clasificadores, el clasificador Naive Bayes conocido como funciones BayesClassifier
y LogisticRegressionClassifier
. De forma predeterminada, HubotNatural usa LogisticRegressionClassifier
. Simplemente obtuvo mejores resultados en nuestras pruebas.
También existe más de un tipo de despalillador. Debes configurar el lematizador para definir tu idioma. De forma predeterminada usamos PorterStemmerPt para portugués, pero puede encontrar lematizadores en inglés, ruso, italiano, francés, español y otros en las bibliotecas de NaturalNode, o incluso escribir el suyo propio basándose en ellos.
Simplemente consulte dentro de node_modules/natural/lib/natural/stemmers/
.
Para cambiar el idioma de los lematizadores, simplemente configure la variable de entorno HUBOT_LANG
como pt
, en
, es
y cualquier otra terminación de idioma que corresponda a un archivo de lematizador dentro del directorio anterior.
Tenemos un Dockerfile que crea una imagen liviana basada en Linux Alpine con todo el contenido del repositorio para que pueda cargar esa imagen en un registro de Docker e implementar su chatbot desde allí. Está ubicado en la carpeta docker
.
También puede utilizar el archivo docker-compose.yml
para cargar una instancia local de los servicios Rocket.Chat, MongoDB y HubotNatural, donde puede cambiar los parámetros si es necesario.
El archivo docker-compose se ve así:
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
Puede cambiar los atributos de las variables y los volúmenes según sus necesidades específicas y ejecutar docker-compose up
en la terminal para iniciar el servicio rocketchat en http://localhost:3000
. ATENCIÓN: Debes recordar que hubot debe tener un usuario real de rocketchat creado para iniciar sesión. Entonces, la primera vez que ejecute esto, primero debe ingresar a rocketchat y crear un nuevo usuario para hubot, cambiar las variables ROCKETCHAT_USER
y ROCKETCHAT_PASSWORD
en el archivo docker-compose.yml y luego recargar los servicios usando docker-compose stop && docker-compose up
para empezar todo de nuevo.
Si desea ejecutar solo el servicio hubot-natural para conectar una instancia de Rocket.Chat que ya se está ejecutando, solo debe recordar configurar ROCKETCHAT_URL
en un valor correcto, como https://open.rocket.chat
.
Para utilizar correctamente Hubot Natural, después de ejecutar el comando docker-compose up
, es necesario realizar algunos pasos de configuración. Para ello, existen dos opciones principales:
La primera es realizar manualmente los pasos descritos en la documentación de configuración del bot.
La segunda opción es ejecutar el script bot_config.py
, ubicado en el directorio raíz del proyecto. Eso configurará automáticamente el bot en función de las siguientes variables definidas en el script: admin_name, admin_password, bot_name
y bot_password
. Es importante recordar establecer adecuadamente los valores de estas variables según el contexto. Los valores utilizados en bot_name
y bot_password
deben ser los mismos definidos en docker-compose.yml, en las variables ROCKETCHAT_USER
y ROCKETCHAT_PASSWORD
respectivamente. Y los valores definidos en las variables admin_name
y admin_password
deben ser las credenciales de un usuario preexistente en rocketchat, que tenga permisos de administrador.
Para crear un usuario administrador automáticamente, antes de ejecutar los servicios, simplemente defina las variables ADMIN_USERNAME
y ADMIN_PASS
para el servicio rocketchat en docker-compose.yml
.
Para implementar HubotNatural, primero debes instalar yo hubot-generator:
npm install -g yo generator-hubot
Luego clonarás el repositorio HubotNatural:
git clone https://github.com/RocketChat/hubot-natural.git mybot
Cambie 'mybot' en el comando git clone anterior al nombre de su bot e instale los binarios de hubot, sin sobrecargar ninguno de los archivos dentro de la carpeta:
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
Ahora, para ejecutar tu chatbot en shell, debes ejecutar:
bin/hubot
Espere un minuto hasta que se complete el proceso de carga y luego podrá hablar con mybot.
Echa un vistazo a los adaptadores para ejecutar tu bot en otras plataformas.
Es posible configurar Hubot Natural para redirigir la conversación a una persona real, en momentos en que el bot no puede ayudar a los usuarios tanto como necesitan. Para activar y configurar la función Live Transfer
, siga los pasos descritos en la documentación de configuración de Live Transfer.
En la ventana de tu terminal, ejecuta:
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
Puede consultar el proyecto del adaptador hubot-rocketchat para obtener más detalles.
Como desarrolladores de NodeJS, aprendimos a amar Process Manager PM2 y realmente te animamos a que lo utilices.
npm install pm2 -g
Cree un archivo mybot.json
y configure su contenido como:
{
"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 "
}
}
]
}
También puedes crear una instancia de más de un proceso con PM2, si quieres, por ejemplo, ejecutar más de una instancia de tu bot:
{
"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 "
}
}
]
}
Y por supuesto, puedes volverte loco configurando configuraciones para diferentes plataformas, como facebook mensenger, twitter o telegram ;P.
Hubot viene con al menos 38 adaptadores, incluido el adaptador Rocket.Chat, por supuesto.
Para conectarse a su instancia de Rocket.Chat, puede configurar variables env, nuestro archivo json de configuración pm2.
Consulte otros adaptadores hubot para obtener más información.
¡En Rocket.Chat estamos tan enamorados de lo que hacemos que no podíamos olvidarnos de agradecer a todos los que lo hicieron posible!
Gracias a todos por este increíble marco, hubots vive en el corazón de Rocket.Chat, y recomendamos a todos que visiten https://hubot.github.com y encuentren mucho más sobre hubot.
Al Equipo de NaturalNode nuestro más sincero "¡¡MUCHAS GRACIAS!! ¡Nos encantó vuestro proyecto y estamos emocionados de poder contribuir!".
¡Consulta https://github.com/NaturalNode/natural y deja volar tu mente!
No podemos agradecer lo suficiente a Digital Ocean, no sólo por este hermoso proyecto HeartBot, sino también por todos los fantásticos tutoriales y todas las contribuciones al movimiento OpenSource.
Y por último, pero no menos importante, gracias a nuestra gran comunidad de contribuyentes, evaluadores, usuarios, socios y todos los que aman Rocket.Chat e hicieron todo esto posible.