亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當(dāng)前的位置是:  首頁 > 新聞 > 國內(nèi) >
 首頁 > 新聞 > 國內(nèi) >

Chatopera多輪對話設(shè)計(jì)器

2018-08-01 11:23:05   作者:   來源:CTI論壇   評論:0  點(diǎn)擊:


多輪對話設(shè)計(jì)器

多輪對話設(shè)計(jì)器

概述

多輪對話設(shè)計(jì)器 (Conversation Designer)是以自然語言為輸入,定義聊天機(jī)器人邏輯思維的工具。它可以很方便的通過Chatopera支持的腳本語法描述復(fù)雜的對話邏輯,并且通過函數(shù)的形式集成企業(yè)的其它服務(wù)。企業(yè)的業(yè)務(wù)人員可以很容易的學(xué)習(xí)腳本語法,制作滿足企業(yè)業(yè)務(wù)需求的聊天機(jī)器人。
多輪對話設(shè)計(jì)器是設(shè)計(jì)滿足業(yè)務(wù)需求的對話機(jī)器人的PC端應(yīng)用程序,現(xiàn)已支持Windows和Mac OSX平臺。多輪對話能力是聊天機(jī)器人模仿人的對話能里的一大挑戰(zhàn),在復(fù)雜的上下文和需要很多背景知識的前提下,現(xiàn)有的人工智能技術(shù)是無能為力的,在Chatopera,我們相信在企業(yè)服務(wù)中,當(dāng)話術(shù)或流程固定的情況下,依賴Chatopera的產(chǎn)品可以輸出用對話完成任務(wù)的服務(wù),比如用對話完成點(diǎn)餐、報(bào)銷、請假。這些對話可以在企業(yè)的聊天工具中,也可以通過智能音箱的等其他客戶端。

安裝

僅支持Mac OSX和Windows操作系統(tǒng)。

下載地址

下載地址:
https://www.chatopera.com/product/conversation-designer
  • MacOS:dmg為文件后綴的安裝文件,雙擊打開,根據(jù)安裝向?qū)О惭b。
  • Windows:exe為文件后綴可執(zhí)行文件,雙擊打開,根據(jù)安裝向?qū)О惭b。

啟動(dòng)應(yīng)用

  • 安裝完打開應(yīng)用程序,如下圖:
多輪對話設(shè)計(jì)器打開后頁面
可能遇到的問題
1. Macos上首次啟動(dòng)警告
MacOS權(quán)限問題
解決方案
在應(yīng)用中心,找到“多輪對話設(shè)計(jì)器”:
應(yīng)用中心
選擇“多輪對話設(shè)計(jì)器”并且右鍵:
右鍵打開
點(diǎn)擊“打開”(“Open”)。

快速開始

下載安裝包后,雙擊打開,進(jìn)入安裝向?qū)А?br /> 安裝完打開應(yīng)用圖標(biāo)后進(jìn)入主面板,如下圖:
應(yīng)用主面板
 

導(dǎo)入示例程序

下載示例程序包文件:小叮當(dāng)-1.0.0-conversations.c66
https://github.com/chatopera/conversation-sampleapp
示例程序下載地址
在主面板點(diǎn)擊界面的右上方的“導(dǎo)入”按鈕,選擇剛才下載的示例程序小叮當(dāng)-1.0.0-conversations.c66如圖:
導(dǎo)入對話框
導(dǎo)入成功,可以看到在聊天機(jī)器人界面有一條數(shù)據(jù)顯示,“名字 小叮當(dāng)”等;點(diǎn)擊小叮當(dāng)?shù)?ldquo;管理”按鈕,可以看到它的多輪對話列表,包括:chatopera,profile,weather。如下圖:
多輪對話列表
對話 功能
chatopera 關(guān)于Chatopera的公司信息
profile 機(jī)器人的畫像
weather 提供天氣查詢功能的對話

測試示例程序

