Hubot ist eines der bekanntesten Bot-Erstellungs-Frameworks im Web, weil Github die Erstellung vereinfacht hat. Wenn Sie Ihre Befehle in einem RegExp-Parameter definieren können, können Sie mit Hubot im Grunde alles tun. Das ist ein großartiger Beitrag zur ChatOps-Kultur.
Davon inspiriert wollten wir unserer Community die gleiche Einfachheit bieten, Chatbots zu entwickeln, die tatsächlich natürliche Sprache verarbeiten und Aufgaben ausführen können, so einfach wie das Erstellen von RegExp-orientierten Bots.
Wir haben also ein wirklich bezauberndes Projekt gefunden, das wir initiieren können: den Heartbot von Digital Ocean , einen Schuss Liebe für Ihren Lieblings-Chat-Client =)
Basierend auf Heartbot haben wir etwas NLP-Leistung vom NaturalNode-Team vorgestellt, eine beeindruckende Sammlung von Bibliotheken zur Verarbeitung natürlicher Sprache, die für die Verwendung in NodeJS entwickelt wurden.
Und so geschieht die Magie ...
Willkommen bei HubotNatural , einem neuen, aufregenden Chatbot-Framework, das auf Hubot- und NaturalNode-Bibliotheken basiert und eine einfache und erweiterbare Architektur aufweist, die vom HeartBot-Team von Digital Ocean entworfen und vom Rocket.Chat-Team mit Liebe und Sorgfalt erstellt wurde.
Wir hoffen, dass Ihnen das Projekt gefällt und Sie etwas Zeit finden, einen Beitrag zu leisten.
HubotNatural ist so konzipiert, dass es einfach zu trainieren und zu erweitern ist. Was Sie also grundsätzlich verstehen müssen, ist, dass es über ein YAML-Korpus verfügt, in dem Sie Ihre Chatbot-Interaktionen ausschließlich mit der YAML-Notation entwerfen können.
Alle im Corpus entworfenen YAML-Interaktionen können eigene Parameter haben, die von einer Ereignisklasse verarbeitet werden.
Event-Klassen bieten die Möglichkeit, HubotNatural zu erweitern. Indem Sie Ihre eigenen Event-Klassen schreiben, können Sie Ihrem Chatbot die Fähigkeiten verleihen, mit allen von Ihnen benötigten Diensten zu interagieren.
Die YAML-Datei wird in scripts/index.js
geladen, analysiert und an den Chatbot-Bind übergeben, der sich in scripts/bot/index.js
befindet, dem Kortex des Bots, wo der gesamte Informationsfluss und die gesamte Steuerung programmiert sind.
Das YAML-Korpus befindet sich in training_data/corpus.yml
und seine Grundstruktur sieht folgendermaßen aus:
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
Was diese Syntax bedeutet:
trust
: Das Mindestmaß an Sicherheit, das vom Klassifikator zurückgegeben werden muss, um diese Interaktion auszuführen. Der Wert liegt zwischen 0 und 1 (0 % bis 100 %). Wenn ein Klassifikator einen Wert mit einer Sicherheit zurückgibt, der kleiner als trust
ist, antworten die Bots mit einem Fehler beim Interaktionsknoten.interactions
: Ein Vektor mit vielen Interaktionsknoten, die analysiert werden. Jede Interaktion, die für Ihren Chatbot konzipiert ist, muss einer Interaktionsobjektstruktur unterliegen.name
: Dies ist der eindeutige Name der Interaktion, anhand dessen sie identifiziert wird. Erstellen Sie nicht mehr als eine Interaktion mit demselben node.name
-Attribut.expect
: Das sind die Sätze, die dem Bots-Training gegeben werden. Dabei kann es sich um Zeichenfolgen oder Schlüsselwortvektoren wie ['consume','use']
handeln.answer
: Die Nachrichten, die an den Benutzer gesendet werden, wenn die Klassifikatoren über der Vertrauensstufe klassifiziert werden. Die node.message
wird von der Ereignisklasse analysiert und gesendet. Um mehrzeilige Zeichenfolgen in Ihrem YAML zu verwenden, müssen Sie die YAML-Syntax für mehrzeilige Zeichenfolgen befolgen. Sie können Variablen in der Nachricht angeben. Standardmäßig enthält HubotNatural die Variablen $user
, $bot
und $room
.event
: ist der Name der CoffeeScript- oder JavaScript-Klasse in scripts/events
, ohne die Dateierweiterung.Zur Erweiterung der Chatbot-Fähigkeiten können Ereignisklassen geschrieben werden. Sie empfangen das Interaktionsobjekt und analysieren die Nachricht wie folgt:
class respond
constructor : (@interaction) ->
process : (msg) =>
sendMessages(stringElseRandomKey(@interaction.answer), msg)
module.exports = respond
Sein Basiskonstruktor ist der @interaction
Knoten, sodass Sie auf alle Attribute innerhalb einer Interaktion zugreifen können, indem Sie einfach @interaction.attribute
verwenden. Hier können Sie Texte analysieren, APIs aufrufen, Dateien lesen, auf Datenbanken zugreifen und alles, was Sie sonst noch brauchen.
Möglicherweise möchten Sie die Funktion stringElseRandomKey
verwenden, um ein zufälliges Element einer Liste abzurufen, wenn der Parameter eine Liste ist, und die Funktion sendMessages
verwenden, um Nachrichten an einen Benutzer zu senden.
Die NaturalNode-Bibliothek enthält zwei Arten von Klassifikatoren: den Naive Bayes-Klassifikator, bekannt als BayesClassifier
, und die LogisticRegressionClassifier
-Funktionen. Standardmäßig verwendet HubotNatural den LogisticRegressionClassifier
. In unseren Tests wurden einfach bessere Ergebnisse erzielt.
Es gibt auch mehr als eine Art Stemmer. Sie sollten die Wortstammerkennung so einstellen, dass sie Ihre Sprache definiert. Standardmäßig verwenden wir PorterStemmerPt für Portugiesisch, aber Sie können Englisch, Russisch, Italienisch, Französisch, Spanisch und andere Stemmer in NaturalNode-Bibliotheken finden oder sogar Ihre eigenen darauf basierenden schreiben.
Schauen Sie einfach in node_modules/natural/lib/natural/stemmers/
nach.
Um die Stemmer-Sprache zu ändern, legen Sie einfach die Umgebungsvariable HUBOT_LANG
auf pt
, en
, es
und jede andere Sprachterminierung fest, die einer Stemmer-Datei im obigen Verzeichnis entspricht.
Wir verfügen über eine Docker-Datei, die ein schlankes Image auf Basis von Linux Alpine mit dem gesamten Repository-Inhalt erstellt, sodass Sie dieses Image in eine Docker-Registrierung hochladen und Ihren Chatbot von dort aus bereitstellen können. Es befindet sich im docker
-Ordner.
Sie können die Datei docker-compose.yml
auch verwenden, um eine lokale Instanz der Dienste Rocket.Chat, MongoDB und HubotNatural zu laden, wo Sie die Parameter bei Bedarf ändern können.
Die Docker-Compose-Datei sieht folgendermaßen aus:
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
Sie können die Attribute von Variablen und Volumes entsprechend Ihren spezifischen Anforderungen ändern und docker-compose up
im Terminal ausführen, um den Rocketchat-Dienst unter http://localhost:3000
zu starten. ACHTUNG: Sie müssen bedenken, dass für Hubot ein echter Rocketchat-Benutzer erstellt werden muss, mit dem Sie sich anmelden können. Wenn Sie dies also zum ersten Mal ausführen, müssen Sie zuerst in Rocketchat gehen und einen neuen Benutzer für Hubot erstellen, die Variablen ROCKETCHAT_USER
und ROCKETCHAT_PASSWORD
in der Datei docker-compose.yml ändern und dann die Dienste mit docker-compose stop && docker-compose up
neu laden docker-compose stop && docker-compose up
um alles von vorne zu beginnen.
Wenn Sie nur den Hubot-Natural-Dienst ausführen möchten, um eine bereits laufende Instanz von Rocket.Chat zu verbinden, müssen Sie nur daran denken, die ROCKETCHAT_URL
auf einen korrekten Wert zu setzen, z. B. https://open.rocket.chat
.
Um Hubot Natural korrekt zu verwenden, müssen nach dem Ausführen des Befehls docker-compose up
einige Konfigurationsschritte durchgeführt werden. Dazu gibt es im Wesentlichen zwei Möglichkeiten:
Die erste besteht darin, die in der Bot-Konfigurationsdokumentation beschriebenen Schritte manuell auszuführen.
Die zweite Möglichkeit besteht darin, das Skript bot_config.py
auszuführen, das sich im Stammverzeichnis des Projekts befindet. Dadurch wird der Bot automatisch basierend auf den folgenden im Skript definierten Variablen konfiguriert: admin_name, admin_password, bot_name
und bot_password
. Es ist wichtig, daran zu denken, die Werte dieser Variablen entsprechend dem Kontext richtig festzulegen. Die für bot_name
und bot_password
verwendeten Werte müssen mit denen übereinstimmen, die in docker-compose.yml für die Variablen ROCKETCHAT_USER
bzw. ROCKETCHAT_PASSWORD
definiert sind. Und die in den Variablen admin_name
und admin_password
definierten Werte müssen die Anmeldeinformationen eines bereits vorhandenen Benutzers auf Rocketchat sein, der über Administratorberechtigungen verfügt.
Um vor der Ausführung der Dienste automatisch einen Admin-Benutzer zu erstellen, definieren Sie einfach die Variablen ADMIN_USERNAME
und ADMIN_PASS
für den Rocketchat-Dienst in docker-compose.yml
.
Um HubotNatural bereitzustellen, müssen Sie zunächst Ihren Hubot-Generator installieren:
npm install -g yo generator-hubot
Dann klonen Sie das HubotNatural-Repository:
git clone https://github.com/RocketChat/hubot-natural.git mybot
Ändern Sie „mybot“ im obigen Git-Clone-Befehl in den Namen Ihres Bots und installieren Sie die Hubot-Binärdateien, ohne eine der Dateien im Ordner zu überschreiben:
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
Um Ihren Chatbot nun in der Shell auszuführen, sollten Sie Folgendes ausführen:
bin/hubot
Warten Sie eine Minute auf den Ladevorgang, dann können Sie mit mybot sprechen.
Schauen Sie sich Adapter an, mit denen Sie Ihren Bot auf anderen Plattformen ausführen können.
Es ist möglich, Hubot Natural so zu konfigurieren, dass Gespräche an eine reale Person weitergeleitet werden, wenn der Bot den Benutzern nicht so viel wie nötig helfen kann. Befolgen Sie zum Aktivieren und Konfigurieren Live Transfer
die in der Dokumentation zur Live-Übertragungskonfiguration beschriebenen Schritte.
Führen Sie in Ihrem Terminalfenster Folgendes aus:
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
Weitere Informationen finden Sie im Hubot-Rocketchat-Adapterprojekt.
Als NodeJS-Entwickler haben wir den Process Manager PM2 lieben gelernt und empfehlen Ihnen dringend, ihn zu verwenden.
npm install pm2 -g
Erstellen Sie eine mybot.json
Datei und legen Sie ihren Inhalt wie folgt fest:
{
"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 "
}
}
]
}
Sie können mit PM2 auch mehr als einen Prozess instanziieren, wenn Sie beispielsweise mehr als eine Instanz Ihres Bots ausführen möchten:
{
"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 "
}
}
]
}
Und natürlich können Sie verrückt nach Konfigurationen für verschiedene Plattformen wie Facebook, Twitter oder Telegram suchen ;P.
Hubot wird mit mindestens 38 Adaptern geliefert, darunter natürlich auch dem Rocket.Chat-Adapter.
Um eine Verbindung zu Ihrer Rocket.Chat-Instanz herzustellen, können Sie env-Variablen festlegen, unsere Konfigurationsdatei pm2 json.
Weitere Informationen finden Sie unter anderen Hubot-Adaptern.
Bei Rocket.Chat sind wir so begeistert von dem, was wir tun, dass wir nicht vergessen konnten, uns bei allen zu bedanken, die es möglich gemacht haben!
Danke Jungs für dieses tolle Framework, Hubots lebt im Herzen von Rocket.Chat und wir empfehlen jedem, einen Blick auf https://hubot.github.com zu werfen und viel, viel mehr über Hubot zu erfahren!
An das NaturalNode-Team unser aufrichtiges „VIELEN DANK!! Wir haben Ihr Projekt geliebt und freuen uns, dazu beitragen zu können!“.
Schauen Sie sich https://github.com/NaturalNode/natural an und lassen Sie sich überraschen!
Wir können Digital Ocean nicht genug danken, nicht nur für dieses wunderschöne HeartBot-Projekt, sondern auch für all die tollen Tutorials und alle Beiträge zur OpenSource-Bewegung.
Und nicht zuletzt dank unserer großen Community aus Mitwirkenden, Testern, Benutzern, Partnern und allen, die Rocket.Chat lieben und all dies möglich gemacht haben.