
2016-2018年亞馬遜Alexa技能數量增長(cháng)圖
在企業(yè)中,客服系統、工作臺和辦公軟件也逐漸走向更加智能化和自動(dòng)化的方案。不管是中小型企業(yè)或者大型公司,都在踴躍嘗試AI技術(shù)飛躍帶來(lái)的福利。企業(yè)IT系統將迎來(lái)更多升級,機器學(xué)習會(huì )刷新每一個(gè)軟件。圖片,視頻和文本是人工智能技術(shù)重點(diǎn)發(fā)揮優(yōu)勢的地方。人機對話(huà)系統將迎來(lái)革命,企業(yè)會(huì )普遍應用對話(huà)應用,一種更快捷,更智能的服務(wù)方式:使用對話(huà)機器人完成業(yè)務(wù)流程,比如智能會(huì )簽、智能請假、智能審批和智能客服等。
但是目前,企業(yè)實(shí)現對話(huà)應用的方式還很笨拙:
1)上線(xiàn)周期長(cháng):由于缺少實(shí)踐經(jīng)驗,難以掌握人工智能技術(shù)的邊界,往往難以做好功能設計,在開(kāi)始后還會(huì )返工。
2)需要一個(gè)華麗的團隊:需要招聘目前緊俏的AI產(chǎn)品經(jīng)理、機器學(xué)習工程師和自然語(yǔ)言處理工程師,亦或是標注人員和測試人員。
3)需要接入第三方服務(wù):比如語(yǔ)音識別、文字到語(yǔ)音和機器學(xué)習硬件依賴(lài)等。
然而,在Chatopera,我們回顧一些對話(huà)應用,比如機器人客服場(chǎng)景時(shí),和機器人相關(guān)的模塊可以獨立為一個(gè)產(chǎn)品,經(jīng)過(guò)了仔細的分析,我們認為,可以開(kāi)發(fā)兩個(gè)產(chǎn)品:多輪對話(huà)設計器和智能問(wèn)答引擎。前者面向企業(yè)的業(yè)務(wù)人員,撰寫(xiě)聊天機器人腳本;后者面向企業(yè)的IT人員,是問(wèn)答服務(wù)的運行環(huán)境。
本文重點(diǎn)介紹使用多輪對話(huà)設計器實(shí)現“天氣查詢(xún)機器人”的過(guò)程,我們選擇這個(gè)場(chǎng)景并不是因為它簡(jiǎn)單,而是因為它容易理解,使用多輪對話(huà)設計器可以實(shí)現更復雜,更有價(jià)值的應用。我們先一睹為快,這個(gè)機器人是什么樣子的。
天氣查詢(xún)機器人Demo:https://v.qq.com/x/page/a0717l5z53k。html
是不是很實(shí)用?如果你掌握了下面的技巧,它可以幫助做更多的事情。
需求分析
首先,我們需要梳理一下需求:
1. 我想知道任意城市的天氣信息,比如“今天上海天氣怎么樣”;
2. 我還比較關(guān)心空氣,我可以通過(guò)“今天上海空氣怎么樣”獲得空氣質(zhì)量信息;
3. 我想知道今天適不適合戶(hù)外運動(dòng),就問(wèn)“今天上海適合運動(dòng)么”;
4. 如果我問(wèn)了一個(gè)城市的天氣狀況,我還想繼續詢(xún)問(wèn)這個(gè)城市更多信息,這樣我不用每次都告訴機器人城市名稱(chēng)。
當然,我的每個(gè)意圖都有多種表述方式,機器人能支持一些變化的問(wèn)法。如果我的問(wèn)題不夠嚴謹,機器人還應該提醒我合理的表達。
準備開(kāi)發(fā)環(huán)境
- 下載多輪對話(huà)設計器
多輪對話(huà)設計器的下載地址是:
https://www.chatopera.com/product/conversation-designer
如果您打開(kāi)后,下載按鈕顯示未“待發(fā)步”,是因為我們還在緊張的測試,預計2018年7月21日可以發(fā)布v1.0版本,請填寫(xiě)“建立聯(lián)系”表單,我們發(fā)布后第一時(shí)間與您聯(lián)系。

多輪對話(huà)設計器下載頁(yè)面
目前,多輪對話(huà)設計器支持的操作系統包括Windows和MacOSX,在安裝過(guò)程和啟動(dòng)過(guò)程中,如果遇到問(wèn)題請通過(guò)微信公眾號找到我們:

微信公眾號:獲得支持和幫助
- 調研提供天氣信息查詢(xún)的API
現在很多服務(wù)以API的形式提供,從搜索引擎中查找“天氣查詢(xún)服務(wù)API”,我們就能得到一些供應商,經(jīng)過(guò)一些比較,我選擇了和風(fēng)天氣,它數據豐富,免費額度大方。

- AI音箱
Chatopera與Sayinfo達成戰略合作關(guān)系,所以,我們的對話(huà)系統產(chǎn)品與任你說(shuō)音箱可以直接集成。

第一次打開(kāi)多輪對話(huà)設計器后,我們看到如下的面板,我們稱(chēng)之為主面板。

點(diǎn)擊新建按鈕,彈出創(chuàng )建機器人的表單:

填入“小叮當”,當前多輪對話(huà)設計器支持中文(zh_CN)和英文(en_US),我們選擇“zh_CN”,點(diǎn)擊“確認”。然后我們就得到了一個(gè)聊天機器人。

在操作中,有幾個(gè)按鈕:
- 管理:管理聊天機器人的多輪對話(huà)。
- 版本管理:管理不同版本的機器人,導出機器人和在不同版本之間進(jìn)行比對。
- 環(huán)境變量:機器人函數中依賴(lài)的全局變量,這些變量在“設計對話(huà)”的階段和在IT人員“部署到生產(chǎn)環(huán)境”下的值是不同的,比如一些接口服務(wù)的認證鍵值對。
- 發(fā)布:發(fā)布當前機器人為最新版本。
- 刪除:將機器人刪除。
點(diǎn)擊“管理”,進(jìn)入多輪對話(huà)管理頁(yè)面,點(diǎn)擊“新建對話(huà)”,在彈出的窗口中,填寫(xiě)“對話(huà)名稱(chēng)”為“weather”,點(diǎn)擊“確認”。這時(shí),我們看到了新建的對話(huà),我們將修改它的內容完成天氣對話(huà)服務(wù)。

點(diǎn)擊“編輯”,進(jìn)入對話(huà)編輯窗口。在左側的“腳本區域”,寫(xiě)下第一條規則。
+今天(*)天氣[怎么樣]
-{keep} <cap1>天氣挺好的
點(diǎn)擊“保存”,這時(shí)右側的“邏輯區域”有了變化,出現了一個(gè)線(xiàn)條,在線(xiàn)條左右兩端分別是問(wèn)題和答案。在“對話(huà)區域”,我們輸入“今天北京天氣怎么樣”,點(diǎn)擊發(fā)送,這時(shí)機器人回復了。