可以針對上面的三個(gè)多輪對話,進(jìn)行一番聊天測試,下面測試主要以“問天氣”為例子。
選擇 “weather” 對話的編輯按鈕,進(jìn)入weather對話的編輯窗口,包括:
概念 描述
腳本 按照多輪對話語法規(guī)則來描述機(jī)器人對話邏輯
函數(shù) 執(zhí)行JavaScript代碼的環(huán)境,聲明的接口可以直接從腳本中調(diào)用
日志 函數(shù)中debug方法的輸出
邏輯 聊天機(jī)器人的思維邏輯導(dǎo)圖,保存腳本后自動(dòng)生成
對話 實(shí)時(shí)測試聊天機(jī)器人的窗口
在“對話”區(qū)域的下方輸入框輸入:你知道哪些天氣信息
多輪對話編輯窗口
點(diǎn)擊“發(fā)送”按鈕,可以看到對話區(qū)域有了問答的信息流,并且“邏輯”區(qū)域也有了對話狀態(tài),對話路徑顯示“綠色”高亮。
測試對話
在此界面可以進(jìn)行多輪對話測試,如下截圖:
多輪對話
 

增加新的對話

測試新對話
我:今天北京適合游玩么?
機(jī)器人:風(fēng)清氣爽,當(dāng)然可以啊~
在腳本區(qū)域可以自行設(shè)計(jì)腳本,非常簡單,例如增加:
+ 今天 (*) 適合游玩么?
- 風(fēng)清氣爽,當(dāng)然可以啊~
點(diǎn)擊界面上方“保存”按鈕,會(huì)使得剛才定義的對話生效,并且可以在聊天區(qū)域直接測試。

保存新版本

剛才點(diǎn)擊“保存”按鈕時(shí),同時(shí)將weather的對話生成一個(gè)快照,我們隨時(shí)可以回退到某個(gè)快照。
查看快照
回到聊天機(jī)器人列表頁面,可以點(diǎn)擊“發(fā)布”按鈕,可以將當(dāng)前聊天機(jī)器人生成新版本,相關(guān)的信息如圖:
發(fā)布新版本
點(diǎn)擊上圖的“確認(rèn)”按鈕,發(fā)布新版本成功,點(diǎn)擊“版本管理”,看到剛才發(fā)布的1.0.1版本的信息。

各個(gè)版本之間比較

對于聊天機(jī)器人的發(fā)布的各個(gè)版本差異,可以使用版本比較工具,比較具體的差異,包括:腳本比較和函數(shù)比較。 點(diǎn)擊上圖1.0.1對應(yīng)的“對比差異”,可以“對比變化”界面,其中分為三個(gè)部分,
    - “左上”為被對比的參考版本;本例子為:1.0.0
    - “右上”為要對比的目標(biāo)版本,本例子為:1.0.1
    - “下方”為兩版本數(shù)據(jù)的差異,具體:
        * 綠色:新增的內(nèi)容;
        * 紅色:刪除的內(nèi)容;
        * 灰色:沒有變化的內(nèi)容;
剛進(jìn)入“對比變化”界面,默認(rèn)對比的是:函數(shù),本例子請?jiān)谶x擇“版本號”的右邊切換“腳本”為“對話”,如圖:
版本之間比較差異
對比的差異部分為綠色,表示新增。

導(dǎo)出特定版本

多輪對話設(shè)計(jì)器屬于設(shè)計(jì)階段,在機(jī)器人滿足需求后,可以導(dǎo)出為對話應(yīng)用.c66文件,方便分發(fā)和部署。在生產(chǎn)環(huán)境,導(dǎo)入到智能問答引擎中,作為多輪對話應(yīng)用的運(yùn)行時(shí)。
在“版本管理”界面,選擇剛才發(fā)布的“1.0.1”的“導(dǎo)出”,可以選擇一個(gè)路徑存儲該導(dǎo)出的文件,如圖:
導(dǎo)出文件

腳本語法

術(shù)語

