多輪對(duì)話設(shè)計(jì)器是設(shè)計(jì)滿足業(yè)務(wù)需求的對(duì)話機(jī)器人的PC端應(yīng)用程序,現(xiàn)已支持Windows和Mac OSX平臺(tái)。多輪對(duì)話能力是聊天機(jī)器人模仿人的對(duì)話能里的一大挑戰(zhàn),在復(fù)雜的上下文和需要很多背景知識(shí)的前提下,現(xiàn)有的人工智能技術(shù)是無(wú)能為力的,在Chatopera,我們相信在企業(yè)服務(wù)中,當(dāng)話術(shù)或流程固定的情況下,依賴Chatopera的產(chǎn)品可以輸出用對(duì)話完成任務(wù)的服務(wù),比如用對(duì)話完成點(diǎn)餐、報(bào)銷、請(qǐng)假。這些對(duì)話可以在企業(yè)的聊天工具中,也可以通過智能音箱的等其他客戶端。
在真正介紹腳本語(yǔ)法前,我們先來認(rèn)識(shí)下面的術(shù)語(yǔ):
- 對(duì)話:滿足設(shè)定需求的多輪對(duì)話;
- 輸入:用戶向聊天機(jī)器人發(fā)送的消息的文字形式;
- 觸發(fā)器:匹配用戶輸入文字的字符串,可以聲明槽位,當(dāng)用戶的輸入發(fā)生時(shí),會(huì)按照算法順序匹配觸發(fā)器;
- 回復(fù):機(jī)器人回復(fù)用戶輸入的文字;
- 多輪對(duì)話:根據(jù)上一次回復(fù)的狀態(tài),聲明下輪對(duì)話的優(yōu)先匹配規(guī)則。
- 函數(shù):可以從腳本中接受輸入,并通過JavaScript執(zhí)行任務(wù)返回結(jié)果的代碼。
觸發(fā)器
觸發(fā)器是對(duì)話的基礎(chǔ),當(dāng)用戶向bot發(fā)送一條消息時(shí),機(jī)器人引擎會(huì)從所有定義的觸發(fā)器中找到匹配的一個(gè)。在機(jī)器人引擎中,觸發(fā)器用半角字符加號(hào)( + )表示。機(jī)器人的回答用半角字符減號(hào)( - )表示。例如,我們可以這樣定義一個(gè)對(duì)話:
+ 晚飯吃什么
- 北京烤鴨
注意:這里( + )和( - )和文字之間需要隔一個(gè)空格。
槽位
為了讓觸發(fā)器能適應(yīng)復(fù)雜的需求,機(jī)器人引擎使用槽位規(guī)則,槽位既能讓規(guī)則具有更好的匹配能力,也能讓回復(fù)和函數(shù)中使用不同槽位的值。注意:下面的某些槽位帶有空格,這些空格是必須的。
通用槽位
通用槽位會(huì)匹配零到無(wú)窮個(gè)字符、單詞。此處的輸入不會(huì)被系統(tǒng)捕獲或者存儲(chǔ)。+ (*) 你好 (*)
- 歡迎光臨
匹配:客服你好
匹配:你好
匹配:你好嗎
確定長(zhǎng)度槽位
如果你知道你想要的字符長(zhǎng)度,可以試試確定長(zhǎng)度槽位。此處的槽位可以被系統(tǒng)捕獲,而且可以在回答中使用語(yǔ)法為*n, 其中n代表長(zhǎng)度。
+ 早安 *2
- 早安
匹配:早安北京
不匹配:早安烏魯木齊
可控長(zhǎng)度槽位
如果你只想匹配一些字符,可控長(zhǎng)度的槽位是個(gè)不錯(cuò)的選擇。語(yǔ)法為*~n, n代表你想匹配的最大長(zhǎng)度
+ 早安 *~4
- 早安
匹配:早安
匹配:早安北京
匹配:早安哈爾濱
匹配:早安烏魯木齊
不匹配:早安一些不知道的地方
區(qū)間槽位
如果你想匹配一個(gè)確定的區(qū)間,比如2到4個(gè)字符之間,區(qū)間槽位絕對(duì)可以滿足需要。語(yǔ)法為*(min-max), 此槽位可以被系統(tǒng)捕獲和用在回答中。
*(n)和*n是一樣的
+ 早安 *(2-4)
- 早安
匹配:早安北京
匹配:早安烏魯木齊
不匹配:早安
必選項(xiàng)
必選項(xiàng)用在你有一系列可選項(xiàng),但是必須有一個(gè)被匹配。輸入中的可選項(xiàng)會(huì)被系統(tǒng)捕獲和用在回答中+ 早安(北京|上海|天津)
- 早安
匹配:早安北京
匹配:早安上海
不匹配:早安
可選項(xiàng)
可選項(xiàng)用來確定一些額外的內(nèi)容+ 早安 [美麗的] 北京
- 早安
匹配:早安北京
匹配:早安美麗的北京
不匹配:早安熱鬧的北京
回復(fù)
在觸發(fā)器中,我們已經(jīng)學(xué)到了怎么添加一個(gè)回答。事實(shí)上你可以添加任意數(shù)量的回答。這里還有一些高級(jí)功能可以幫助你完成更多的任務(wù)。基礎(chǔ)回復(fù)
+ 在嗎- 你好,在的
如果添加了多個(gè)回答,系統(tǒng)會(huì)從中隨機(jī)挑選一個(gè)作為回復(fù), 然后丟掉這個(gè)回答。
+ 在嗎
- 親,在的
- 親,有什么需要幫助
- 你好,請(qǐng)問遇到什么問題了嗎?
所謂丟掉這個(gè)答案,是指機(jī)器人針對(duì)同一個(gè)用戶,在半個(gè)小時(shí)內(nèi)再次匹配上該觸發(fā)器時(shí),選擇回復(fù)時(shí),不考慮使用過的回復(fù)。
在一個(gè)觸發(fā)器中聲明多個(gè)回復(fù)后,保存,邏輯中將出現(xiàn)分支。

