• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當(dāng)前的位置是:  首頁 > 新聞 > 國內(nèi) >
     首頁 > 新聞 > 國內(nèi) >

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

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


    多輪對話設(shè)計器

    多輪對話設(shè)計器

    概述

    多輪對話設(shè)計器 (Conversation Designer)是以自然語言為輸入,定義聊天機(jī)器人邏輯思維的工具。它可以很方便的通過Chatopera支持的腳本語法描述復(fù)雜的對話邏輯,并且通過函數(shù)的形式集成企業(yè)的其它服務(wù)。企業(yè)的業(yè)務(wù)人員可以很容易的學(xué)習(xí)腳本語法,制作滿足企業(yè)業(yè)務(wù)需求的聊天機(jī)器人。
    多輪對話設(shè)計器是設(shè)計滿足業(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)餐、報銷、請假。這些對話可以在企業(yè)的聊天工具中,也可以通過智能音箱的等其他客戶端。

    安裝

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

    下載地址

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

    啟動應(yīng)用

    • 安裝完打開應(yīng)用程序,如下圖:
    多輪對話設(shè)計器打開后頁面
    可能遇到的問題
    1. Macos上首次啟動警告
    MacOS權(quán)限問題
    解決方案
    在應(yīng)用中心,找到“多輪對話設(shè)計器”:
    應(yīng)用中心
    選擇“多輪對話設(shè)計器”并且右鍵:
    右鍵打開
    點(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 提供天氣查詢功能的對話

    測試示例程序

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

    增加新的對話

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

    保存新版本

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

    各個版本之間比較

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

    導(dǎo)出特定版本

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

    腳本語法

    術(shù)語

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

       

    觸發(fā)器

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

    槽位

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

    通用槽位

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

    確定長度槽位

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

    可控長度槽位

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

    區(qū)間槽位

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

    必選項(xiàng)

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

    可選項(xiàng)

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

    回復(fù)

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

    簡單形式

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

    槽位取值

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

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

    重定向 {@__reply__}

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

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

    多輪對話

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

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

    函數(shù)

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

    總結(jié)

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

    示例應(yīng)用

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

    需求分析

    首先,我們需要梳理一下需求:
    1) 我想知道任意城市的天氣信息,比如“今天上海天氣怎么樣”;
    2) 我還比較關(guān)心空氣,我可以通過“今天上海空氣怎么樣”獲得空氣質(zhì)量信息;
    3) 我想知道今天適不適合戶外運(yùn)動,就問“今天上海適合運(yùn)動么”;
    4) 如果我問了一個城市的天氣狀況,我還想繼續(xù)詢問這個城市更多信息,這樣我不用每次都告訴機(jī)器人城市名稱。
    當(dāng)然,我的每個意圖都有多種表述方式,機(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è)計器后,我們看到如下的面板,我們稱之為主面板。
    和風(fēng)天氣
    點(diǎn)擊新建按鈕,彈出創(chuàng)建機(jī)器人的表單:
    創(chuàng)建聊天機(jī)器人
    填入“小叮當(dāng)”,當(dāng)前多輪對話設(shè)計器支持中文(zh_CN)和英文(en_US),我們選擇“zh_CN”,點(diǎn)擊“確認(rèn)”。然后我們就得到了一個聊天機(jī)器人。
    聊天機(jī)器人
    在操作中,有幾個按鈕:
    • 管理:管理聊天機(jī)器人的多輪對話。
    • 版本管理:管理不同版本的機(jī)器人,導(dǎo)出機(jī)器人和在不同版本之間進(jìn)行比對。
    • 環(huán)境變量:機(jī)器人函數(shù)中依賴的全局變量,這些變量在“設(shè)計對話”的階段和在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)”。這時,我們看到了新建的對話,我們將修改它的內(nèi)容完成天氣對話服務(wù)。
    創(chuàng)建對話
    點(diǎn)擊“編輯”,進(jìn)入對話編輯窗口。在左側(cè)的“腳本區(qū)域”,寫下第一條規(guī)則。
    + 今天 (*) 天氣 [怎么樣]
    - {keep} 天氣挺好的
    點(diǎn)擊“保存”,這時右側(cè)的“邏輯區(qū)域”有了變化,出現(xiàn)了一個線條,在線條左右兩端分別是問題和答案。在“對話區(qū)域”,我們輸入“今天北京天氣怎么樣”,點(diǎn)擊發(fā)送,這時機(jī)器人回復(fù)了。
    對話編輯窗口
    從我們需求上看,這沒什么用,但是它工作了,我們就一點(diǎn)點(diǎn)優(yōu)化它。對于在這條規(guī)則中,我們使用的語法,(*)代表一個槽位,代表在回復(fù)中取槽位的值,[怎么樣]是可有的字符串,{keep}代表這條規(guī)則始終生效,keep涉及到對話的狀態(tài)管理,我們將在文檔中提供更多規(guī)則的描述,現(xiàn)在,讀者看懂本示例就可以了。

    添加函數(shù)

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

    使用環(huán)境變量

    在上面的函數(shù)中,我們有一個敏感的信息:和風(fēng)天氣的API密鑰。在實(shí)際應(yīng)用中,我們希望設(shè)計階段部署階段,它的值是不同的。這時,就需要使用環(huán)境變量,環(huán)境變量正是為解決這個問題而設(shè)計的。
    回到主面板,在“小叮當(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是一個包含環(huán)境變量的JSON數(shù)據(jù)。所以,我們更加利于將來部署對話應(yīng)用了。

    支持更多對話

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

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

    // 天氣

    + 今天 (*) 天氣 [怎么樣]
    - {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)動

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

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

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

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


    // 衣著

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

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

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


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

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

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

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

    專題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 屯门区| 望江县| 甘谷县| 芮城县| 德惠市| 东源县| 松桃| 绵竹市| 尚义县| 龙江县| 靖宇县| 伊通| 高清| 宁河县| 常山县| 沙洋县| 阳西县| 安徽省| 连云港市| 开封县| 土默特左旗| 玉环县| 西和县| 新宁县| 隆化县| 渝北区| 宜城市| 本溪| 泸州市| 土默特左旗| 正宁县| 淳安县| 威远县| 五台县| 扶余县| 蓬莱市| 马尔康县| 丽江市| 汉中市| 乌兰县| 红河县| http://444 http://444 http://444 http://444 http://444 http://444