在正式介紹腳本語法前,我們先來認(rèn)識下面的術(shù)語:
概念 描述
對話 滿足設(shè)定需求的多輪對話
輸入 用戶向聊天機(jī)器人發(fā)送的消息的文字形式
觸發(fā)器 匹配用戶輸入文字的字符串,可以聲明槽位,當(dāng)用戶的輸入發(fā)生時(shí),會(huì)按照算法順序匹配觸發(fā)器
回復(fù) 機(jī)器人回復(fù)用戶輸入的文字
多輪對話 根據(jù)上一次回復(fù)的狀態(tài),聲明下輪對話的優(yōu)先匹配規(guī)則
函數(shù) 可以從腳本中接受輸入,并通過JavaScript執(zhí)行任務(wù)返回結(jié)果的代碼
對話

   

觸發(fā)器

觸發(fā)器是對話的基礎(chǔ),當(dāng)用戶向聊天機(jī)器人發(fā)送一條消息時(shí),機(jī)器人引擎會(huì)從所有定義的觸發(fā)器中找到匹配的一個(gè)。在機(jī)器人引擎中,觸發(fā)器用半角字符加號( + )表示。機(jī)器人的回答用半角字符減號( - )表示。
例如,我們可以這樣定義一個(gè)對話:
+ 晚飯吃什么
- 北京烤鴨   
注意:這里( + )和( - )和文字之間需要隔一個(gè)空格。

槽位

為了讓觸發(fā)器能適應(yīng)復(fù)雜的需求,機(jī)器人引擎使用槽位規(guī)則,槽位既能讓規(guī)則具有更好的匹配能力,也能讓回復(fù)和函數(shù)中使用不同槽位的值。
注意:下面的某些槽位左右?guī)в锌崭,這些空格是必須的。

通用槽位

解釋示例:通用槽位
匹配:客服你好
匹配:你好
匹配:你好嗎
通用槽位會(huì)匹配零到無窮個(gè)字符、單詞。此處的輸入也會(huì)被系統(tǒng)捕獲或者存儲。
+ (*) 你好 (*)
- 歡迎光臨

確定長度槽位

解釋示例:確定長度槽位
匹配:早安北京
不匹配:早安烏魯木齊
如果你知道你想要的字符長度,可以試試確定長度槽位。此處的槽位可以被系統(tǒng)捕獲,而且可以在回答中使用
語法為:*n, 其中n代表長度。
+ 早安 *2
- 早安

可控長度槽位

解釋示例:可控長度槽位
匹配:早安
匹配:早安北京
匹配:早安哈爾濱
匹配:早安烏魯木齊
不匹配:早安君士坦丁堡
如果只想匹配一些字符,可控長度的槽位是個(gè)不錯(cuò)的選擇。語法為:*~n, n代表你想匹配的最大長度
+ 早安 *~4
- 早安

區(qū)間槽位

解釋示例:區(qū)間槽位
匹配:早安北京
匹配:早安烏魯木齊
不匹配:早安
如果想匹配一個(gè)確定的區(qū)間,比如2到4個(gè)字符之間,區(qū)間槽位絕對可以滿足需要。語法為:*(最短-最長),此槽位可以被系統(tǒng)捕獲和用在回復(fù)中。
+ 早安 *(2-4)
- 早安

必選項(xiàng)

解釋示例:必選項(xiàng)
匹配:早安北京
不匹配:早安西安
不匹配:早安
必選項(xiàng)用在你有一系列可選項(xiàng),但是必須有一個(gè)被匹配。輸入中的可選項(xiàng)會(huì)被系統(tǒng)捕獲和用在回復(fù)中
+ 早安(北京|上海|天津)
- 早安

可選項(xiàng)

解釋示例:可選項(xiàng)
匹配:早安北京
匹配:早安美麗的北京
不匹配:早安熱鬧的北京
可選項(xiàng)用來確定一些額外的內(nèi)容
+ 早安 [美麗的] 北京
- 早安

回復(fù)

在觸發(fā)器中,我們已經(jīng)學(xué)到了怎么添加一個(gè)回答。事實(shí)上你可以添加任意數(shù)量的回答。這里還有一些高級功能可以幫助你完成更多的任務(wù)。

