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
一切重新開始。
如果您只想執行 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 的人組成的龐大社區,使這一切成為可能。