+ 在嗎
- {keep} 親,在的
- 親,有什么需要幫助
- 你好,請(qǐng)問遇到什么問題了嗎?
也可以在觸發(fā)器前添加{keep},就不用在每個(gè)回答中都添加了
+ {keep} 在嗎
- 親,在的
- 親,有什么需要幫助
- 你好,請(qǐng)問遇到什么問題了嗎?
如果回答很長(zhǎng),可以通過^分割以方便可讀性。可以通過/n實(shí)現(xiàn)換行
+ 在嗎
- 你好,這里是客服中心,\n
^ 請(qǐng)問遇到什么問題了嗎?
等價(jià)于
+ 在嗎
- 你好,這里是客服中心,請(qǐng)問遇到什么問題了嗎?
槽位取值
有些時(shí)候,你希望在回答中使用輸入中的內(nèi)容?梢允褂<cap>達(dá)成目的。+ 我是 *~3
- 你好,<cap>
如果用戶輸入,我是張三,那么系統(tǒng)將回復(fù),你好,張三
當(dāng)有多個(gè)捕獲時(shí),你可以使用多個(gè)<cap>
+ *2 比 *2 高
- 你確定<cap1>比<cap2>高嗎?
匹配:小明比小紅高
回答:你確定小明比小紅高嗎?
在對(duì)話中,我們有時(shí)候會(huì)需要以前的捕獲,看一下下面這個(gè)例子
+ 我叫 *~3
- 你好,<cap1>
+ 你猜我叫什么?
% 你好,<cap1>
- 你剛說了,你叫<p1cap1>
<pNcapM>代表了以前的捕獲。其中N代表在在對(duì)話中之前的問答,M代表捕獲的位移。