簡單形式

+ 在嗎
- 你好,在的
如果添加了多個(gè)回答,系統(tǒng)會(huì)從中隨機(jī)挑選一個(gè)作為回復(fù), 然后丟掉這個(gè)回答。
+ 在嗎
- 親,在的
- 親,有什么需要幫助
- 你好,請問遇到什么問題了嗎?
所謂丟掉這個(gè)答案,是指機(jī)器人針對同一個(gè)用戶,在半個(gè)小時(shí)內(nèi)再次匹配上該觸發(fā)器時(shí),選擇回復(fù)時(shí),不考慮使用過的回復(fù)。 在一個(gè)觸發(fā)器中聲明多個(gè)回復(fù)后,保存,邏輯中將出現(xiàn)分支。
機(jī)器人對話邏輯
如果不想讓系統(tǒng)丟掉使用過的回復(fù),可以在回復(fù)前添加{keep}。
+ 在嗎
- {keep} 親,在的
- 親,有什么需要幫助
- 你好,請問遇到什么問題了嗎?
也可以在觸發(fā)器前添加{keep},就不用在每個(gè)回答中都添加了
+ {keep} 在嗎
- 親,在的
- 親,有什么需要幫助
- 你好,請問遇到什么問題了嗎?
如果回答很長,可以通過“^”分割以方便可讀性。可以通過“\n”實(shí)現(xiàn)換行
+ 在嗎
- 你好,這里是客服中心,\n
^ 請問遇到什么問題了嗎?   
它等價(jià)于
+ 在嗎
- 你好,這里是客服中心,請問遇到什么問題了嗎?

槽位取值

解釋示例:槽位取值
匹配:小明比小紅高
回答:你確定小明比小紅高嗎?
有些時(shí)候,在回答中需要使用輸入中的槽位值,這時(shí)可以使用達(dá)到目的。
+ 我是 *~3
- 你好,
如果用戶輸入,“我是張三”,那么系統(tǒng)將回復(fù)“你好,張三”,當(dāng)有多個(gè)槽時(shí),可以使用多個(gè)。
+ *2 比 *2 高
- 你確定比高嗎?
在對話中,我們有時(shí)候會(huì)需要以前的槽位值,看一下下面這個(gè)例子:
+ 我叫 *~3
- 你好,

    + 你猜我叫什么?
    % 你好,
    - 你剛說了,你叫
代表了以前的槽位。其中N代表在在對話中之前的問答,M代表捕獲的位移。
槽位取值
 
此處,還有一個(gè)重要語法:%。(%) 開頭的句子代表觸發(fā)器“你猜我叫什么?”只服務(wù)于“你好,”作為回復(fù)時(shí),它會(huì)被優(yōu)先匹配。上一輪對話的回復(fù)通過(%)的方式指定了接下來的邏輯,形成多輪對話。 關(guān)于(%)的用法,后文還會(huì)進(jìn)行詳細(xì)介紹,此處,讀者只需要掌握從上下文的槽位取值便可。
另外,(+, %, -) 前的空格不是必須的,在多輪對話中,空格可以增強(qiáng)腳本的可讀性,但是系統(tǒng)是忽略的。

重定向 {@__reply__}

有些時(shí)候,在問答對中重用一些回復(fù)能使編寫腳本效率更高,這時(shí)可以定義一個(gè)問答對,并在腳本其它位置引用它。
+ 在嗎
- {@__greeting__} 請問有什么能幫助您?

+ __greeting__
- 親,在的。
- 你好,客服小美為您服務(wù)
- 親親,稍等,客服馬上就到
引用的方式就是 “{@觸發(fā)器}”,觸發(fā)器中的下劃線不是必須的,但是它能增強(qiáng)腳本的可讀性。

多輪對話

