這是為 Go 程式語言編寫的 RiveScript 解譯器庫。 RiveScript 是聊天機器人的腳本語言,可以輕鬆編寫觸發器/響應對來建立機器人的智慧。
該項目目前處於 Beta 狀態。 API 基本上應該是穩定的,但事情可能會在你身上改變。
RiveScript 是一種用於編寫聊天機器人的腳本語言。它的語法非常簡單,旨在易於閱讀和快速編寫。
RiveScript 的簡單範例如下:
+ hello bot
- Hello human.
這與用戶的“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/
若要在 Web 瀏覽器中測試 RiveScript,請嘗試 RiveScript Playground。
也請查看RiveScript 社群 Wiki ,以了解 RiveScript 的常見設計模式以及提示和技巧。
對於開發庫:
go get github.com/aichaos/rivescript-go
用於測試機器人的獨立rivescript
二進位檔案:
go get github.com/aichaos/rivescript-go/cmd/rivescript
RiveScript 的發行版包含一個用於測試 RiveScript 機器人的互動式 shell。使用磁碟上包含 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 實作中的一個常見功能是物件宏,它使您能夠編寫動態程式碼(用您最喜歡的程式語言)來為您的機器人添加額外的功能。例如,您的機器人可以透過執行一些程式碼透過 Web API 尋找答案來回答「 $location的天氣怎麼樣」的問題。
RiveScript 的 Go 版本支援以 Go 編寫的物件巨集(在應用程式的編譯時)。它還可以使用 goja 函式庫對 JavaScript 物件巨集進行可選支援。
以下是定義 Go 物件巨集的方法:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
以下是如何透過 goja 模組使 JavaScript 物件巨集可用的範例:
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 )
}
}
}
RiveScript 中的 UTF-8 支援被認為是實驗性功能。預設情況下它是禁用的。
預設情況下(未啟用 UTF-8 模式),觸發器只能包含基本 ASCII 字元(無外來字元),且使用者的訊息將移除除字母、數字和空格之外的所有字元。這表示,例如,您無法在 RiveScript 回覆中擷取使用者的電子郵件地址,因為 @ 和 .人物。
啟用 UTF-8 模式後,這些限制將會解除。觸發器僅限於不包含某些元字符,例如反斜杠,並且用戶訊息僅去除反斜杠和 HTML 尖括號(如果您在 Web 應用程式中使用 RiveScript,則可以防止明顯的 XSS)。此外,常見的標點符號被刪除,預設為/[.,!?;:]/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 ( `[.,!?;:]` );
RiveScript 中的<star>
標籤將擷取使用者的「原始」輸入,因此您可以編寫回覆來取得使用者的電子郵件地址或在其姓名中儲存外來字元。
我使用 GNU Makefile 來簡化此模組的建置和運行。相關指令是:
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 測試套件 (rsts) 專案的子模組。如果您沒有為 rivescript-go 執行git clone --recursive
,您可以透過以下指令拉取子模組:
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 和範例。您可以稍後檢查該目錄;其內容會自動壓縮(對於 Windows 為 zip)並放置在 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/