นี่คือไลบรารีล่าม RiveScript ที่เขียนขึ้นสำหรับภาษาโปรแกรม Go RiveScript เป็นภาษาสคริปต์สำหรับแชทเตอร์บอต ทำให้ง่ายต่อการเขียนคู่ทริกเกอร์/การตอบสนองเพื่อสร้างความฉลาดของบอต
ขณะนี้โครงการนี้อยู่ในสถานะเบต้า API ควรมีความเสถียรเป็นส่วนใหญ่ แต่สิ่งต่างๆ อาจเคลื่อนไปรอบๆ ตัวคุณ
RiveScript เป็นภาษาสคริปต์สำหรับการเขียนแชทบอท มีไวยากรณ์ที่เรียบง่ายและได้รับการออกแบบให้อ่านง่ายและเขียนได้อย่างรวดเร็ว
ตัวอย่างง่ายๆ ของลักษณะของ RiverScript:
+ 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 Community Wiki สำหรับรูปแบบการออกแบบทั่วไป รวมถึงคำแนะนำและเคล็ดลับสำหรับ RiveScript
สำหรับไลบรารีการพัฒนา:
go get github.com/aichaos/rivescript-go
สำหรับไบนารี rivescript
แบบสแตนด์อโลนสำหรับการทดสอบบอท:
go get github.com/aichaos/rivescript-go/cmd/rivescript
การแจกจ่าย RiveScript รวมถึงเชลล์แบบโต้ตอบสำหรับการทดสอบบอต RiveScript ของคุณ เรียกใช้ด้วยเส้นทางไปยังโฟลเดอร์บนดิสก์ที่มีเอกสาร RiverScript ของคุณ ตัวอย่าง:
# (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 เป็นอย่างไร" โดยการรันโค้ดเพื่อค้นหาคำตอบผ่าน Web 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
ซึ่งสามารถแทนที่ได้โดยการระบุสตริงลิเทอรัล regexp ใหม่ให้กับฟังก์ชัน 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 จะบันทึกอินพุต "ดิบ" ของผู้ใช้ ดังนั้นคุณจึงสามารถเขียนตอบกลับเพื่อรับที่อยู่อีเมลของผู้ใช้หรือจัดเก็บอักขระต่างประเทศไว้ในชื่อได้
ฉันใช้ GNU Makefile เพื่อทำให้การสร้างและรันโมดูลนี้ง่ายขึ้น คำสั่งที่เกี่ยวข้องคือ:
make setup
- รันสิ่งนี้หลังจากการโคลน repo นี้ใหม่ มันรันคำสั่ง git submodule
เพื่อดึงการขึ้นต่อกันของผู้จำหน่ายmake build
- จะสร้างคำสั่งส่วนหน้าจาก cmd/rivescript
และวางไบนารี่ลงในไดเร็กทอรี bin/
มันสร้างไบนารี่ที่เกี่ยวข้องกับระบบปัจจุบันของคุณ ดังนั้นบน Linux สิ่งนี้จะสร้างไบนารี่ Linux ขอแนะนำให้รันสิ่งนี้อย่างน้อยหนึ่งครั้ง เนื่องจากจะแคชแพ็คเกจการพึ่งพาและเพิ่มความเร็วในการสร้างและการรันครั้งต่อๆ ไปmake run
- รันคำสั่ง front-end และชี้ไปที่โฟลเดอร์ eg/brain
เป็นแหล่ง RiveScriptmake fmt
- รัน gofmt -w
กับไฟล์ต้นฉบับทั้งหมดmake test
- รันการทดสอบหน่วยmake clean
- ทำความสะอาดไดเร็กทอรี .gopath
, bin
และ dist
repo rivescript-go โมดูลย่อยโครงการ RiveScript Test Suite (rst) หากคุณไม่ได้ทำ git clone --recursive
สำหรับ rivescript-go คุณสามารถดึง submodule ผ่านคำสั่งต่อไปนี้:
git submodule init
git submodule update
จากนั้น make test
(หรือ go test
) ควรแสดงผลจากการทดสอบที่หมดในโฟลเดอร์ rst/
คุณสามารถสร้างรีลีสสำหรับแต่ละแพลตฟอร์มได้โดยการรันคำสั่ง เช่น make linux/amd64
เป้าหมายบิลด์ที่ถูกต้องในปัจจุบันมีดังนี้:
linux/386
และ linux/amd64
windows/386
และ windows/amd64
darwin/amd64
เรียกใช้ make release
เพื่อสร้าง release โดยอัตโนมัติสำหรับแพลตฟอร์มที่รองรับทั้งหมด
ไดเร็กทอรีสำหรับการเผยแพร่จะถูกสร้างขึ้นใน dist/rivescript-$VERSION-$OS-$ARCH/
ซึ่งมีไบนารีที่สร้างขึ้น README.md, Changes.md และตัวอย่าง คุณสามารถตรวจสอบไดเร็กทอรีนี้ได้ในภายหลัง เนื้อหาจะถูก tarred โดยอัตโนมัติ (zip สำหรับ Windows) และวางไว้ที่รูทของ git repo
หากคุณกำลังคอมไพล์ข้ามระบบอื่น คุณอาจต้องยุ่งกับสิทธิ์เพื่อให้ 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/