Hubot เป็นหนึ่งในบอตที่มีชื่อเสียงที่สุดในการสร้างเฟรมเวิร์กบนเว็บ นั่นเป็นเพราะ GitHub ทำให้การสร้างเป็นเรื่องง่าย หากคุณสามารถกำหนดคำสั่งของคุณในพารามิเตอร์ RegExp ได้ โดยพื้นฐานแล้ว คุณสามารถทำอะไรก็ได้ด้วย Hubot นั่นเป็นส่วนสนับสนุนที่ยอดเยี่ยมต่อวัฒนธรรม ChatOps
ด้วยแรงบันดาลใจจากสิ่งนั้น เราต้องการมอบความเรียบง่ายแบบเดียวกันให้กับชุมชนของเราในการพัฒนาแชทบอทที่สามารถประมวลผลภาษาธรรมชาติและดำเนินงานได้จริง ง่ายเหมือนกับการสร้างบอทที่เน้น RegExp
ดังนั้นเราจึงพบโปรเจ็กต์ที่มีเสน่ห์จริงๆ ที่จะเริ่มต้นจาก Digital Ocean's Heartbot ซึ่งเป็นช็อตแห่งความรักสำหรับไคลเอนต์แชทที่คุณชื่นชอบ =)
จาก Heartbot เราได้แนะนำพลัง NLP บางส่วนจากทีม NaturalNode ซึ่งเป็นคอลเลกชันที่น่าประทับใจของ libs การประมวลผลภาษาธรรมชาติที่สร้างขึ้นเพื่อใช้ใน NodeJS
แล้ว ปาฏิหาริย์ ก็เกิดขึ้น...
ยินดีต้อนรับสู่ HubotNatural ซึ่งเป็นเฟรมเวิร์กแชทบอตที่น่าตื่นเต้นตัวใหม่ที่ทำงานบน Hubot และ NaturalNode libs พร้อมด้วยสถาปัตยกรรมที่เรียบง่ายและขยายได้ ซึ่งออกแบบโดยทีม HeartBot ของ Digital Ocean สร้างขึ้นด้วยความรักและความเอาใจใส่โดยทีม Rocket.Chat
เราหวังว่าคุณจะสนุกกับโครงการและหาเวลาในการมีส่วนร่วม
HubotNatural ออกแบบมาให้ฝึกและยืดขยายได้ง่าย ดังนั้นสิ่งที่คุณต้องเข้าใจโดยพื้นฐานก็คือมันมีคลังข้อมูล YAML ซึ่งคุณสามารถออกแบบการโต้ตอบแชทบอตของคุณโดยไม่ต้องใช้อะไรเลยนอกจากสัญกรณ์ของ YAML
การโต้ตอบ YAML ทั้งหมดที่ออกแบบในคลังข้อมูลสามารถมีพารามิเตอร์ของตัวเองได้ ซึ่งจะถูกประมวลผลโดยคลาสเหตุการณ์
คลาสกิจกรรมทำให้สามารถขยาย HubotNatural ได้ ด้วยการเขียนคลาสกิจกรรมของคุณเอง คุณสามารถให้แชทบอตของคุณมีทักษะในการโต้ตอบกับบริการใดๆ ที่คุณต้องการ
ไฟล์ YAML ถูกโหลดใน scripts/index.js
แยกวิเคราะห์และส่งผ่านไปยัง Chatbot Bind ซึ่งจะพบได้ใน 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
: เวกเตอร์ที่มีโหนดการโต้ตอบจำนวนมากที่จะถูกแยกวิเคราะห์ ทุกการโต้ตอบที่ออกแบบมาสำหรับแชทบอทของคุณจะต้องอยู่ภายใต้โครงสร้างอ็อบเจ็กต์การโต้ตอบname
: นั่นคือชื่อเฉพาะของการโต้ตอบที่จะระบุ อย่าสร้างการโต้ตอบมากกว่าหนึ่งครั้งด้วยแอตทริบิวต์ node.name
เดียวกันexpect
: นี่คือประโยคที่จะมอบให้กับการฝึกบอท อาจเป็นสตริงหรือเวกเตอร์คำหลัก เช่น ['consume','use']
answer
: ข้อความที่จะถูกส่งไปยังผู้ใช้ หากตัวแยกประเภทถูกจัดประเภทไว้เหนือระดับความน่าเชื่อถือ node.message
จะถูกแยกวิเคราะห์และส่งโดยคลาสเหตุการณ์ หากต้องการใช้สตริงหลายบรรทัดภายใน YAML คุณต้องปฏิบัติตามไวยากรณ์สตริงหลายบรรทัดของ YAML คุณสามารถระบุตัวแปรในข้อความได้ ตามค่าเริ่มต้น HubotNatural จะมาพร้อมกับตัวแปร $user
, $bot
และ $room
event
: เป็นชื่อของคลาส CoffeeScript หรือ JavaScript ภายใน scripts/events
โดยไม่มีนามสกุลไฟล์สามารถเขียนคลาสกิจกรรมเพื่อขยายทักษะแชทบอทได้ พวกเขาได้รับวัตถุโต้ตอบและแยกวิเคราะห์ข้อความดังนี้:
class respond
constructor : (@interaction) ->
process : (msg) =>
sendMessages(stringElseRandomKey(@interaction.answer), msg)
module.exports = respond
ตัวสร้างฐานของมันคือโหนด @interaction
เพื่อให้คุณสามารถเข้าถึงคุณลักษณะทั้งหมดภายในการโต้ตอบเพียงแค่ใช้ @interaction.attribute
ที่นี่คุณสามารถแยกวิเคราะห์ข้อความ เรียก API อ่านไฟล์ เข้าถึงฐานข้อมูล และทุกสิ่งที่คุณต้องการได้ที่นี่
คุณอาจต้องการใช้ฟังก์ชัน stringElseRandomKey
เพื่อรับองค์ประกอบแบบสุ่มของรายการ หากพารามิเตอร์นั้นเป็นรายการ และใช้ฟังก์ชัน sendMessages
เพื่อส่งข้อความถึงผู้ใช้
ไลบรารี NaturalNode มาพร้อมกับตัวแยกประเภทสองประเภท ได้แก่ ฟังก์ชันตัวแยกประเภท Naive Bayes ที่รู้จักกันในชื่อ BayesClassifier
และฟังก์ชัน LogisticRegressionClassifier
ตามค่าเริ่มต้น HubotNatural จะใช้ LogisticRegressionClassifier
มันมาพร้อมกับผลลัพธ์ที่ดีกว่าในการทดสอบของเรา
นอกจากนี้ยังมีก้านมากกว่าหนึ่งชนิด คุณควรตั้งค่า Stemmer เพื่อกำหนดภาษาของคุณ ตามค่าเริ่มต้น เราใช้ PorterStemmerPt สำหรับภาษาโปรตุเกส แต่คุณสามารถค้นหาภาษาอังกฤษ รัสเซีย อิตาลี ฝรั่งเศส สเปน และต้นกำเนิดอื่นๆ ใน NaturalNode libs หรือแม้แต่เขียนของคุณเองโดยยึดตามสิ่งเหล่านั้น
เพียงตรวจสอบภายใน node_modules/natural/lib/natural/stemmers/
หากต้องการเปลี่ยนภาษาของ Stemmers เพียงตั้งค่าตัวแปรสภาพแวดล้อม HUBOT_LANG
เป็น pt
, en
, es
และการยกเลิกภาษาอื่นๆ ที่สอดคล้องกับไฟล์ Stemmer ภายในไดเร็กทอรีด้านบน
เรามี Dockerfile ที่สร้างอิมเมจน้ำหนักเบาโดยใช้ Linux Alpine พร้อมเนื้อหาที่เก็บข้อมูลทั้งหมด เพื่อให้คุณสามารถอัปโหลดอิมเมจนั้นไปยังรีจิสทรีนักเทียบท่าและปรับใช้แชทบอทของคุณจากที่นั่น มันอยู่ในโฟลเดอร์ docker
คุณยังสามารถใช้ไฟล์ docker-compose.yml
เพื่อโหลดอินสแตนซ์ในเครื่องของบริการ Rocket.Chat, MongoDB และ HubotNatural ซึ่งคุณสามารถเปลี่ยนพารามิเตอร์ได้หากต้องการ
ไฟล์นักเทียบท่าเขียนมีลักษณะดังนี้:
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
ในเทอร์มินัลเพื่อเริ่มบริการ rocketchat ที่ http://localhost:3000
ความสนใจ: คุณต้องจำไว้ว่า hubot ต้องมีผู้ใช้ rocketchat จริงที่สร้างขึ้นเพื่อเข้าสู่ระบบด้วย ดังนั้นในครั้งแรกที่คุณเรียกใช้สิ่งนี้ คุณต้องเข้าไปที่ rocketchat และสร้างผู้ใช้ใหม่สำหรับ hubot ก่อน เปลี่ยนตัวแปร ROCKETCHAT_USER
และ ROCKETCHAT_PASSWORD
ในไฟล์ docker-compose.yml จากนั้นโหลดบริการอีกครั้งโดยใช้ 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 ซึ่งมีสิทธิ์ของผู้ดูแลระบบ
หากต้องการสร้างผู้ใช้ที่เป็นผู้ดูแลระบบโดยอัตโนมัติ ก่อนที่จะดำเนินการบริการ เพียงกำหนดตัวแปร ADMIN_USERNAME
และ ADMIN_PASS
สำหรับบริการ rocketchat บน docker-compose.yml
หากต้องการปรับใช้ HubotNatural ก่อนอื่นคุณต้องติดตั้ง yo hubot-generator:
npm install -g yo generator-hubot
จากนั้นคุณจะโคลนพื้นที่เก็บข้อมูล HubotNatural:
git clone https://github.com/RocketChat/hubot-natural.git mybot
เปลี่ยน 'mybot' ในคำสั่ง git clone ด้านบนเป็นชื่อบอทของคุณ และติดตั้งไบนารี 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 ;P
Hubot มาพร้อมกับอะแดปเตอร์อย่างน้อย 38 ตัว รวมถึงตัวเสริม Rocket.Chat ด้วย
หากต้องการเชื่อมต่อกับอินสแตนซ์ Rocket.Chat คุณสามารถตั้งค่าตัวแปร env ซึ่งเป็นไฟล์ config pm2 json ของเราได้
ชำระเงินอะแดปเตอร์ Hubot อื่นๆ เพื่อดูข้อมูลเพิ่มเติม
ใน Rocket.Chat เราหลงรักสิ่งที่เราทำมากจนเราไม่สามารถลืมขอบคุณทุกคนที่ทำให้มันเป็นไปได้!
ขอขอบคุณเพื่อนๆ สำหรับเฟรมเวิร์กที่น่าทึ่งนี้ hubot อยู่ในใจกลางของ Rocket.Chat และเราขอแนะนำให้ทุกคนชำระเงินที่ https://hubot.github.com และพบกับข้อมูลอื่นๆ อีกมากมายเกี่ยวกับ hubot!
ถึงทีมงาน NaturalNode ที่จริงใจที่สุดของเรา "ขอบคุณมาก!! เรารักโครงการของคุณ และเรารู้สึกตื่นเต้นที่ได้มีส่วนร่วม!"
ชำระเงิน https://github.com/NaturalNode/natural แล้วปล่อยให้ใจคุณทึ่ง!
เราไม่สามารถขอบคุณ Digital Ocean ได้เพียงพอ ไม่เพียงแต่สำหรับโครงการ HeartBot ที่สวยงามนี้เท่านั้น แต่ยังรวมถึงบทช่วยสอนที่ยอดเยี่ยมและการมีส่วนร่วมทั้งหมดต่อการเคลื่อนไหวของ OpenSource
และสุดท้ายแต่ไม่ท้ายสุด ขอขอบคุณชุมชนขนาดใหญ่ของเราที่ประกอบด้วยผู้สนับสนุน ผู้ทดสอบ ผู้ใช้ พันธมิตร และทุกคนที่รัก Rocket.Chat และทำให้ทั้งหมดนี้เป็นไปได้