Botml は、最新のチャットボット (別名会話型ボット) を設計するための宣言型の強力なマークアップ言語です。
誰でも (開発者でも非開発者でも) これを使用して、ボットを作成し、ボットの動作方法を教えることができます。ほんの少しの適切な書式設定を使用してチャットボットの動作を定義し、すぐに会話を始めましょう。たった 2 行で書かれた計算ボットをご自身の目でご覧ください。
このプロジェクトでは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 >
既存の機能には、ボットの基本的なニーズをカバーする基本機能と、より豊富な会話機能を可能にする高度な機能の 2 種類があります。
基本的な機能:
高度な機能:
この形式は、最小限の使用で最大限の成果を達成することを目的としています。適切かつ最小限の規則を設定すれば、非常に強力になります。
一般的な構文は、次の3 つの重要な規則に従っています。
最も基本的な.bot
ファイルは次のようになります。
! BOTML 1
> Hello
< Hello human!
仕様行は、ファイルをロードできることを Botml に伝えるために必要です。
これは、 .bot
ファイルの最初の行である必要があります。
! BOTML 1
1
フォーマットの現在のバージョンを表します。
コメントは、 .bot
ファイルをよりわかりやすくするのに役立ちます。
これらはスタンドアロン ブロックとして使用することも、実行可能なブロック内に挿入することもできます。
インラインでは使用できません。
# COMMENT
対話はボットの中核となる概念です。人間とボットがどのように対話できるかを定義します。
ダイアログは>
行で始まる必要があります。これは、どの文でボットが応答できるかを定義します。
その後にボットの応答を定義する 1 つまたは複数の<
行が必要です。
同じブロック内でこのシーケンスを繰り返すことで、複数回の往復を行うことができます。
> MESSAGE
< MESSAGE
例:
> Hi
< Hello there. Who are you?
> *
< Nice to meet you.
対話内のランダムな応答により、ボットの堅固さが軽減されます。人間に回答する場合、ボットは回答候補の中からランダムに選択します。ボットが選択できるのは、複数の返信候補のうち 1 つだけです。
> MESSAGE
< REPLY CANDIDATE #1
< REPLY CANDIDATE #2
例:
> Hello
< Hi there
< Howdy?
リストは、同様の概念や代替案をまとめるのに役立ちます。
リストは、リスト名を定義する=
行で始まる必要があります。
少なくとも 1 つのリスト項目が必要ですが、さらに多くのリスト項目を含めることもできます。各リスト項目は-
記号で始まります。
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
リスト項目はさらに別のリストを参照できます。
= LIST_NAME
- LIST_ITEM
- [ANOTHER_LIST]
これは、入力パターンの複数のバリアントを参照するために>
行で参照できます。
これは、リスト項目の 1 つを応答としてランダムに参照するために<
行で参照できます。
?
で参照できます。複数の事前定義された選択肢を参照するための行 (プロンプト)。
リストを参照するには、リスト名を括弧で囲みます: [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 に$
記号がある場合、その値が$
記号に置き換わるパラメータを受け入れる必要があります。
サービス呼び出しの結果は、オプションの OUTPUT を使用してフィルタリングできます。これは、 /(.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 ライブラリは内部で使用されており、主要な名前付きキャプチャ、インライン コメント、モード修飾子にアクセスできるようになります。
ダイアログ ワークフローは、従来のダイアログのスーパーセットです。
ワークフローを使用すると、会話の正確な流れを決定できます。
リスト名を定義する~
行で始まる必要があります。
<
ダイアログで開始できるワークフローは 1 つだけです。このようなワークフローは、ユーザーがボットに接続するとデフォルトでアクティブ化され、使用されます。
# 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
トリガーは、ボットを他のプログラムと統合する方法です。
イベントには、標準イベントとカスタム イベントの 2 種類があります。
標準イベントは次のとおりです。
'start'
'patterns:set'
: パターン名と値'match'
: ラベル、パターン'current-dialogue-start'
と 1 つの文字列パラメータ:dialogLabel'reply'
には 1 つの文字列パラメータが含まれます: message'smart-replies'
に 1 つの配列パラメータを指定: Replys'current-dialogue-end'
と 1 つの文字列パラメータ: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 ライセンスを取得しています。