從我們需求上看,這沒(méi)什么用,但是它工作了,我們就一點(diǎn)點(diǎn)優(yōu)化它。對于在這條規則中,我們使用的語(yǔ)法,(*)代表一個(gè)槽位,<cap1>代表在回復中取槽位的值,[怎么樣]是可有的字符串,{keep}代表這條規則始終生效,keep涉及到對話(huà)的狀態(tài)管理,我們將在文檔中提供更多規則的描述,現在,讀者看懂本示例就可以了。
添加函數
在多輪對話(huà)設計器中,怎么請求和風(fēng)天氣的數據呢?使用函數。函數是多輪對話(huà)支持的使用JavaScript實(shí)現的程序。
我們在“對話(huà)編輯窗口”點(diǎn)擊函數,粘貼如下代碼:
var WForewast = function (apiKey) {
if (!apiKey) throw new Error('Invalid token, get it from http://www.heweather.com/my/service');
this.key = apiKey;
}
WForewast.prototype.getWeatherByCity = function (city) {
return new Promise((resolve, reject)=>{
let url = "https://free-api.heweather.com/v5/weather?city=" + encodeURIComponent(city) + "&key=" + this.key
http
.get(url)
.then((res)=>{
resolve(res.data.HeWeather5[0].suggestion);
})
.catch(function (err) {
if (err) return reject(err);
});
})
}
const wf = new WForewast('182f1b6826d94c6285a489d2414f3ad0');
exports.getWeatherByCity = function(city, cb){
debug("getWeatherByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["comf"]["txt"]
})
}, (err)=>{
debug("error:%j", err)
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的天氣信息。`
})
})
}
exports.getAirByCity = function(city, cb){
debug("getAirByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["air"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的空氣信息。`
})
})
}
exports.getSportByCity = function(city, cb){
debug("getSportByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["sport"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
exports.getDresscodeByCity = function(city, cb){
debug("getDresscodeByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["drsg"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
if (!apiKey) throw new Error('Invalid token, get it from http://www.heweather.com/my/service');
this.key = apiKey;
}
WForewast.prototype.getWeatherByCity = function (city) {
return new Promise((resolve, reject)=>{
let url = "https://free-api.heweather.com/v5/weather?city=" + encodeURIComponent(city) + "&key=" + this.key
http
.get(url)
.then((res)=>{
resolve(res.data.HeWeather5[0].suggestion);
})
.catch(function (err) {
if (err) return reject(err);
});
})
}
const wf = new WForewast('182f1b6826d94c6285a489d2414f3ad0');
exports.getWeatherByCity = function(city, cb){
debug("getWeatherByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["comf"]["txt"]
})
}, (err)=>{
debug("error:%j", err)
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的天氣信息。`
})
})
}
exports.getAirByCity = function(city, cb){
debug("getAirByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["air"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的空氣信息。`
})
})
}
exports.getSportByCity = function(city, cb){
debug("getSportByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["sport"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
exports.getDresscodeByCity = function(city, cb){
debug("getDresscodeByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["drsg"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
在函數中,我們實(shí)現了根據城市請求天氣、空氣質(zhì)量、著(zhù)裝建議和運動(dòng)建議的接口,分別是getWeatherByCity,getAirByCity,getDresscodeByCity和getSportByCity。
細心的讀者會(huì )發(fā)現,在函數中,多輪對話(huà)設計器直接支持了http,debug作為工具類(lèi),發(fā)起網(wǎng)絡(luò )請求和輸出日志信息。這兩個(gè)接口極大的擴展了函數的能力,我們也會(huì )在函數中詳細描述它們的使用。
然后,回到“腳本區域”,修改一下規則,更新如下:
+今天(*)天氣[怎么樣]
-{keep}^getWeatherByCity(<cap1>)
在回復中,我們調用了getWeatherByCity,并且傳入了城市名稱(chēng)。接著(zhù),在“對話(huà)區域”,輸入“今天北京天氣怎么樣”,回復與上次不一樣了。

這次,我們看到了期望的回復,正是從和風(fēng)天氣返回的北京今天的天氣狀況。
使用環(huán)境變量
在上面的函數中,我們有一個(gè)敏感的信息:和風(fēng)天氣的API密鑰。在實(shí)際應用中,我們希望設計階段和部署階段,它的值是不同的。這時(shí),就需要使用環(huán)境變量,環(huán)境變量正是為解決這個(gè)問(wèn)題而設計的。

回到主面板,在“小叮當”操作中,點(diǎn)擊環(huán)境變量,創(chuàng )建如下鍵值對:

讀者可以從和風(fēng)天氣獲得該密鑰,為驗證用途,可以粘貼下面的值:
"HEWEATHER_URL": "https://free-api.heweather.com/v5",
"HEWEATHER_KEY": "182f1b6826d94c6285a489d2414f3ad0"
保存后,回到天氣對話(huà)腳本的“對話(huà)編輯窗口”,在函數中,使用下面的腳本:
/**
* Plugin
*/
var WForewast = function (apiKey) {
if (!apiKey) throw new Error('Invalid token, get it from http://www.heweather.com/my/service');
this.key = apiKey;
}
WForewast.prototype.getWeatherByCity = function (city) {
return new Promise((resolve, reject)=>{
let url = config["HEWEATHER_URL"] + "/weather?city=" + encodeURIComponent(city) + "&key=" + this.key
http
.get(url)
.then((res)=>{
resolve(res.data.HeWeather5[0].suggestion);
})
.catch(function (err) {
if (err) return reject(err);
});
})
}
const wf = new WForewast(config["HEWEATHER_KEY"]);
exports.getWeatherByCity = function(city, cb){
debug("getWeatherByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["comf"]["txt"]
})
}, (err)=>{
debug("error:%j", err)
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的天氣信息。`
})
})
}
exports.getAirByCity = function(city, cb){
debug("getAirByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["air"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的空氣信息。`
})
})
}
exports.getSportByCity = function(city, cb){
debug("getSportByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["sport"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
exports.getDresscodeByCity = function(city, cb){
debug("getDresscodeByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["drsg"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
* Plugin
*/
var WForewast = function (apiKey) {
if (!apiKey) throw new Error('Invalid token, get it from http://www.heweather.com/my/service');
this.key = apiKey;
}
WForewast.prototype.getWeatherByCity = function (city) {
return new Promise((resolve, reject)=>{
let url = config["HEWEATHER_URL"] + "/weather?city=" + encodeURIComponent(city) + "&key=" + this.key
http
.get(url)
.then((res)=>{
resolve(res.data.HeWeather5[0].suggestion);
})
.catch(function (err) {
if (err) return reject(err);
});
})
}
const wf = new WForewast(config["HEWEATHER_KEY"]);
exports.getWeatherByCity = function(city, cb){
debug("getWeatherByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["comf"]["txt"]
})
}, (err)=>{
debug("error:%j", err)
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的天氣信息。`
})
})
}
exports.getAirByCity = function(city, cb){
debug("getAirByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["air"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的空氣信息。`
})
})
}
exports.getSportByCity = function(city, cb){
debug("getSportByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["sport"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
exports.getDresscodeByCity = function(city, cb){
debug("getDresscodeByCity: %s", city);
wf.getWeatherByCity(city)
.then((suggestions)=>{
cb(null, {
text: suggestions["drsg"]["txt"]
})
}, (err)=>{
cb(null, {
text: `很抱歉,沒(méi)有獲得${city}的信息。`
})
})
}
這次,代碼內容和前一版本相比,使用了config對象,config是一個(gè)包含環(huán)境變量的JSON數據。所以,我們更佳利于將來(lái)部署對話(huà)應用了。
支持更多對話(huà)
回想我們需要的幾種天氣信息,我們根據需求變更腳本,一個(gè)滿(mǎn)足需求的腳本呈現如下:
/**
* 一個(gè)能回答天氣的對話(huà)腳本
* author: Hai Liang Wang<hain@chatopera.com>
* date: 2018-06-20
*/
// 技能介紹
+ 你知道哪些天氣信息
- 我知道今天的空氣,著(zhù)裝建議和適不適合運動(dòng)
// 天氣
+ 今天 (*) 天氣 [怎么樣]
- {keep} ^getWeatherByCity(<cap1>)
+ [今天] (天氣|氣候) [怎么樣]
- {@__wf_guide_}
+ (*) 今天天氣 [怎么樣]
- {keep} ^getWeatherByCity(<cap1>)
+ (*) 空氣 (*)
% ^getWeatherByCity(<cap1>)
- {keep} ^getAirByCity(<p1cap1>)
+ __wf_guide_
- {keep} 添加城市名哦,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 我需要知道城市名稱(chēng),比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 要告訴我城市名,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
// 空氣
+ [今天] 空氣 [怎么樣]
- {@__wf_guide_air}
+ (*) 今天空氣 [怎么樣]
- {keep} ^getAirByCity(<cap1>)
+ 今天 (*) 空氣 [怎么樣]
- {keep} ^getAirByCity(<cap1>)
+ __wf_guide_air
- {keep} 添加城市名哦,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 我需要知道城市名稱(chēng),比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 要告訴我城市名,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
// 運動(dòng)
+ [今天] 適(合|宜)運動(dòng)(么|嗎)
- {@__wf_guide_sport}
+ (*) 今天適(合|宜)運動(dòng)(么|嗎)
- {keep} ^getSportByCity(<cap1>)
+ 今天 (*) 適(合|宜)運動(dòng)(么|嗎)
- {keep} ^getSportByCity(<cap1>)
+ __wf_guide_sport
- {keep} 添加城市名哦,比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
- 我需要知道城市名稱(chēng),比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
- 要告訴我城市名,比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
// 衣著(zhù)
+ [今天] 適(合|宜)穿什么
- {@__wf_guide_dresscode}
+ (*) 今天適(合|宜)穿什么
- {keep} ^getDresscodeByCity(<cap1>)
+ [今天] (*) 適(合|宜)穿什么
- {keep} ^getDresscodeByCity(<cap1>)
+ __wf_guide_dresscode
- {keep} 添加城市名哦,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 我需要知道城市名稱(chēng),比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 要告訴我城市名,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
* 一個(gè)能回答天氣的對話(huà)腳本
* author: Hai Liang Wang<hain@chatopera.com>
* date: 2018-06-20
*/
// 技能介紹
+ 你知道哪些天氣信息
- 我知道今天的空氣,著(zhù)裝建議和適不適合運動(dòng)
// 天氣
+ 今天 (*) 天氣 [怎么樣]
- {keep} ^getWeatherByCity(<cap1>)
+ [今天] (天氣|氣候) [怎么樣]
- {@__wf_guide_}
+ (*) 今天天氣 [怎么樣]
- {keep} ^getWeatherByCity(<cap1>)
+ (*) 空氣 (*)
% ^getWeatherByCity(<cap1>)
- {keep} ^getAirByCity(<p1cap1>)
+ __wf_guide_
- {keep} 添加城市名哦,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 我需要知道城市名稱(chēng),比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 要告訴我城市名,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
// 空氣
+ [今天] 空氣 [怎么樣]
- {@__wf_guide_air}
+ (*) 今天空氣 [怎么樣]
- {keep} ^getAirByCity(<cap1>)
+ 今天 (*) 空氣 [怎么樣]
- {keep} ^getAirByCity(<cap1>)
+ __wf_guide_air
- {keep} 添加城市名哦,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 我需要知道城市名稱(chēng),比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 要告訴我城市名,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
// 運動(dòng)
+ [今天] 適(合|宜)運動(dòng)(么|嗎)
- {@__wf_guide_sport}
+ (*) 今天適(合|宜)運動(dòng)(么|嗎)
- {keep} ^getSportByCity(<cap1>)
+ 今天 (*) 適(合|宜)運動(dòng)(么|嗎)
- {keep} ^getSportByCity(<cap1>)
+ __wf_guide_sport
- {keep} 添加城市名哦,比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
- 我需要知道城市名稱(chēng),比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
- 要告訴我城市名,比如“今天北京適合運動(dòng)么”或者“北京今天適合運動(dòng)么”
// 衣著(zhù)
+ [今天] 適(合|宜)穿什么
- {@__wf_guide_dresscode}
+ (*) 今天適(合|宜)穿什么
- {keep} ^getDresscodeByCity(<cap1>)
+ [今天] (*) 適(合|宜)穿什么
- {keep} ^getDresscodeByCity(<cap1>)
+ __wf_guide_dresscode
- {keep} 添加城市名哦,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 我需要知道城市名稱(chēng),比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 要告訴我城市名,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
這也就是我們在天氣查詢(xún)機器人Demo中看到的機器人的腳本,在設計過(guò)程中,我們通過(guò)對話(huà)區域來(lái)測試機器人的回復是否符合預期,我們通過(guò)邏輯窗口來(lái)查看當前機器人的思維邏輯導圖,當前機器人對話(huà)的狀態(tài)會(huì )被高量,被命中的規則呈現為路徑。

另外,在設計過(guò)程中,每次保存自動(dòng)為腳本和函數生成快照,使用快照下拉列表,我們能方便的回退。

這就是我們追求的體驗,業(yè)務(wù)人員可以更專(zhuān)注于對話(huà)機器人的對話(huà)邏輯滿(mǎn)足需求。
發(fā)布機器人
現在,有了可以工作的腳本,我們想發(fā)布一個(gè)版本,這時(shí)回到主面板,點(diǎn)擊“發(fā)布”,填入如下信息,點(diǎn)擊“確認”。

最終,我們需要得到一個(gè)“服務(wù)”,它能時(shí)刻被訪(fǎng)問(wèn),以及和AI音箱集成。我們需要將天氣機器人導出為對話(huà)應用,然后部署到智能問(wèn)答引擎。在主面板,點(diǎn)擊版本管理,我們看到操作中有三項。

- 對比差異:在多個(gè)版本中比較差異,包括腳本和函數。
- 導出:將機器人導出為對話(huà)應用文件。
- 覆蓋:使用這個(gè)版本覆蓋當前機器人,包括腳本和函數等。
什么是智能問(wèn)答引擎
智能問(wèn)答引擎是多輪對話(huà)的運行時(shí),同時(shí)也包含知識庫和統計監控等功能。智能問(wèn)答引擎和多輪對話(huà)設計器會(huì )同時(shí)發(fā)布。

如果您想參加這兩個(gè)產(chǎn)品的發(fā)布會(huì ),請報名Chatopera產(chǎn)品發(fā)布會(huì ):追求高度智能化和自動(dòng)化的企業(yè)服務(wù)。