Dies ist eine RiveScript-Interpreterbibliothek, die für die Programmiersprache Go geschrieben wurde. RiveScript ist eine Skriptsprache für Chatterbots, die es einfach macht, Trigger-/Antwortpaare zum Aufbau der Intelligenz eines Bots zu schreiben.
Dieses Projekt befindet sich derzeit im Beta-Status. Die API sollte größtenteils stabil sein, es kann jedoch sein, dass sich bei Ihnen etwas ändert.
RiveScript ist eine Skriptsprache zum Erstellen von Chatbots. Es hat eine sehr einfache Syntax und ist so konzipiert, dass es leicht zu lesen und schnell zu schreiben ist.
Ein einfaches Beispiel dafür, wie RiveScript aussieht:
+ hello bot
- Hello human.
Dies entspricht der Nachricht eines Benutzers „Hallo Bot“ und würde mit „Hallo Mensch“ antworten. Oder für ein etwas komplizierteres Beispiel:
+ my name is *
* <formal> == <bot name> => <set name=<formal>>Wow, we have the same name!
* <get name> != undefined => <set name=<formal>>Did you change your name?
- <set name=<formal>>Nice to meet you, <get name>!
Die offizielle Website für RiveScript ist https://www.rivescript.com/
Um RiveScript in Ihrem Webbrowser zu testen, probieren Sie den RiveScript Playground aus.
Schauen Sie sich auch das RiveScript-Community-Wiki an, um gängige Designmuster sowie Tipps und Tricks für RiveScript zu finden.
Für die Entwicklungsbibliothek:
go get github.com/aichaos/rivescript-go
Für die eigenständige rivescript
Binärdatei zum Testen eines Bots:
go get github.com/aichaos/rivescript-go/cmd/rivescript
Die Distribution von RiveScript enthält eine interaktive Shell zum Testen Ihres RiveScript-Bots. Führen Sie es mit dem Pfad zu einem Ordner auf der Festplatte aus, der Ihre RiveScript-Dokumente enthält. Beispiel:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
Informationen zu den akzeptierten Optionen, einschließlich Debug-Modus und UTF-8-Modus, finden Sie in rivescript -help
.
Bei Verwendung als Bibliothek zum Schreiben Ihres eigenen Chatbots lautet die Zusammenfassung wie folgt:
package main
import (
"fmt"
"github.com/aichaos/rivescript-go"
)
func main () {
// Create a new bot with the default settings.
bot := rivescript . New ( nil )
// To enable UTF-8 mode, you'd have initialized the bot like:
bot = rivescript . New ( rivescript . WithUTF8 ())
// Load a directory full of RiveScript documents (.rive files)
err := bot . LoadDirectory ( "eg/brain" )
if err != nil {
fmt . Printf ( "Error loading from directory: %s" , err )
}
// Load an individual file.
err = bot . LoadFile ( "./testsuite.rive" )
if err != nil {
fmt . Printf ( "Error loading from file: %s" , err )
}
// Sort the replies after loading them!
bot . SortReplies ()
// Get a reply.
reply , err := bot . Reply ( "local-user" , "Hello, bot!" )
if err != nil {
fmt . Printf ( "Error: %s n " , err )
} else {
fmt . Printf ( "The bot says: %s" , reply )
}
}
Der Konstruktor akzeptiert eine optionale Config
Struktur. Hier ist ein vollständiges Beispiel mit allen unterstützten Optionen. Sie müssen nur Schlüssel bereitstellen, die von den Standardwerten abweichen.
bot := rivescript . New ( & rivescript. Config {
Debug : false , // Debug mode, off by default
Strict : false , // No strict syntax checking
UTF8 : false , // No UTF-8 support enabled by default
Depth : 50 , // Becomes default 50 if Depth is <= 0
Seed : time . Now (). UnixNano (), // Random number seed (default is == 0)
SessionManager : memory . New (), // Default in-memory session manager
})
Der Einfachheit halber können Sie eine Verknüpfung verwenden:
// A nil config uses all the defaults.
bot = rivescript . New ( nil )
// WithUTF8 enables UTF-8 mode (other settings left as default).
bot = rivescript . New ( rivescript . WithUTF8 ())
Eine gemeinsame Funktion in vielen RiveScript-Implementierungen ist das Objektmakro, mit dem Sie dynamischen Programmcode (in Ihrer bevorzugten Programmiersprache) schreiben können, um Ihrem Bot zusätzliche Funktionen hinzuzufügen. Beispielsweise könnte Ihr Bot die Frage „Wie ist das Wetter in $location “ beantworten, indem er Code ausführt, um die Antwort über eine Web-API nachzuschlagen.
Die Go-Version von RiveScript unterstützt in Go geschriebene Objektmakros (zur Kompilierzeit Ihrer Anwendung). Darüber hinaus bietet es optionale Unterstützung für JavaScript-Objektmakros mithilfe der Goja-Bibliothek.
So definieren Sie ein Go-Objektmakro:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
Hier ist ein Beispiel, wie man JavaScript-Objektmakros über das Goja-Modul verfügbar macht:
package main
import (
"fmt"
"github.com/aichaos/rivescript-go"
"github.com/aichaos/rivescript-go/lang/javascript"
)
func main () {
// Initialize RiveScript first.
bot := rivescript . New ( rivescript . WithUTF8 ())
// Add the JavaScript object macro handler.
js := javascript . New ( bot )
bot . SetHandler ( "javascript" , js )
// You can access the goja VM and set your own global
// variable or function bindings to be called from your
// object macros.
js . VM . Set ( "helloFunc" , func ( name string ) string {
return fmt . Sprintf ( "Hello, %s!" , name )
})
// Load some RiveScript code. This example just tests the
// JavaScript object macro support.
err := bot . Stream ( `
> object add javascript
let a = args[0];
let b = args[1];
return parseInt(a) + parseInt(b);
< object
> object fn javascript
let result = helloFunc(args[0])
return result
< object
+ add # and #
- <star1> + <star2> = <call>add <star1> <star2></call>
+ say hello *
- <call>fn <star></call>
` )
if err != nil {
fmt . Printf ( "Error loading RiveScript document: %s" , err )
}
// Sort the replies after loading them!
bot . SortReplies ()
// Get some replies!
inputs := [] string { "add 5 and 12" , "say hello goja" }
for _ , message := range inputs {
fmt . Printf ( "You said: %s n " , message )
reply , err := bot . Reply ( "local-user" , message )
if err != nil {
fmt . Printf ( "Error: %s n " , err )
} else {
fmt . Printf ( "The bot says: %s n " , reply )
}
}
}
Die UTF-8-Unterstützung in RiveScript gilt als experimentelle Funktion. Es ist standardmäßig deaktiviert.
Standardmäßig (ohne aktivierten UTF-8-Modus) dürfen Trigger nur einfache ASCII-Zeichen (keine Fremdzeichen) enthalten und die Nachricht des Benutzers enthält alle Zeichen außer Buchstaben, Zahlen und Leerzeichen. Das bedeutet, dass Sie beispielsweise die E-Mail-Adresse eines Benutzers aufgrund der @ und nicht in einer RiveScript-Antwort erfassen können. Charaktere.
Wenn der UTF-8-Modus aktiviert ist, werden diese Einschränkungen aufgehoben. Trigger dürfen nur bestimmte Metazeichen wie den Backslash nicht enthalten, und die Nachricht des Benutzers wird nur von Backslashes und spitzen HTML-Klammern befreit (zum Schutz vor offensichtlichem XSS, wenn Sie RiveScript in einer Webanwendung verwenden). Darüber hinaus werden gängige Satzzeichen entfernt, wobei der Standardsatz /[.,!?;:]/g
ist. Dies kann überschrieben werden, indem der RiveScript.SetUnicodePunctuation
-Funktion ein neues Regexp-String-Literal bereitgestellt wird. Beispiel:
// Make a new bot with UTF-8 mode enabled.
bot := rivescript . New ( rivescript . WithUTF8 ())
// Override the punctuation characters that get stripped
// from the user's message.
bot . SetUnicodePunctuation ( `[.,!?;:]` );
Die <star>
-Tags in RiveScript erfassen die „rohen“ Eingaben des Benutzers, sodass Sie Antworten schreiben können, um die E-Mail-Adresse des Benutzers abzurufen oder fremde Zeichen in seinem Namen zu speichern.
Ich verwende ein GNU-Makefile, um das Erstellen und Ausführen dieses Moduls zu vereinfachen. Die relevanten Befehle sind:
make setup
– Führen Sie dies aus, nachdem Sie dieses Repo frisch geklont haben. Es führt die Befehle git submodule
aus, um vom Anbieter bereitgestellte Abhängigkeiten abzurufen.make build
– Dadurch wird der Front-End-Befehl aus cmd/rivescript
erstellt und seine Binärdatei im Verzeichnis bin/
abgelegt. Es erstellt eine Binärdatei, die für Ihr aktuelles System relevant ist. Unter Linux wird also eine Linux-Binärdatei erstellt. Es wird außerdem empfohlen, dieses Programm mindestens einmal auszuführen, da es Abhängigkeitspakete zwischenspeichert und nachfolgende Builds und Ausführungen beschleunigt.make run
– führt den Front-End-Befehl aus und verweist ihn auf den Ordner eg/brain
als RiveScript-Quelle.make fmt
– führt gofmt -w
für alle Quelldateien aus.make test
– führt die Unit-Tests aus.make clean
– bereinigt die Verzeichnisse .gopath
, bin
und dist
. Das rivescript-go-Repo ist ein Submodul des RiveScript Test Suite (rsts)-Projekts. Wenn Sie kein git clone --recursive
für rivescript-go durchgeführt haben, können Sie das Submodul mit den folgenden Befehlen abrufen:
git submodule init
git submodule update
Dann sollte make test
(oder go test
) die Ergebnisse der Tests anzeigen, die im Ordner rsts/ ausgeführt wurden.
Sie können eine Version für eine einzelne Plattform erstellen, indem Sie einen Befehl wie make linux/amd64
ausführen. Die gültigen Build-Ziele lauten derzeit wie folgt:
linux/386
und linux/amd64
windows/386
und windows/amd64
darwin/amd64
Führen Sie make release
aus, um automatisch Releases für alle unterstützten Plattformen zu erstellen.
In dist/rivescript-$VERSION-$OS-$ARCH/
wird ein Verzeichnis für die Version erstellt, das die erstellte Binärdatei, README.md, Changes.md und Beispiele enthält. Sie können dieses Verzeichnis anschließend überprüfen. Der Inhalt wird automatisch tariert (zip für Windows) und im Stammverzeichnis des Git-Repositorys abgelegt.
Wenn Sie eine Cross-Kompilierung für ein anderes System durchführen, müssen Sie möglicherweise mit den Berechtigungen herumspielen, damit Go die Standardbibliothek für das neue Ziel herunterladen kann. Beispiel:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
zum Testen. Auch andere offizielle Sitzungsmanager (z. B. Redis) sind hier vertreten. The MIT License (MIT)
Copyright (c) 2017 Noah Petherbridge
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Die offizielle RiveScript-Website, http://www.rivescript.com/