Hubot は、Web 上で最も有名なボット作成フレームワークの 1 つです。これは、github によって簡単に作成できるためです。 RegExp パラメータでコマンドを定義できれば、基本的に Hubot で何でもできるようになります。これは ChatOps 文化への大きな貢献です。
これに触発されて、私たちは、RegExp 指向のボットを構築するのと同じくらい簡単に、実際に自然言語を処理してタスクを実行できるチャットボットを開発するのと同じシンプルさをコミュニティに提供したいと考えました。
そこで、私たちは、お気に入りのチャット クライアントへの愛を込めたDigital Ocean のハートボットから始める、本当に魅力的なプロジェクトを見つけました =)
Heartbot に基づいて、NodeJS で使用するために作成された自然言語処理ライブラリの印象的なコレクションである NaturalNode チームから NLP 機能を導入しました。
そして、魔法が起こります...
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
として知られる Naive Bayes 分類器とLogisticRegressionClassifier
関数という 2 種類の分類器が付属しています。デフォルトでは、HubotNatural はLogisticRegressionClassifier
を使用します。私たちのテストではより良い結果が得られただけです。
ステマーにも複数の種類があります。言語を定義するにはステマーを設定する必要があります。デフォルトでは、ポルトガル語には PorterStemmerPt を使用しますが、英語、ロシア語、イタリア語、フランス語、スペイン語、その他のステマーを NaturalNode ライブラリで見つけることも、それらに基づいて独自のステマーを作成することもできます。
node_modules/natural/lib/natural/stemmers/
内を確認してください。
ステマー言語を変更するには、環境変数HUBOT_LANG
pt
、 en
、 es
、および上記のディレクトリ内のステマー ファイルに対応するその他の言語終了として設定するだけです。
すべてのリポジトリ コンテンツを含む Linux Alpine ベースの軽量イメージを構築する Dockerfile があるため、そのイメージを 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
コマンドを実行した後、いくつかの構成手順を実行する必要があります。これを行うには、主に次の 2 つのオプションがあります。
1 つ目は、ボット構成ドキュメントで説明されている手順を手動で実行することです。
2 番目のオプションは、プロジェクトのルート ディレクトリにあるスクリプト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 をデプロイするには、まず、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
ここで、チャットボットをシェルで実行するには、次を実行する必要があります。
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 には、Rocket.Chat アダプターを含む少なくとも 38 個のアダプターが付属しています。
Rocket.Chat インスタンスに接続するには、環境変数、config pm2 json ファイルを設定します。
詳細については、他の Hubot アダプターを確認してください。
Rocket.Chat では、自分たちの活動にとても夢中になっているので、それを可能にしてくれたすべての人に感謝することを忘れることはできません。
この素晴らしいフレームワークをありがとう。hubot は Rocket.Chat の中心に住んでいます。https://hubot.github.com をチェックして、hubot についてさらに詳しく調べることをお勧めします。
NaturalNode チームに心から「ありがとうございます!! あなたのプロジェクトが大好きで、貢献できることに興奮しています!」。
https://github.com/NaturalNode/natural をチェックして、びっくりしてください。
Digital Ocean には、この美しい HeartBot プロジェクトだけでなく、すべての素晴らしいチュートリアルとオープンソース運動へのあらゆる貢献に対して、いくら感謝してもしきれません。
そして最後になりましたが、貢献者、テスター、ユーザー、パートナー、そして Rocket.Chat を愛し、これらすべてを可能にしてくれたすべての人からなる大きなコミュニティに感謝します。