另外,(+, %, -) 前的空格不是必須的,在多輪對(duì)話中,空格可以增強(qiáng)腳本的可讀性,但是系統(tǒng)是忽略的。
重定向 {@reply}
有些時(shí)候,在問答對(duì)中重用一些回復(fù)能使編寫腳本效率更高,這時(shí)可以定義一個(gè)問答對(duì),并在腳本其它位置引用它。+ 在嗎
- {@__greeting__} 請(qǐng)問有什么能幫助您?
+ __greeting__
- 親,在的。
- 你好,客服小美為您服務(wù)
- 親親,稍等,客服馬上就到
引用的方式就是 “{@觸發(fā)器}”,觸發(fā)器中的下劃線不是必須的,但是它能增強(qiáng)腳本的可讀性。
多輪對(duì)話
在實(shí)際應(yīng)用中,和機(jī)器人聊天時(shí),很可能要通過多輪對(duì)話完成一個(gè)任務(wù)。我們用(%)來定位之前回復(fù),聲明新的觸發(fā)器,(%)后的內(nèi)容是和某個(gè)回復(fù)內(nèi)容一樣的字符串。+ *
- 您身高多少
+ *(3-5)
% 您身高多少
- 我的身高也是<cap>
讓我們一起看看這個(gè)例子:
- 當(dāng)用戶輸入任何文字,我們用通用槽位觸發(fā)回答,然后系統(tǒng)回復(fù)“您身高多少”。
- 當(dāng)用戶繼續(xù)輸入時(shí),系統(tǒng)會(huì)先從歷史中查看之前的回復(fù)中是否有對(duì)應(yīng)的上下文,在這里指的是% 您身高多少
- 最后,如果用戶輸入3到5個(gè)字符,系統(tǒng)匹配觸發(fā)器+ *(3-5), 并且回復(fù)我也是<cap>。<cap>代表的就是用戶輸入的內(nèi)容 。
函數(shù)
函數(shù)是一個(gè)強(qiáng)大而有趣的設(shè)計(jì)。在回復(fù)中,可以使用函數(shù)來獲取整條消息對(duì)象,用戶對(duì)象或者其它資源,比如數(shù)據(jù)庫(kù)。把槽位值當(dāng)做變量傳給函數(shù),例如下面這個(gè)例子:+ 我的用戶名是 *(2-10)
- ^getUserAccount(<cap>)
所以,調(diào)用函數(shù)的方式就是使用“^”。在函數(shù)的編輯窗口中,可以這樣定義:
exports.getUserAccount(account, cb) {
cb(null, "對(duì)不起,系統(tǒng)沒有找到" + account);
}
函數(shù)的聲明中,參數(shù)列表首先是槽位的值,可以傳多個(gè),然后最后一個(gè)參數(shù)始終是回調(diào)函數(shù)(cb),cb的參數(shù)列表為(error, text)。text作為文本添加到回復(fù)中。
復(fù)合函數(shù)
在回復(fù)中,可以添加任意多的函數(shù),比如+ ...
- 聯(lián)合 ^callFunction1() 和 ^callFunction2()
嵌套函數(shù)
在函數(shù)的回調(diào)函數(shù)中,函數(shù)名會(huì)被解析成對(duì)應(yīng)的函數(shù),所以放心的在回復(fù)中添加任意合法的函數(shù),比如在腳本中這樣寫:+ ...
- ^nestedAFunction()
然后,在函數(shù)中,定義如下:
exports.nestedAFunction = function(cb) {
cb(null, "張三 ^nestedBFunction()");
}
exports.nestedBFunction = function(cb) {
cb(null, "和李四");
}
以上是多輪對(duì)話設(shè)計(jì)器 v1.x 版本中支持的腳本語(yǔ)法,這些語(yǔ)法能夠保證業(yè)務(wù)人員實(shí)現(xiàn)滿足需求的聊天機(jī)器人。多輪對(duì)話設(shè)計(jì)器將在2018年07月21日發(fā)布,如果您想?yún)⒓舆@兩個(gè)產(chǎn)品的發(fā)布會(huì),請(qǐng)報(bào)名Chatopera產(chǎn)品發(fā)布會(huì):追求高度智能化和自動(dòng)化的企業(yè)服務(wù)。