Botml 是一種聲明性且功能強大的標記語言,用於設計現代聊天機器人(又稱對話機器人)。
任何人(開發人員和非開發人員)都可以使用它來創建機器人並教導機器人如何行為。使用正確的微小格式定義聊天機器人的行為並立即參與對話。親眼看看:一個只用兩行寫的計算器機器人。
該專案使用node和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 端點。
服務必須在其自己的區塊中以@
符號開頭聲明。它由名稱和 JSON 格式的 API 端點(透過 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 $.
腳本可用於評估程式碼。
程式碼的語言取決於所使用的解析器所使用的語言。 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 的功能配合得很好。
檢查點是工作流程中的標記~ 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'
:dialogLabel'reply'
:訊息'smart-replies'
帶有一個陣列參數:replies'current-dialogue-end'
帶有一個字串參數:dialogLabel'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 是一個用於定義基於先驗自然語言處理(例如命名實體和詞性標記)的高階模式的框架。
> ([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 模式下,一些特殊命令也可以幫助調試:
隨意潛入吧!打開問題或提交 PR。
Botml 已獲得 MIT 許可。