在實(shí)際應(yīng)用中,和機(jī)器人聊天時(shí),很可能要通過多輪對話完成一個(gè)任務(wù)。我們用(%)來定位之前回復(fù),聲明新的觸發(fā)器,(%)后的內(nèi)容是和某個(gè)回復(fù)內(nèi)容一樣的字符串。
+ *
- 您身高多少

  + *(3-5)
  % 您身高多少
  - 我的身高也是
讓我們一起看看這個(gè)例子:
  1. 當(dāng)用戶輸入任何文字,我們用通用槽位觸發(fā)回答,然后系統(tǒng)回復(fù)“您身高多少”。
  2. 當(dāng)用戶繼續(xù)輸入時(shí),系統(tǒng)會(huì)先從歷史中查看之前的回復(fù)中是否有對應(yīng)的上下文,在這里指的是“% 您身高多少”
  3. 最后,如果用戶輸入3到5個(gè)字符,系統(tǒng)匹配觸發(fā)器“+ *(3-5)”, 并且回復(fù)“我也是”。“”代表的就是用戶輸入的內(nèi)容。

函數(shù)

函數(shù)是一個(gè)強(qiáng)大而有趣的設(shè)計(jì)。在回復(fù)中,可以使用函數(shù)來獲取整條消息對象,用戶對象或者其它資源,比如數(shù)據(jù)庫。把槽位值當(dāng)做變量傳給函數(shù),例如下面這個(gè)例子:
+ 我的用戶名是 *(2-10)
- ^getUserAccount()
所以,調(diào)用函數(shù)的方式就是使用“^”。在函數(shù)的編輯窗口中,可以這樣定義:
exports.getUserAccount(account, cb) {
  cb(null, "對不起,系統(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ì)被解析成對應(yīng)的函數(shù),所以放心的在回復(fù)中添加任意合法的函數(shù),比如在腳本中這樣寫:
+ ...
- ^nestedAFunction()
然后,在函數(shù)中,定義如下:
exports.nestedAFunction = function(cb) {
  cb(null, "張三 ^nestedBFunction()");
}
exports.nestedBFunction = function(cb) {
  cb(null, "和李四");
}

總結(jié)

以上是多輪對話設(shè)計(jì)器 v1.x 版本中支持的腳本語法,這些語法能夠保證業(yè)務(wù)人員實(shí)現(xiàn)滿足需求的聊天機(jī)器人,除了函數(shù)部分的有一點(diǎn)門檻外,其它內(nèi)容是非常容易掌握的。對于函數(shù),只需要一點(diǎn)JavaScript基礎(chǔ)知識,就可以掌握。

示例應(yīng)用

本節(jié)介紹使用多輪對話設(shè)計(jì)器實(shí)現(xiàn)一個(gè)“聊天機(jī)器人”的具體過程。我們以實(shí)現(xiàn)天氣問答機(jī)器人為例,我們選擇這個(gè)場景并不是因?yàn)樗唵,而是因(yàn)樗菀桌斫,使用多輪對話設(shè)計(jì)器可以實(shí)現(xiàn)更復(fù)雜,更有價(jià)值的應(yīng)用。我們先一睹為快,這個(gè)機(jī)器人是什么樣子的。
視頻:天氣查詢機(jī)器人Demo
是不是很實(shí)用?如果你掌握了多輪對話設(shè)計(jì)器,就可以實(shí)現(xiàn)聊天機(jī)器人。

需求分析

首先,我們需要梳理一下需求:
1) 我想知道任意城市的天氣信息,比如“今天上海天氣怎么樣”;
2) 我還比較關(guān)心空氣,我可以通過“今天上海空氣怎么樣”獲得空氣質(zhì)量信息;
3) 我想知道今天適不適合戶外運(yùn)動(dòng),就問“今天上海適合運(yùn)動(dòng)么”;
4) 如果我問了一個(gè)城市的天氣狀況,我還想繼續(xù)詢問這個(gè)城市更多信息,這樣我不用每次都告訴機(jī)器人城市名稱。
當(dāng)然,我的每個(gè)意圖都有多種表述方式,機(jī)器人能支持一些變化的問法。如果我的問題不夠嚴(yán)謹(jǐn),機(jī)器人還應(yīng)該提醒我合理的表達(dá)。

