Botml ist eine deklarative und leistungsstarke Auszeichnungssprache zum Entwerfen moderner Chatbots (auch Konversationsbots genannt).
Jeder (Entwickler und Nicht-Entwickler) kann damit Bots erstellen und ihnen beibringen, sich zu verhalten . Definieren Sie das Verhalten Ihres Chatbots mithilfe der richtigen Formatierung und beteiligen Sie sich im Handumdrehen an der Konversation. Überzeugen Sie sich selbst: ein Taschenrechner-Bot, der in nur zwei Zeilen geschrieben ist.
Dieses Projekt verwendet Node und NPM. Probieren Sie sie aus, wenn Sie sie nicht lokal installiert haben.
$ npm i -g botml
Dadurch werden sowohl das botml
Knotenpaket als auch der bot
Client installiert.
Wenn Sie Atom als Editor verwenden, können Sie optional Syntaxhervorhebung mit dem Paket language-botml
installieren.
Führen Sie entweder die CLI aus:
$ bot
oder verwenden Sie es in Ihrem Code:
const Botml = require ( 'botml/lib/botml' )
const bot = new Botml ( 'alice.bot' )
bot . start ( )
oder laden Sie es sogar statisch in Ihren Browser:
< 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 >
Es gibt zwei Arten von vorhandenen Funktionen: grundlegende Funktionen, die grundlegende Bot-Anforderungen abdecken, und erweiterte Funktionen, die umfassendere Konversationsmöglichkeiten ermöglichen.
Grundfunktionen:
Erweiterte Funktionen:
Ziel des Formats ist es, mit möglichst wenig Aufwand das Beste zu erreichen. Mit den richtigen und minimalen Konventionen kann es sehr wirkungsvoll sein.
Die allgemeine Syntax folgt drei wichtigen Konventionen :
Die einfachste .bot
Datei wäre:
! BOTML 1
> Hello
< Hello human!
Die Spezifikationszeile wird benötigt, um Botml mitzuteilen, dass es die Datei laden kann.
Dies muss die erste Zeile jeder .bot
Datei sein.
! BOTML 1
Die 1
steht für die aktuelle Version des Formats.
Kommentare können dazu beitragen, Ihre .bot
Datei klarer zu gestalten.
Sie können als eigenständige Blöcke verwendet oder in umsetzbare Blöcke eingefügt werden.
Sie können nicht inline verwendet werden.
# COMMENT
Dialoge sind das Kernkonzept eines jeden Bots. Es definiert, wie der Mensch und der Bot interagieren können.
Ein Dialog muss mit einer >
-Zeile beginnen, die definiert, welche Sätze den Bot zum Antworten anregen können.
Danach müssen eine oder mehrere <
-Zeilen stehen, die die Bot-Antwort(en) definieren.
Durch Wiederholen dieser Sequenz innerhalb desselben Blocks kann es zu mehreren Hin- und Herbewegungen kommen.
> MESSAGE
< MESSAGE
Beispiel:
> Hi
< Hello there. Who are you?
> *
< Nice to meet you.
Zufällige Antworten in Dialogen geben einem Bot das Gefühl, weniger starr zu sein. Wenn der Bot einem Menschen antwortet, wählt er zufällig die Antwortkandidaten aus. Nur einer der Mehrfachantwortkandidaten kann vom Bot ausgewählt werden.
> MESSAGE
< REPLY CANDIDATE #1
< REPLY CANDIDATE #2
Beispiel:
> Hello
< Hi there
< Howdy?
Listen sind hilfreich, um ähnliche Vorstellungen oder Alternativen zusammenzustellen.
Eine Liste muss mit einer =
-Zeile beginnen, die den Listennamen definiert.
Es muss mindestens ein Listenelement enthalten, es können jedoch auch mehr sein. Jedes Listenelement beginnt mit dem -
Symbol.
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
Ein Listenelement kann auf eine weitere Liste verweisen.
= LIST_NAME
- LIST_ITEM
- [ANOTHER_LIST]
Es kann in einer >
-Zeile referenziert werden, um auf mehrere Varianten eines Eingabemusters zu verweisen.
Es kann in einer <
-Zeile referenziert werden, um zufällig auf eines der Listenelemente als Antwort zu verweisen.
Es kann in einem ?
Zeile (Eingabeaufforderung) zum Verweisen auf mehrere vordefinierte Auswahlmöglichkeiten.
Die Referenzierung einer Liste erfolgt durch Umschließen des Listennamens in eckige Klammern: [LIST_NAME]
.
Beispiel:
= 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].
Listen können auch in Eingabeaufforderungen verwendet werden.
Eingabeaufforderungen sind vordefinierte schnelle Antworten als Reaktion auf eine bestimmte Situation.
Sie müssen nach einer <
-Zeile am Ende eines Dialogs platziert werden.
Sie müssen auf eine Liste verweisen, um auf alle Schnellantworten zugreifen zu können.
Die Anzahl der schnellen Antworten sollte minimal gehalten werden.
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
? [LIST_NAME]
Beispiel:
= pizza_types
- Peperroni
- Margherita
- Hawaiian
> I need a pizza
< What kind of pizza?
? [pizza_types]
Dienste können externe API-Endpunkte nutzen.
Ein Dienst muss in einem eigenen Block beginnend mit dem @
-Zeichen deklariert werden. Es besteht aus einem Namen und einem JSON-formatierten API-Endpunkt (über http oder https).
Es kann (und sollte meistens auch) einen Parameter akzeptieren, indem es das $
-Zeichen in seinem Endpunkt verwendet.
@ SERVICE_NAME ENDPOINT
Es kann innerhalb eines Dialogs konsumiert werden.
Wenn der ENDPOINT ein $
-Zeichen hat, muss er einen Parameter akzeptieren, dessen Wert das $
-Zeichen ersetzt.
Das Ergebnis des Serviceaufrufs kann über einen optionalen OUTPUT gefiltert werden. Es handelt sich um einen Selektor mit dem Format /(.w)+/
.
@ SERVICE_NAME( PARAMETER )[ OUTPUT ]
Beispiel:
@ geo_domain http://freegeoip.net/json/$
> Where is *{domain}
@ geo_domain($domain).city
< It is running from $.
Zur Auswertung von Code können Skripte eingesetzt werden.
Die Sprache des Codes ist abhängig von der verwendeten Sprache des verwendeten Parsers. Der botml
Parser ist in Javascript, daher kann Javascript-Code verwendet werden.
Es muss in Dialogen eingebettet sein, die in „“ eingeschlossen sind.
Es kann auf benannte Variablen zugreifen:
context.variables.get('price')
$price
Beispiel:
> It will cost you #{price} USD
< `$price / 1000`k USD is a lot!
Variablen sind die Möglichkeit, aussagekräftige Informationen zu erkennen, zu formatieren, zu speichern und wiederzuverwenden.
Eine Variable kann innerhalb einer >
-Zeile (Dialog) erfasst werden.
Es muss entweder textuell ( $
), numerisch ( #
) oder alphanumerisch ( *
) sein.
Es kann in <
Zeilen verwendet werden.
> My name is *{name}
< Nice to meet you, $name
> I am #{age} years old
< Seems that you are $age
Das Variablenformat ist ${VARIABLE_NAME}
(mit seinen numerischen und alphanumerischen Entsprechungen). Aus praktischen Gründen kann das Format $VARIABLE_NAME
jedoch auch für Text- und numerische Variablen verwendet werden.
Eine spezielle $
-Variable bezieht sich immer auf den letzten übereinstimmenden Wert eines Dialogs oder das Ergebnis der vorherigen Zeile (z. B. das Ergebnis eines Serviceverbrauchs).
Reguläre Ausdrücke können in >
-Zeilen verwendet werden, um mehr Kontrolle darüber zu haben, was erkannt werden soll.
Ein regulärer Ausdruck muss in /
eingeschlossen werden und kann nicht mit Basisausdrücken gemischt werden.
> /^I (?:.+s)?(w+) (?:.+s)?(it|this)/
< Cool bro.
Tatsächlich wird die XRegExp-Bibliothek unter der Haube verwendet und bietet Ihnen Zugriff auf führende benannte Captures, Inline-Kommentare und Modusmodifikatoren.
Dialog-Workflows sind eine Obermenge der klassischen Dialoge.
Mithilfe eines Workflows kann ein präziser Gesprächsablauf festgelegt werden.
Es muss mit einer ~
-Zeile beginnen, die den Listennamen definiert.
Es kann nur ein Workflow mit einem <
-Dialog beginnen. Ein solcher Workflow wird standardmäßig aktiviert und verwendet, wenn der Benutzer eine Verbindung zum Bot herstellt.
# grocery shopping
> I want to buy *{items}
< How many $items?
> #{count} $items
> #{count}
< There you go.
Bedingte Verzweigungen sind Anweisungen, die den Bot basierend auf Testbedingungen zu einem anderen Teil des Dialogs leiten.
Bedingte Verzweigungen beginnen mit ---
und warten auf alle eingegebenen Informationen und testen sie dann in allen Fällen. Jeder Fall wird durch ---
getrennt:
---
> first input case
< first reply
---
> second input case
< second reply
---
> last input case
< last reply
Bedingte Verzweigungen funktionieren hervorragend mit einer anderen Funktion namens checkpoint .
Ein Prüfpunkt ist eine Markierung ~ CHECKPOINT_NAME
im Workflow, die die Rückkehr zu diesem Punkt zu einem späteren Zeitpunkt im aktuellen Dialog zum Kinderspiel macht. Es kann mit ~ [CHECKPOINT_NAME]
darauf verwiesen werden, wodurch der Fluss zur Checkpoint-Markierung umgeleitet wird:
~ 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?
# > ...
Sowohl Prüfpunkte als auch Listen machen die Arbeit mit bedingten Verzweigungen wirklich interessant:
= 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!
Es ist auch möglich, das „Ungleichheitszeichen“ zu verwenden !
bei bedingter Verzweigung :
= 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...
Bedingte Verzweigungen funktionieren auch gut mit Skripten, solange ein Wert zurückgegeben wird. Wenn ein Skript den Wert true
zurückgibt, wird der entsprechende Zweig aktiviert. Wenn alle Tests false
sind, überspringt die bedingte Verzweigung alle Verzweigungen und fährt mit dem aktuellen Workflow fort:
~ 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
Trigger sind eine Möglichkeit für den Bot, in ein anderes Programm integriert zu werden.
Es gibt zwei Arten von Ereignissen: Standardereignisse und benutzerdefinierte Ereignisse.
Standardereignisse sind wie folgt:
'start'
'patterns:set'
mit zwei String-Parametern: Mustername und -wert'match'
mit zwei String-Parametern: label, pattern'current-dialogue-start'
mit einem String-Parameter: dialogLabel'reply'
mit einem String-Parameter: Nachricht'smart-replies'
mit einem Array-Parameter: Antworten'current-dialogue-end'
mit einem String-Parameter: dialogLabel'variable:set'
mit zwei String-Parametern: Variablenname und -wert'quit'
'*'
fängt alle Standard- und benutzerdefinierten Ereignisse abInnerhalb von Dialogen können benutzerdefinierte Ereignisse ausgelöst werden.
Ein benutzerdefiniertes Ereignis muss einen Namen haben.
Es kann Parameter haben. Parameter können auf benannten Variablen basieren.
@ trigger( 'EVENT_NAME' [, PARAMETER] )
Beispiel:
> hello
< hi
@ trigger('said_hi')
Behandeln Sie dann das Ereignis „said_hi“ in Ihrem Code entsprechend Ihren Anforderungen:
bot . on ( 'said_hi' , ( ) => console . log ( 'The bot said hi' ) ) ;
TokensRegex ist ein Framework zum Definieren erweiterter Muster, die auf der Verarbeitung natürlicher Sprache von vornherein basieren, z. B. benannte Entitäten und Wortarten-Tagging.
> ([ner: PERSON]+) /was|is/ /an?/ []{0,3} /painter|artist/
< An accomplished artist you say.
Diese Funktion wird durch Codeintegration aktiviert. Sehen Sie sich ein Beispiel an.
NLP kann durch Code-Integration aktiviert werden. Sehen Sie sich ein Beispiel an.
Siehe das Verzeichnis examples/
.
Starten Sie die Unit-Tests mit:
npm test
npm run autotest # this is for continuous testing
Verwenden Sie die CLI, um BotML-Skripte über die Konsole auszuprobieren:
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
Im CLI-Modus können auch einige spezielle Befehle beim Debuggen hilfreich sein:
Tauchen Sie ruhig ein! Öffnen Sie ein Problem oder reichen Sie PRs ein.
Botml ist MIT-lizenziert.