Это библиотека-интерпретатор RiveScript, написанная для языка программирования Go. RiveScript — это язык сценариев для чат-ботов, позволяющий легко писать пары триггер/ответ для повышения интеллекта бота.
Этот проект в настоящее время находится в статусе бета-версии. API должен быть в основном стабильным, но что-то может измениться.
RiveScript — это язык сценариев для создания чат-ботов. Он имеет очень простой синтаксис, его легко читать и быстро записывать.
Простой пример того, как выглядит RiveScript:
+ hello bot
- Hello human.
Это соответствует сообщению пользователя «Привет, бот» и отвечает «Привет, человек». Или для немного более сложного примера:
+ 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>!
Официальный сайт RiveScript — https://www.rivescript.com/.
Чтобы протестировать RiveScript в своем веб-браузере, попробуйте RiveScript Playground.
Также посетите вики-сайт сообщества RiveScript , где вы найдете распространенные шаблоны проектирования, а также советы и рекомендации по RiveScript.
Для библиотеки разработки:
go get github.com/aichaos/rivescript-go
Для автономного двоичного файла rivescript
для тестирования бота:
go get github.com/aichaos/rivescript-go/cmd/rivescript
В дистрибутив RiveScript входит интерактивная оболочка для тестирования вашего бота RiveScript. Запустите его, указав путь к папке на диске, содержащей ваши документы RiveScript. Пример:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
См. rivescript -help
для опций, которые он принимает, включая режим отладки и режим UTF-8.
При использовании в качестве библиотеки для написания собственного чат-бота краткий обзор выглядит следующим образом:
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 )
}
}
Конструктор принимает необязательную структуру Config
. Вот полный пример со всеми поддерживаемыми опциями. Вам нужно только указать ключи, отличные от значений по умолчанию.
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
})
Для удобства можно использовать ярлык:
// 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 ())
Общей особенностью многих реализаций RiveScript является объектный макрос, который позволяет вам писать динамический программный код (на вашем любимом языке программирования), чтобы добавить дополнительные возможности вашему боту. Например, ваш бот может ответить на вопрос «какая погода в $location », запустив некоторый код для поиска ответа через веб-API.
Версия RiveScript для Go поддерживает объектные макросы, написанные на Go (во время компиляции вашего приложения). Он также имеет дополнительную поддержку макросов объектов JavaScript с использованием библиотеки goja.
Вот как определить макрос объекта Go:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
Вот пример того, как сделать макросы объекта JavaScript доступными через модуль goja:
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 )
}
}
}
Поддержка UTF-8 в RiveScript считается экспериментальной функцией. По умолчанию он отключен.
По умолчанию (без включения режима UTF-8) триггеры могут содержать только основные символы ASCII (без иностранных символов), а сообщение пользователя удаляется из всех символов, кроме букв, цифр и пробелов. Это означает, что, например, вы не можете записать адрес электронной почты пользователя в ответе RiveScript из-за @ и . персонажи.
При включении режима UTF-8 эти ограничения снимаются. Триггеры ограничены только тем, что не содержат определенных метасимволов, таких как обратная косая черта, а сообщение пользователя очищается только от обратной косой черты и угловых скобок HTML (для защиты от очевидного XSS, если вы используете RiveScript в веб-приложении). Кроме того, общие символы пунктуации удаляются, при этом по умолчанию используется /[.,!?;:]/g
. Это можно переопределить, предоставив новый строковый литерал регулярного выражения для функции RiveScript.SetUnicodePunctuation
. Пример:
// 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 ( `[.,!?;:]` );
Теги <star>
в RiveScript фиксируют «необработанный» ввод пользователя, поэтому вы можете писать ответы, чтобы получить адрес электронной почты пользователя, или сохранять иностранные символы в его имени.
Я использую Makefile GNU, чтобы упростить сборку и запуск этого модуля. Соответствующие команды:
make setup
— запустите это после клонирования этого репозитория. Он запускает команды git submodule
для удаления установленных поставщиков зависимостей.make build
— это создаст команду внешнего интерфейса из cmd/rivescript
и поместит ее двоичный файл в каталог bin/
. Он создает двоичный файл, соответствующий вашей текущей системе, поэтому в Linux будет создан двоичный файл Linux. Также рекомендуется запустить его хотя бы один раз, поскольку он кэширует пакеты зависимостей и ускоряет последующие сборки и запуски.make run
— запускает команду внешнего интерфейса и указывает ее на папку eg/brain
в качестве источника RiveScript.make fmt
— запускает gofmt -w
для всех исходных файлов.make test
— запускает модульные тесты.make clean
— очищает каталоги .gopath
, bin
и dist
. Репозиторий rivescript-go является подмодулем проекта RiveScript Test Suite (rsts). Если вы не выполнили git clone --recursive
для rivescript-go, вы можете получить подмодуль с помощью следующих команд:
git submodule init
git submodule update
Затем make test
(или go test
) должен показать результаты тестов, выполненных из папки rsts/.
Вы можете собрать выпуск для отдельной платформы, выполнив команду типа make linux/amd64
. Действительные цели сборки на данный момент следующие:
linux/386
и linux/amd64
windows/386
и windows/amd64
darwin/amd64
Запустите make release
, чтобы автоматически создавать выпуски для всех поддерживаемых платформ.
Каталог для выпуска создается в dist/rivescript-$VERSION-$OS-$ARCH/
и содержит встроенный двоичный файл README.md, Changes.md и примеры. Вы можете просмотреть этот каталог впоследствии; его содержимое автоматически архивируется (zip для Windows) и помещается в корень репозитория git.
Если вы выполняете кросс-компиляцию для другой системы, вам может потребоваться изменить разрешения, чтобы Go мог загрузить стандартную библиотеку для новой цели. Пример:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
для тестирования. Другие официальные менеджеры сессий (например, Redis) также находятся здесь. 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.
Официальный сайт RiveScript http://www.rivescript.com/.