Botml เป็น ภาษามาร์กอัปที่ประกาศและมีประสิทธิภาพสำหรับการออกแบบแชทบอทสมัยใหม่ (หรือที่รู้จักในชื่อบอทสนทนา)
ทุกคน (นักพัฒนา และ ผู้ที่ไม่ใช่นักพัฒนา) สามารถใช้มันเพื่อสร้างและ สอนบอทถึงวิธีการทำงาน กำหนดพฤติกรรมของแชทบอทของคุณโดยใช้การจัดรูปแบบเล็กๆ น้อยๆ ที่เหมาะสม และเข้าร่วมการสนทนาได้ในเวลาอันรวดเร็ว ดูด้วยตัวคุณเอง: บอทเครื่องคิดเลขเขียนด้วยสองบรรทัดเท่านั้น
โปรเจ็กต์นี้ใช้โหนดและ NPM ไปตรวจสอบพวกเขาหากคุณไม่ได้ติดตั้งไว้ในเครื่อง
$ npm i -g botml
สิ่งนี้จะติดตั้งทั้งแพ็คเกจโหนด botml
และไคลเอน bot
อีกทางเลือกหนึ่ง หากคุณใช้ Atom เป็นตัวแก้ไข คุณอาจต้องการติดตั้งไวยากรณ์ที่เน้นด้วยแพ็คเกจ language-botml
เรียกใช้ cli:
$ bot
หรือใช้ในรหัสของคุณ:
const Botml = require ( 'botml/lib/botml' )
const bot = new Botml ( 'alice.bot' )
bot . start ( )
หรือแม้แต่โหลดแบบคงที่ในเบราว์เซอร์ของคุณ:
< script src =' https://unpkg.com/botml ' > </ script >
< script >
const bot = new Botml ( )
// either load an URI:
// bot.load('https://raw.githubusercontent.com/codename-co/botml/master/examples/hello.bot')
// or load the script directly:
bot . parse ( '> *n< yes?n' )
bot . start ( )
bot . send ( 'hey' )
</ script >
คุณสมบัติที่มีอยู่มีสองประเภท: คุณสมบัติพื้นฐานที่ครอบคลุมความต้องการพื้นฐานของบอท และคุณสมบัติขั้นสูงที่ช่วยให้สามารถสนทนาได้มากขึ้น
คุณสมบัติพื้นฐาน:
คุณสมบัติขั้นสูง:
รูปแบบมุ่งหวังให้เกิดประโยชน์สูงสุดโดยใช้ให้น้อยที่สุด ด้วยชุดข้อตกลงที่ถูกต้องและน้อยที่สุด ก็สามารถมีประสิทธิภาพได้มาก
ไวยากรณ์ทั่วไปเป็นไปตาม แบบแผนที่สำคัญ 3 ประการ :
ไฟล์ .bot
พื้นฐานที่สุดจะเป็น:
! BOTML 1
> Hello
< Hello human!
จำเป็นต้องมีบรรทัดข้อกำหนดเพื่อบอก Botml ว่าสามารถโหลดไฟล์ได้
จะต้อง เป็นบรรทัดแรกของไฟล์ .bot
! BOTML 1
1
หมายถึงเวอร์ชันปัจจุบันของรูปแบบ
ความคิดเห็นสามารถช่วยทำให้ไฟล์ .bot
ของคุณชัดเจนยิ่งขึ้น
สามารถ ใช้เป็นบล็อกแบบสแตนด์อโลนหรือสามารถแทรกภายในบล็อกที่ดำเนินการได้
ไม่สามารถ ใช้แบบอินไลน์ได้
# COMMENT
บทสนทนาเป็นแนวคิดหลักของบอท โดยกำหนดวิธีที่มนุษย์และบอทสามารถโต้ตอบกันได้
บทสนทนา ต้อง เริ่มต้นด้วยบรรทัด >
ซึ่งกำหนดประโยคที่สามารถเปิดใช้งานบอทเพื่อตอบสนอง
จะต้อง มี <
บรรทัดหนึ่งหรือหลายบรรทัด หลังจาก นั้นจึงกำหนดการตอบกลับของบอท
สามารถ มีได้หลายครั้งโดยการทำซ้ำลำดับนี้ภายในบล็อกเดียวกัน
> MESSAGE
< MESSAGE
ตัวอย่าง:
> Hi
< Hello there. Who are you?
> *
< Nice to meet you.
การตอบกลับแบบสุ่มในบทสนทนาทำให้บอทรู้สึกเข้มงวดน้อยลง เมื่อตอบมนุษย์ บอทจะสุ่มเลือกผู้ตอบแบบสอบถาม บอทสามารถเลือกได้เพียงหนึ่งในตัวเลือกการตอบกลับหลายรายการ
> MESSAGE
< REPLY CANDIDATE #1
< REPLY CANDIDATE #2
ตัวอย่าง:
> Hello
< Hi there
< Howdy?
รายการมีประโยชน์ในการรวบรวมแนวคิดหรือทางเลือกที่คล้ายกัน
รายการ ต้อง ขึ้นต้นด้วยเครื่องหมาย =
ซึ่งกำหนดชื่อรายการ
ต้อง มีอย่างน้อยหนึ่งรายการแต่ สามารถ มีได้มากกว่านั้น แต่ละรายการจะขึ้นต้นด้วยสัญลักษณ์ -
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
รายการ สามารถ อ้างอิงถึงรายการอื่นได้
= LIST_NAME
- LIST_ITEM
- [ANOTHER_LIST]
สามารถ อ้างอิงได้ในบรรทัด >
เพื่ออ้างอิงตัวแปรต่างๆ ของรูปแบบอินพุต
สามารถ อ้างอิงได้ในบรรทัด <
เพื่ออ้างอิงแบบสุ่มรายการใดรายการหนึ่งเป็นการตอบกลับ
สามารถ อ้างอิงได้ใน ?
บรรทัด (พร้อมท์) สำหรับอ้างอิงตัวเลือกที่กำหนดไว้ล่วงหน้าหลายตัวเลือก
การอ้างอิงรายการทำได้โดยการใส่ชื่อรายการด้วยเครื่องหมายวงเล็บ: [LIST_NAME]
ตัวอย่าง:
= citrus
- oranges
- lemons
- grapefruits
= random_fruit
- apples
- apricots
- bananas
- [citrus]
> I like [random_fruit]
< Oh. I prefer [random_fruit].
# which is the equivalent to:
# > I like apples
# > I like apricots
# > I like bananas
# > I like oranges
# > I like lemons
# > I like grapefruits
# < Oh. I prefer apples
# < Oh. I prefer apricots
# < Oh. I prefer bananas
# < Oh. I prefer oranges
# < Oh. I prefer lemons
# < Oh. I prefer grapefruits
#
# > I like [random_fruit]
# < Oh. I prefer [random_fruit].
รายการยังสามารถใช้ในพร้อมท์ได้
พรอมต์เป็นการตอบกลับด่วนที่กำหนดไว้ล่วงหน้าเพื่อตอบสนองต่อสถานการณ์เฉพาะ
ต้อง วางไว้หลังบรรทัด <
ในตอนท้ายของบทสนทนา
พวกเขา จะต้อง อ้างอิงรายการเพื่อเข้าถึงการตอบกลับด่วนทั้งหมด
จำนวนการตอบกลับด่วน ควร เก็บไว้ให้น้อยที่สุด
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
? [LIST_NAME]
ตัวอย่าง:
= pizza_types
- Peperroni
- Margherita
- Hawaiian
> I need a pizza
< What kind of pizza?
? [pizza_types]
บริการสามารถใช้ประโยชน์จากจุดสิ้นสุด API ภายนอกได้
บริการ จะต้อง ประกาศในบล็อกของตัวเองโดยขึ้นต้นด้วยเครื่องหมาย @
ประกอบด้วยชื่อและจุดสิ้นสุด API ในรูปแบบ JSON (บน http หรือ https)
มัน สามารถ (และส่วนใหญ่ ควร ) ยอมรับพารามิเตอร์โดยใช้เครื่องหมาย $
ภายในจุดสิ้นสุด
@ SERVICE_NAME ENDPOINT
สามารถ ใช้ได้ภายในบทสนทนา
เมื่อ ENDPOINT มีเครื่องหมาย $
จะต้อง ยอมรับพารามิเตอร์ที่มีค่าจะแทนที่เครื่องหมาย $
ผลลัพธ์ของการเรียกใช้บริการสามารถกรองได้โดยใช้เอาต์พุตเสริม เป็นตัวเลือกที่มีรูปแบบเป็น /(.w)+/
@ SERVICE_NAME( PARAMETER )[ OUTPUT ]
ตัวอย่าง:
@ geo_domain http://freegeoip.net/json/$
> Where is *{domain}
@ geo_domain($domain).city
< It is running from $.
สคริปต์สามารถใช้เพื่อประเมินโค้ดได้
ภาษาของโค้ดขึ้นอยู่กับภาษาที่ parser ใช้ ตัวแยกวิเคราะห์ botml
อยู่ใน Javascript ดังนั้นโค้ด Javascript จึงสามารถใช้ได้
จะต้อง อยู่ในบรรทัดภายในบทสนทนาที่ล้อมรอบด้วย ```
สามารถ เข้าถึงตัวแปรที่มีชื่อ:
context.variables.get('price')
$price
ตัวอย่าง:
> It will cost you #{price} USD
< `$price / 1000`k USD is a lot!
ตัวแปรเป็นวิธีการตรวจจับ จัดรูปแบบ จัดเก็บ และนำข้อมูลที่มีความหมายกลับมาใช้ใหม่
สามารถ บันทึกตัวแปรได้ภายในบรรทัด >
(กล่องโต้ตอบ)
ต้อง เป็นข้อความ ( $
) ตัวเลข ( #
) หรือตัวอักษรและตัวเลข ( *
)
สามารถ ใช้ได้ใน <
บรรทัด
> My name is *{name}
< Nice to meet you, $name
> I am #{age} years old
< Seems that you are $age
รูปแบบตัวแปรคือ ${VARIABLE_NAME}
(โดยมีตัวเลขและตัวอักษรและตัวเลขเทียบเท่ากัน) แต่เพื่อความสะดวกในการใช้งาน คุณสามารถใช้รูปแบบ $VARIABLE_NAME
สำหรับตัวแปรข้อความและตัวเลขได้เช่นกัน
ตัวแปร $
พิเศษจะอ้างอิงถึงค่าที่ตรงกันล่าสุดของบทสนทนาหรือผลลัพธ์ของบรรทัดก่อนหน้าเสมอ (เช่น ผลลัพธ์ของการใช้บริการ เป็นต้น)
คุณสามารถใช้นิพจน์ทั่วไปในบรรทัด >
เพื่อควบคุมสิ่งที่จะตรวจจับได้มากขึ้น
นิพจน์ทั่วไป ต้อง อยู่ใน /
และ ไม่สามารถ ผสมกับนิพจน์พื้นฐานได้
> /^I (?:.+s)?(w+) (?:.+s)?(it|this)/
< Cool bro.
ในความเป็นจริงแล้ว ไลบรารี XRegExp ถูกใช้อย่างซ่อนเร้น ทำให้คุณสามารถเข้าถึงการจับภาพที่มีชื่อชั้นนำ ความคิดเห็นแบบอินไลน์ และตัวแก้ไขโหมด
เวิร์กโฟลว์บทสนทนาเป็นส่วนสำคัญของบทสนทนาแบบคลาสสิก
สามารถ ใช้เวิร์กโฟลว์เพื่อกำหนดโฟลว์การสนทนาที่แม่นยำ
ต้อง ขึ้นต้นด้วยบรรทัด ~
ที่กำหนดชื่อรายการ
เวิร์กโฟลว์เดียวเท่านั้น ที่สามารถ เริ่มต้นด้วย <
กล่องโต้ตอบ เวิร์กโฟลว์ดังกล่าวจะถูกเปิดใช้งานและใช้เป็นค่าเริ่มต้นเมื่อผู้ใช้เชื่อมต่อกับบอท
# grocery shopping
> I want to buy *{items}
< How many $items?
> #{count} $items
> #{count}
< There you go.
การแยกย่อยแบบมีเงื่อนไขคือคำสั่งที่นำบอทไปยังส่วนอื่นของบทสนทนาตามเงื่อนไขการทดสอบ
กิ่งแบบมีเงื่อนไขเริ่มต้นด้วย ---
และฟังข้อมูลที่พิมพ์ทั้งหมด จากนั้นทดสอบกับทุกกรณี แต่ละกรณีแยกกันโดย ---
:
---
> first input case
< first reply
---
> second input case
< second reply
---
> last input case
< last reply
สาขาที่มีเงื่อนไขใช้งานได้ดีกับคุณลักษณะอื่นที่มีป้ายกำกับว่า จุดตรวจ
จุดตรวจสอบคือเครื่องหมาย ~ CHECKPOINT_NAME
ในขั้นตอนการทำงาน ซึ่งทำให้การกลับมาที่จุดนั้นในขั้นตอนหลังของกล่องโต้ตอบปัจจุบันเป็นเรื่องง่าย สามารถอ้างอิงด้วย ~ [CHECKPOINT_NAME]
ซึ่งเปลี่ยนเส้นทางโฟลว์ไปยังเครื่องหมายจุดตรวจสอบ:
~ ask_howdy
< Hello stranger.
~ checkpoint_name
< How are you?
> meh
< So you feel bad huh
~ [checkpoint_name]
# Example of workflow working:
# < Hello stranger.
# < How are you?
# > meh
# < So you feel bad huh
# < How are you?
# > ...
ทั้ง จุดตรวจ และ รายการ ทำให้การทำงานกับสาขาที่มีเงื่อนไขเป็นสิ่งที่น่าสนใจมาก:
= mood
- good
- meh
- great
- ok
= exceptions
- fantastic
- better than ever
~ ask_howdy
< hello stranger.
~ listen_howdy
< how are you?
? [mood]
---
> meh
< So you feel bad huh
~ [listen_howdy]
---
> good
< Oh, it is not bad ;)
~ [rechecker]
---
> [exceptions]
< Seems you really cool guy!
---
> ok
< Hmm, just ok? Okay then...
---
> great
< Nice! Let's continue then...
~ rechecker
< Maybe it is more than good?
> excellent
< Much better!
สามารถใช้เครื่องหมาย "ไม่เท่ากัน" ได้ !
ใน การแตกแขนงแบบมีเงื่อนไข :
= mood
- [bad_mood]
- [good_mood]
= bad_mood
- meh
- bad
= good_mood
- great
- ok
~ ask_howdy
< hello stranger.
~ listen_howdy
< how are you?
? [mood]
---
> ![mood]
< I asked you how you are ; please let's start over with another answer?
~ [listen_howdy]
---
> [good_mood]
< Oh, it is awesome ;)
---
> [bad_mood]
< Hmm... bye then...
การแตกแขนงแบบมีเงื่อนไข ยังทำงานได้ดีกับสคริปต์ตราบใดที่มีการส่งคืนค่า หากสคริปต์ส่งคืนค่า true
สาขาที่เกี่ยวข้องจะถูกเปิดใช้งาน หากการทดสอบทั้งหมดเป็นการ แตกสาขาแบบมีเงื่อนไข false
จะข้ามสาขาทั้งหมดและดำเนินการต่อด้วยเวิร์กโฟลว์ปัจจุบัน:
~ ask_for_email
> start email workflow
~ listen_email
< Your email please?
> *{email}
---
` !/^.+@.+..+/.test('$email')
< This email $email seems not legit!
~ [listen_email]
---
< Cool. We'll reach you over at $email
ทริกเกอร์เป็นวิธีหนึ่งสำหรับบอทที่จะรวมเข้ากับโปรแกรมอื่น
เหตุการณ์มีสองประเภท: เหตุการณ์มาตรฐานและเหตุการณ์ที่กำหนดเอง
เหตุการณ์มาตรฐาน มีดังนี้:
'start'
'patterns:set'
พร้อมพารามิเตอร์สตริงสองตัว: ชื่อรูปแบบ & ค่า'match'
ด้วยพารามิเตอร์สตริงสองตัว: ป้ายกำกับ รูปแบบ'current-dialogue-start'
พร้อมด้วยพารามิเตอร์ String หนึ่งรายการ: DialogueLabel'reply'
ด้วยพารามิเตอร์ String หนึ่งรายการ: ข้อความ'smart-replies'
พร้อมด้วยพารามิเตอร์ Array หนึ่งตัว: replies'current-dialogue-end'
พร้อมด้วยพารามิเตอร์ String หนึ่งรายการ: DialogueLabel'variable:set'
พร้อมพารามิเตอร์สตริงสองตัว: ชื่อตัวแปร & ค่า'quit'
'*'
จะจับเหตุการณ์มาตรฐานและเหตุการณ์ที่กำหนดเอง ทั้งหมดเหตุการณ์ที่กำหนดเอง สามารถ ทริกเกอร์ได้ภายในกล่องโต้ตอบ
เหตุการณ์ที่กำหนดเอง ต้อง มีชื่อ
มัน สามารถ มีพารามิเตอร์ได้ พารามิเตอร์ สามารถ พึ่งพาตัวแปรที่มีชื่อได้
@ trigger( 'EVENT_NAME' [, PARAMETER] )
ตัวอย่าง:
> hello
< hi
@ trigger('said_hi')
จากนั้นจัดการเหตุการณ์ 'said_hi' ในโค้ดของคุณตามความต้องการของคุณ:
bot . on ( 'said_hi' , ( ) => console . log ( 'The bot said hi' ) ) ;
TokensRegex เป็นเฟรมเวิร์กสำหรับการกำหนดรูปแบบขั้นสูงตามการประมวลผลภาษาธรรมชาติแบบนิรนัย เช่น Named Entities และการแท็กส่วนของคำพูด
> ([ner: PERSON]+) /was|is/ /an?/ []{0,3} /painter|artist/
< An accomplished artist you say.
คุณลักษณะนี้เปิดใช้งานผ่านการผสานรวมโค้ด ดูตัวอย่าง
สามารถเปิดใช้งาน NLP ผ่านการบูรณาการโค้ด ดูตัวอย่าง
ดู examples/
ไดเร็กทอรี
เริ่มการทดสอบหน่วยด้วย:
npm test
npm run autotest # this is for continuous testing
ใช้ CLI เพื่อลองใช้สคริปต์ botml จากคอนโซล:
node lib/cli.js
node lib/cli.js examples/echo.bot # load script from a local file
debug=true node lib/cli.js # add logging verbosity
ในโหมด CLI คำสั่งพิเศษบางคำสั่งสามารถช่วยแก้ไขข้อบกพร่องได้เช่นกัน:
รู้สึกอิสระที่จะดำน้ำ! เปิดประเด็นหรือส่งประชาสัมพันธ์
Botml ได้รับอนุญาตจาก MIT