이것은 Go 프로그래밍 언어용으로 작성된 RiveScript 인터프리터 라이브러리입니다. RiveScript는 Chatterbot용 스크립팅 언어로, 봇의 지능을 구축하기 위한 트리거/응답 쌍을 쉽게 작성할 수 있습니다.
이 프로젝트는 현재 베타 상태입니다. 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/입니다.
웹 브라우저에서 RiveScript를 테스트하려면 RiveScript Playground를 사용해 보세요.
또한 RiveScript에 대한 일반적인 디자인 패턴과 팁과 요령을 보려면 RiveScript 커뮤니티 Wiki 를 확인하세요.
개발 라이브러리의 경우:
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
디버그 모드 및 UTF-8 모드를 포함하여 허용되는 옵션은 rivescript -help
참조하세요.
자신만의 챗봇을 작성하기 위한 라이브러리로 사용하는 경우 개요는 다음과 같습니다.
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 구현의 일반적인 기능은 개체 매크로입니다. 이를 통해 동적 프로그램 코드(선호하는 프로그래밍 언어로)를 작성하여 봇에 추가 기능을 추가할 수 있습니다. 예를 들어, 봇은 웹 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 꺾쇠 괄호만 제거합니다(웹 애플리케이션에서 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
- 프런트 엔드 명령을 실행하고 RiveScript 소스로 eg/brain
폴더를 가리킵니다.make fmt
- 모든 소스 파일에 대해 gofmt -w
실행합니다.make test
- 단위 테스트를 실행합니다.make clean
- .gopath
, bin
및 dist
디렉토리를 정리합니다. rivescript-go repo는 RiveScript Test Suite(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
실행하십시오.
릴리스용 디렉터리는 빌드된 바이너리, README.md, Changes.md 및 예제를 포함하는 dist/rivescript-$VERSION-$OS-$ARCH/
에 생성됩니다. 나중에 이 디렉터리를 검사할 수 있습니다. 해당 내용은 자동으로 타르업되어(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/