調(diào)研提供天氣信息查詢的API

現(xiàn)在很多服務(wù)以API的形式提供,從搜索引擎中查找“天氣查詢服務(wù) API”,我們就能得到一些供應(yīng)商,經(jīng)過一些比較,我選擇了和風(fēng)天氣,它數(shù)據(jù)豐富,免費(fèi)額度大方。
和風(fēng)天氣
AI音箱
Chatopera與杭州任你說科技達(dá)成戰(zhàn)略合作伙伴關(guān)系,所以,我們的對話系統(tǒng)產(chǎn)品與任你說音箱可以直接集成。
任你說官網(wǎng)
 
 

第一條規(guī)則

第一次打開多輪對話設(shè)計(jì)器后,我們看到如下的面板,我們稱之為主面板。
和風(fēng)天氣
點(diǎn)擊新建按鈕,彈出創(chuàng)建機(jī)器人的表單:
創(chuàng)建聊天機(jī)器人
填入“小叮當(dāng)”,當(dāng)前多輪對話設(shè)計(jì)器支持中文(zh_CN)和英文(en_US),我們選擇“zh_CN”,點(diǎn)擊“確認(rèn)”。然后我們就得到了一個(gè)聊天機(jī)器人。
聊天機(jī)器人
在操作中,有幾個(gè)按鈕:
  • 管理:管理聊天機(jī)器人的多輪對話。
  • 版本管理:管理不同版本的機(jī)器人,導(dǎo)出機(jī)器人和在不同版本之間進(jìn)行比對。
  • 環(huán)境變量:機(jī)器人函數(shù)中依賴的全局變量,這些變量在“設(shè)計(jì)對話”的階段和在IT人員“部署到生產(chǎn)環(huán)境”下的值是不同的,比如一些接口服務(wù)的認(rèn)證鍵值對。
  • 發(fā)布:發(fā)布當(dāng)前機(jī)器人為最新版本。
  • 刪除:將機(jī)器人刪除。
點(diǎn)擊“管理”,進(jìn)入多輪對話管理頁面,點(diǎn)擊“新建對話”,在彈出的窗口中,填寫“對話名稱”為“weather”,點(diǎn)擊“確認(rèn)”。這時(shí),我們看到了新建的對話,我們將修改它的內(nèi)容完成天氣對話服務(wù)。
創(chuàng)建對話
點(diǎn)擊“編輯”,進(jìn)入對話編輯窗口。在左側(cè)的“腳本區(qū)域”,寫下第一條規(guī)則。
+ 今天 (*) 天氣 [怎么樣]
- {keep} 天氣挺好的
點(diǎn)擊“保存”,這時(shí)右側(cè)的“邏輯區(qū)域”有了變化,出現(xiàn)了一個(gè)線條,在線條左右兩端分別是問題和答案。在“對話區(qū)域”,我們輸入“今天北京天氣怎么樣”,點(diǎn)擊發(fā)送,這時(shí)機(jī)器人回復(fù)了。
對話編輯窗口
從我們需求上看,這沒什么用,但是它工作了,我們就一點(diǎn)點(diǎn)優(yōu)化它。對于在這條規(guī)則中,我們使用的語法,(*)代表一個(gè)槽位,代表在回復(fù)中取槽位的值,[怎么樣]是可有的字符串,{keep}代表這條規(guī)則始終生效,keep涉及到對話的狀態(tài)管理,我們將在文檔中提供更多規(guī)則的描述,現(xiàn)在,讀者看懂本示例就可以了。

添加函數(shù)

