Hubot은 웹에서 프레임워크를 생성하는 가장 유명한 봇 중 하나입니다. Github을 사용하면 프레임워크를 쉽게 만들 수 있기 때문입니다. RegExp 매개변수에 명령을 정의할 수 있다면 기본적으로 Hubot으로 무엇이든 할 수 있습니다. 이는 ChatOps 문화에 큰 기여를 합니다.
이에 영감을 받아 우리는 RegExp 지향 봇을 구축하는 것처럼 쉽게 자연어를 처리하고 작업을 실행할 수 있는 챗봇을 개발하기 위해 커뮤니티에 동일한 단순성을 제공하고 싶었습니다.
그래서 우리는 당신이 가장 좋아하는 채팅 클라이언트를 위한 사랑의 기회인 Digital Ocean의 Heartbot에서 시작할 수 있는 정말 매력적인 프로젝트를 찾았습니다 =)
Heartbot을 기반으로 우리는 NodeJS에서 사용하도록 만들어진 인상적인 자연어 처리 라이브러리 컬렉션인 NaturalNode 팀의 일부 NLP 기능을 도입했습니다.
그리고 마법 이 일어납니다...
Digital Ocean의 HeartBot 팀이 설계하고 Rocket.Chat 팀의 사랑과 관심으로 만들어진 간단하고 확장 가능한 아키텍처를 갖춘 Hubot 및 NaturalNode 라이브러리를 기반으로 하는 새롭고 흥미로운 챗봇 프레임워크인 HubotNatural 에 오신 것을 환영합니다.
프로젝트를 즐기시고 기여할 시간을 찾으시기 바랍니다.
HubotNatural은 쉽게 훈련하고 확장할 수 있도록 만들어졌습니다. 따라서 기본적으로 이해해야 할 것은 YAML 표기법만 사용하여 챗봇 상호 작용을 디자인할 수 있는 YAML 코퍼스가 있다는 것입니다.
말뭉치에 설계된 모든 YAML 상호 작용에는 이벤트 클래스에 의해 처리되는 자체 매개변수가 있을 수 있습니다.
이벤트 클래스는 HubotNatural을 확장할 수 있는 가능성을 제공합니다. 자신만의 이벤트 클래스를 작성하면 필요한 모든 서비스와 상호 작용할 수 있는 기술을 챗봇에 부여할 수 있습니다.
YAML 파일은 scripts/index.js
에 로드되고 구문 분석되어 chatbot 바인딩으로 전달됩니다. 이 파일은 모든 정보 흐름과 제어가 프로그래밍되는 봇의 피질인 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
함수가 함께 제공됩니다. 기본적으로 HubotNatural은 LogisticRegressionClassifier
를 사용합니다. 테스트에서 더 나은 결과가 나왔습니다.
또한 한 종류 이상의 형태소 분석기가 있습니다. 언어를 정의하려면 형태소 분석기를 설정해야 합니다. 기본적으로 포르투갈어용 PorterStemmerPt를 사용하지만 NaturalNode 라이브러리에서 영어, 러시아어, 이탈리아어, 프랑스어, 스페인어 및 기타 형태소 분석기를 찾을 수도 있고 이를 기반으로 직접 작성할 수도 있습니다.
node_modules/natural/lib/natural/stemmers/
내부를 확인하세요.
형태소 분석기 언어를 변경하려면 HUBOT_LANG
환경 변수를 pt
, en
, es
및 위 디렉터리 내의 형태소 분석 파일에 해당하는 기타 언어 종료로 설정하면 됩니다.
우리는 모든 리포지토리 콘텐츠가 포함된 Linux Alpine 기반의 경량 이미지를 구축하는 Dockerfile을 보유하고 있으므로 해당 이미지를 도커 레지스트리에 업로드하고 거기에서 챗봇을 배포할 수 있습니다. 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에 대한 새 사용자를 생성하고 docker-compose.yml 파일에서 ROCKETCHAT_USER
및 ROCKETCHAT_PASSWORD
변수를 변경한 다음 docker-compose stop && docker-compose up
사용하여 서비스를 다시 로드해야 합니다. docker-compose stop && docker-compose up
.
이미 실행 중인 Rocket.Chat 인스턴스를 연결하기 위해 Hubot-natural 서비스만 실행하려면 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
변수에 정의된 값은 관리자 권한이 있는 로켓챗의 기존 사용자 자격 증명이어야 합니다.
관리자 사용자를 자동으로 생성하려면 서비스를 실행하기 전에 docker-compose.yml
에서 로켓챗 서비스에 대한 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
기능을 활성화하고 구성하려면 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과 같은 다양한 플랫폼에 대한 구성을 미친 듯이 설정할 수도 있습니다.
Hubot에는 물론 Rocket.Chat 어댑터를 포함하여 최소 38개의 어댑터가 함께 제공됩니다.
Rocket.Chat 인스턴스에 연결하려면 구성 pm2 json 파일인 env 변수를 설정할 수 있습니다.
자세한 내용은 다른 휴봇 어댑터를 확인하세요.
Rocket.Chat에서 우리는 우리가 하는 일을 너무 사랑해서 이를 가능하게 해준 모든 분들께 감사를 표하는 것을 잊을 수 없었습니다!
이 놀라운 프레임워크에 대해 감사드립니다. 휴봇은 Rocket.Chat의 중심에 있습니다. 모든 사람이 https://hubot.github.com을 확인하고 휴봇에 대해 더 많은 것을 알아볼 것을 권장합니다!
NaturalNode 팀에게 진심으로 "정말 감사합니다!! 우리는 귀하의 프로젝트를 사랑했고 기여하게 되어 기쁩니다!"라고 진심을 전합니다.
https://github.com/NaturalNode/natural을 확인하고 마음을 사로잡으세요!
이 아름다운 HeartBot 프로젝트뿐만 아니라 모든 훌륭한 튜토리얼과 OpenSource 운동에 대한 모든 기여에 대해 Digital Ocean에게 무한한 감사를 드립니다.
마지막으로 기여자, 테스터, 사용자, 파트너 및 Rocket.Chat을 사랑하고 이 모든 것을 가능하게 한 모든 사람으로 구성된 대규모 커뮤니티에 감사드립니다.