• <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>
    您當前的位置是:  首頁(yè) > 新聞 > 國內 >
     首頁(yè) > 新聞 > 國內 >

    Chatopera多輪對話(huà)設計器

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


    多輪對話(huà)設計器

    多輪對話(huà)設計器

    概述

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

    安裝

    僅支持Mac OSX和Windows操作系統。

    下載地址

    下載地址:
    https://www.chatopera.com/product/conversation-designer
    • MacOS:dmg為文件后綴的安裝文件,雙擊打開(kāi),根據安裝向導安裝。
    • Windows:exe為文件后綴可執行文件,雙擊打開(kāi),根據安裝向導安裝。

    啟動(dòng)應用

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

    快速開(kāi)始

    下載安裝包后,雙擊打開(kāi),進(jìn)入安裝向導。
    安裝完打開(kāi)應用圖標后進(jìn)入主面板,如下圖:
    應用主面板
     

    導入示例程序

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

    測試示例程序

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

    增加新的對話(huà)

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

    保存新版本

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

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

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

    導出特定版本

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

    腳本語(yǔ)法

    術(shù)語(yǔ)

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

       

    觸發(fā)器

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

    槽位

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

    通用槽位

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

    確定長(cháng)度槽位

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

    可控長(cháng)度槽位

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

    區間槽位

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

    必選項

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

    可選項

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

    回復

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

    簡(jiǎn)單形式

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

    槽位取值

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

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

    重定向 {@__reply__}

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

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

    多輪對話(huà)

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

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

    函數

    函數是一個(gè)強大而有趣的設計。在回復中,可以使用函數來(lái)獲取整條消息對象,用戶(hù)對象或者其它資源,比如數據庫。把槽位值當做變量傳給函數,例如下面這個(gè)例子:
    + 我的用戶(hù)名是 *(2-10)
    - ^getUserAccount()
    所以,調用函數的方式就是使用“^”。在函數的編輯窗口中,可以這樣定義:
    exports.getUserAccount(account, cb) {
      cb(null, "對不起,系統沒(méi)有找到" + account);
    }
    函數的聲明中,參數列表首先是槽位的值,可以傳多個(gè),然后最后一個(gè)參數始終是回調函數(cb),cb的參數列表為(error, text)。text作為文本添加到回復中。

    復合函數

    在回復中,可以添加任意多的函數,比如
    + ...
    - 聯(lián)合 ^callFunction1() 和 ^callFunction2()

    嵌套函數

    在函數的回調函數中,函數名會(huì )被解析成對應的函數,所以放心的在回復中添加任意合法的函數,比如在腳本中這樣寫(xiě):
    + ...
    - ^nestedAFunction()
    然后,在函數中,定義如下:
    exports.nestedAFunction = function(cb) {
      cb(null, "張三 ^nestedBFunction()");
    }
    exports.nestedBFunction = function(cb) {
      cb(null, "和李四");
    }

    總結

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

    示例應用

    本節介紹使用多輪對話(huà)設計器實(shí)現一個(gè)“聊天機器人”的具體過(guò)程。我們以實(shí)現天氣問(wèn)答機器人為例,我們選擇這個(gè)場(chǎng)景并不是因為它簡(jiǎn)單,而是因為它容易理解,使用多輪對話(huà)設計器可以實(shí)現更復雜,更有價(jià)值的應用。我們先一睹為快,這個(gè)機器人是什么樣子的。
    視頻:天氣查詢(xún)機器人Demo
    是不是很實(shí)用?如果你掌握了多輪對話(huà)設計器,就可以實(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)題不夠嚴謹,機器人還應該提醒我合理的表達。

    調研提供天氣信息查詢(xún)的API

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

    第一條規則

    第一次打開(kāi)多輪對話(huà)設計器后,我們看到如下的面板,我們稱(chēng)之為主面板。
    和風(fēng)天氣
    點(diǎn)擊新建按鈕,彈出創(chuàng )建機器人的表單:
    創(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ù)。
    創(chuàng )建對話(huà)
    點(diǎn)擊“編輯”,進(jìn)入對話(huà)編輯窗口。在左側的“腳本區域”,寫(xiě)下第一條規則。
    + 今天 (*) 天氣 [怎么樣]
    - {keep} 天氣挺好的
    點(diǎn)擊“保存”,這時(shí)右側的“邏輯區域”有了變化,出現了一個(gè)線(xiàn)條,在線(xiàn)條左右兩端分別是問(wèn)題和答案。在“對話(huà)區域”,我們輸入“今天北京天氣怎么樣”,點(diǎn)擊發(fā)送,這時(shí)機器人回復了。
    對話(huà)編輯窗口
    從我們需求上看,這沒(méi)什么用,但是它工作了,我們就一點(diǎn)點(diǎn)優(yōu)化它。對于在這條規則中,我們使用的語(yǔ)法,(*)代表一個(gè)槽位,代表在回復中取槽位的值,[怎么樣]是可有的字符串,{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}的信息。`
                })
            })
    }
    在函數中,我們實(shí)現了根據城市請求天氣、空氣質(zhì)量、著(zhù)裝建議和運動(dòng)建議的接口,分別是getWeatherByCity,getAirByCity,getDresscodeByCity和getSportByCity。
    細心的讀者會(huì )發(fā)現,在函數中,多輪對話(huà)設計器直接支持了http,debug作為工具類(lèi),發(fā)起網(wǎng)絡(luò )請求和輸出日志信息。這兩個(gè)接口極大的擴展了函數的能力,我們也會(huì )在函數中詳細描述它們的使用。
    然后,回到“腳本區域”,修改一下規則,更新如下:
    + 今天 (*) 天氣 [怎么樣]
    - {keep} ^getWeatherByCity()
    在回復中,我們調用了getWeatherByCity,并且傳入了城市名稱(chēng)。 接著(zhù),在“對話(huà)區域”,輸入“今天北京天氣怎么樣”,回復與上次不一樣了。
    測試對話(huà)
    這次,我們看到了期望的回復,正是從和風(fēng)天氣返回的北京今天的天氣狀況。

    使用環(huán)境變量

    在上面的函數中,我們有一個(gè)敏感的信息:和風(fēng)天氣的API密鑰。在實(shí)際應用中,我們希望設計階段部署階段,它的值是不同的。這時(shí),就需要使用環(huán)境變量,環(huán)境變量正是為解決這個(gè)問(wèn)題而設計的。
    回到主面板,在“小叮當”操作中,點(diǎn)擊環(huán)境變量,創(chuàng )建如下鍵值對:
    設置環(huán)境變量
    讀者可以從和風(fēng)天氣獲得該密鑰,為驗證用途,可以粘貼下面的值:
    "HEWEATHER_URL": "https://free-api.heweather.com/v5",
    "HEWEATHER_KEY": "182f1b6826d94c6285a489d2414f3ad0"
    保存后,回到天氣對話(huà)腳本的“對話(huà)編輯窗口”,在函數中,使用下面的腳本:
    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)足需求的腳本呈現如下:
    // 技能介紹

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

    // 天氣

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

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

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

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


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


    // 空氣

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

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

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

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


    // 運動(dòng)

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

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

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

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


    // 衣著(zhù)

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

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

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


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

    發(fā)布機器人

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

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

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 南充市| 韶山市| 鹿邑县| 乌鲁木齐县| 湖北省| 桂阳县| 县级市| 军事| 将乐县| 长寿区| 沈丘县| 交口县| 马公市| 资中县| 玉山县| 新巴尔虎左旗| 鹰潭市| 翁源县| 天祝| 黎平县| 西平县| 沙洋县| 中阳县| 平顺县| 焦作市| 临夏县| 临漳县| 漯河市| 蒲江县| 乌什县| 黔西| 奈曼旗| 汉沽区| 上虞市| 杭州市| 长丰县| 青田县| 宁晋县| 林周县| 神木县| 丰顺县| http://444 http://444 http://444 http://444 http://444 http://444