在多輪對話設(shè)計(jì)器中,怎么請求和風(fēng)天氣的數(shù)據(jù)呢?使用函數(shù)。函數(shù)是多輪對話支持的使用JavaScript實(shí)現(xiàn)的程序。
我們在“對話編輯窗口”點(diǎn)擊函數(shù),粘貼如下代碼:
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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${city}的信息。`
            })
        })
}
在函數(shù)中,我們實(shí)現(xiàn)了根據(jù)城市請求天氣、空氣質(zhì)量、著裝建議和運(yùn)動(dòng)建議的接口,分別是getWeatherByCity,getAirByCity,getDresscodeByCity和getSportByCity。
細(xì)心的讀者會(huì)發(fā)現(xiàn),在函數(shù)中,多輪對話設(shè)計(jì)器直接支持了http,debug作為工具類,發(fā)起網(wǎng)絡(luò)請求和輸出日志信息。這兩個(gè)接口極大的擴(kuò)展了函數(shù)的能力,我們也會(huì)在函數(shù)中詳細(xì)描述它們的使用。
然后,回到“腳本區(qū)域”,修改一下規(guī)則,更新如下:
+ 今天 (*) 天氣 [怎么樣]
- {keep} ^getWeatherByCity()
在回復(fù)中,我們調(diào)用了getWeatherByCity,并且傳入了城市名稱。 接著,在“對話區(qū)域”,輸入“今天北京天氣怎么樣”,回復(fù)與上次不一樣了。
測試對話
這次,我們看到了期望的回復(fù),正是從和風(fēng)天氣返回的北京今天的天氣狀況。

使用環(huán)境變量

在上面的函數(shù)中,我們有一個(gè)敏感的信息:和風(fēng)天氣的API密鑰。在實(shí)際應(yīng)用中,我們希望設(shè)計(jì)階段部署階段,它的值是不同的。這時(shí),就需要使用環(huán)境變量,環(huán)境變量正是為解決這個(gè)問題而設(shè)計(jì)的。
回到主面板,在“小叮當(dāng)”操作中,點(diǎn)擊環(huán)境變量,創(chuàng)建如下鍵值對:
設(shè)置環(huán)境變量
讀者可以從和風(fēng)天氣獲得該密鑰,為驗(yàn)證用途,可以粘貼下面的值:
"HEWEATHER_URL": "https://free-api.heweather.com/v5",
"HEWEATHER_KEY": "182f1b6826d94c6285a489d2414f3ad0"
保存后,回到天氣對話腳本的“對話編輯窗口”,在函數(shù)中,使用下面的腳本:
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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${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: `很抱歉,沒有獲得${city}的信息。`
            })
        })
}
這次,代碼內(nèi)容和前一版本相比,使用了config對象,config是一個(gè)包含環(huán)境變量的JSON數(shù)據(jù)。所以,我們更加利于將來部署對話應(yīng)用了。

支持更多對話

回想我們需要的幾種天氣信息,我們根據(jù)需求變更腳本,一個(gè)滿足需求的腳本呈現(xiàn)如下:
// 技能介紹

+ 你知道哪些天氣信息
- 我知道今天的空氣,著裝建議和適不適合運(yùn)動(dòng)

// 天氣

+ 今天 (*) 天氣 [怎么樣]
- {keep} ^getWeatherByCity()

+ [今天] (天氣|氣候) [怎么樣]
- {@__wf_guide_}

+ (*) 今天天氣 [怎么樣]
- {keep} ^getWeatherByCity()

    + (*) 空氣 (*)
    % ^getWeatherByCity()
    - {keep} ^getAirByCity()


+ __wf_guide_
- {keep} 添加城市名哦,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 我需要知道城市名稱,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”
- 要告訴我城市名,比如“今天北京天氣怎么樣”或者“北京天氣怎么樣”


// 空氣

+ [今天] 空氣 [怎么樣]
- {@__wf_guide_air}

+ (*) 今天空氣 [怎么樣]
- {keep} ^getAirByCity()

+ 今天 (*) 空氣 [怎么樣]
- {keep} ^getAirByCity()

+ __wf_guide_air
- {keep} 添加城市名哦,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 我需要知道城市名稱,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”
- 要告訴我城市名,比如“今天北京空氣怎么樣”或者“北京空氣怎么樣”


// 運(yùn)動(dòng)

+ [今天] 適(合|宜)運(yùn)動(dòng)(么|嗎)
- {@__wf_guide_sport}

+ (*) 今天適(合|宜)運(yùn)動(dòng)(么|嗎)
- {keep} ^getSportByCity()

+ 今天 (*) 適(合|宜)運(yùn)動(dòng)(么|嗎)
- {keep} ^getSportByCity()

+ __wf_guide_sport
- {keep} 添加城市名哦,比如“今天北京適合運(yùn)動(dòng)么”或者“北京今天適合運(yùn)動(dòng)么”
- 我需要知道城市名稱,比如“今天北京適合運(yùn)動(dòng)么”或者“北京今天適合運(yùn)動(dòng)么”
- 要告訴我城市名,比如“今天北京適合運(yùn)動(dòng)么”或者“北京今天適合運(yùn)動(dòng)么”


// 衣著

+ [今天] 適(合|宜)穿什么
- {@__wf_guide_dresscode}

+ (*) 今天適(合|宜)穿什么
- {keep} ^getDresscodeByCity()

+ [今天] (*) 適(合|宜)穿什么
- {keep} ^getDresscodeByCity()


+ __wf_guide_dresscode
- {keep} 添加城市名哦,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 我需要知道城市名稱,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
- 要告訴我城市名,比如“今天北京適合穿什么”或者“北京今天適合穿什么”
這也就是我們在天氣查詢機(jī)器人Demo中看到的機(jī)器人的腳本,在設(shè)計(jì)過程中,我們通過對話區(qū)域來測試機(jī)器人的回復(fù)是否符合預(yù)期,我們通過邏輯窗口來查看當(dāng)前機(jī)器人的思維邏輯導(dǎo)圖,當(dāng)前機(jī)器人對話的狀態(tài)會(huì)被高量,被命中的規(guī)則呈現(xiàn)為路徑。
機(jī)器人思維邏輯
另外,在設(shè)計(jì)過程中,每次保存自動(dòng)為腳本和函數(shù)生成快照,使用快照下拉列表,我們能方便的回退。
快照管理
多輪對話設(shè)計(jì)器中,業(yè)務(wù)人員可以更專注于對話機(jī)器人的對話邏輯滿足需求。

發(fā)布機(jī)器人

現(xiàn)在,有了可以工作的腳本,我們想發(fā)布一個(gè)版本,這時(shí)回到主面板,點(diǎn)擊“發(fā)布”,填入如下信息,點(diǎn)擊“確認(rèn)”。
發(fā)布機(jī)器人導(dǎo)出機(jī)器人
最終,我們需要得到一個(gè)“服務(wù)”,它能時(shí)刻被訪問,以及和AI音箱集成。我們需要將天氣機(jī)器人導(dǎo)出為對話應(yīng)用,然后部署到智能問答引擎。在主面板,點(diǎn)擊版本管理,我們看到操作中有三項(xiàng)。
  • 對比差異:在多個(gè)版本中比較差異,包括腳本和函數(shù)。
  • 導(dǎo)出:將機(jī)器人導(dǎo)出為對話應(yīng)用文件。
  • 覆蓋:使用這個(gè)版本覆蓋當(dāng)前機(jī)器人,包括腳本和函數(shù)等。
多輪對話設(shè)計(jì)器支持導(dǎo)出機(jī)器人后,極大的方便了分發(fā)和部署。

【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點(diǎn)判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題

蕉岭县| 满洲里市| 和林格尔县| 土默特左旗| 恩施市| 信阳市| 玉林市| 沙坪坝区| 佛山市| 花莲市| 瑞丽市| 普兰店市| 四平市| 和林格尔县| 镇坪县| 筠连县| 昌吉市| 南部县| 同德县| 从江县| 嘉善县| 得荣县| 筠连县| 临猗县| 商水县| 鄢陵县| 昌乐县| 石家庄市| 庆元县| 蒙山县| 黑龙江省| 澄江县| 霍林郭勒市| 望城县| 昭通市| 莲花县| 十堰市| 外汇| 潞城市| 库车县| 青铜峡市|