DuerOS中的代理機(jī)制
代理,在架構(gòu)設(shè)計中是一種常見的機(jī)制,在DuerOS 開發(fā)平臺(DuerOS Bot Platform,DBP)中的設(shè)計同樣如此。在《當(dāng)你問代理機(jī)制的時候?指的是Agent,Proxy,Broker還是Delegate呢?》談到了4種代理機(jī)制,在DBP中使用的是哪些代理機(jī)制呢?
Bot Delegate
Delegate 是委托性或者指派性代理,一般地,管理進(jìn)程指派給代理方,并在代理方執(zhí)行管理操作,而不涉及管理方。Delegate 不具備自主移動的能力,需要借助外力,通過指派協(xié)議從一個地址空間移動到另一個地址空間。只要需要Delegate 執(zhí)行任務(wù),它就一直處于執(zhí)行狀態(tài)。
在DBP 中,開發(fā)者用到的哪個功能使用了Delegate 代理機(jī)制呢?
意圖測試
開發(fā)者在DBP 開發(fā)技能的時候,在創(chuàng)建意圖之后,可以測試該意圖能否被DuerOS爭取召回。

具體在在DBP的控制臺“意圖”頁面,可以輸入query,就可以看到DuerOS 召回的意圖結(jié)果。這個功能就是通過DBP 的bot delegate 實現(xiàn)的。
在《一個Bot的自白》中我們了解到, DuerOS 通過bot 協(xié)議與技能進(jìn)行通信,而在開發(fā)者配置意圖的時候可能還沒有創(chuàng)建物理bot,那么難道DuerOS用了什么特殊的技巧來召回開發(fā)者測試的意圖么?實際上,DuerOS 為了保證架構(gòu)的一致性,仍然采用了bot 協(xié)議,只不過通信的對象是Bot Delegate,由 Bot Delegate 代理了開發(fā)者的測試請求,扮成了一個bot 的模樣與DuerOS進(jìn)行通信,然后將DuerOS 的召回結(jié)果返回給了開發(fā)者。
另外,在DuerOS目前的6個對話指令中,Dialog.Delegate指令也采用了委托式代理,將對話指派給DuerOS完成,DuerOS的詢問和確認(rèn)槽位的話術(shù)使用的是開發(fā)者在技能開放平臺默認(rèn)配置的話術(shù)。例如,在查詢個人所得稅場景中,因為需要填寫多個槽位,開發(fā)者可以在技能開放平臺配置默認(rèn)的填槽話術(shù),并將整個會話過程代理給DuerOS。DuerOS會自動詢問和確認(rèn)必要的槽位或意圖。會話中,每一輪與用戶的交互結(jié)果都會返回給技能,技能可以根據(jù)自身資源決定下一輪是否繼續(xù)代理過程。
Bot Proxy
Proxy是一種透傳性代理,是為了能有效地訪問遠(yuǎn)程服務(wù)或其他代理。這里的“遠(yuǎn)程”并非一定是地域上的遠(yuǎn)近, 而是涉及網(wǎng)絡(luò)拓?fù)浠蛴嬎銖?fù)雜度上的成本。
DuerOS 系統(tǒng)自身有很多的bot,例如鬧鐘,天氣預(yù)報,音樂,音視頻播放等等,還支持了成千上萬第三方bot,即合作伙伴開發(fā)的技能服務(wù)。為了從架構(gòu)層面縮小故障域以及安全隔離,Bot Proxy 承擔(dān)起了 DuerOS 與 第三方Bot 之間的代理職責(zé)。
也就是說,用戶的請求到達(dá)DuerOS系統(tǒng),DuerOS 系統(tǒng)完成自然語言理解及相關(guān)處理后,將請求以結(jié)構(gòu)化數(shù)據(jù)的形式通過Bot Proxy 發(fā)送給開發(fā)者的bot。開發(fā)者的Bot響應(yīng)這些請求,也是通過Bot Proxy 返回給DuerOS,并最終返回給終端用戶的。
那么,Bot Proxy 如何知道將哪些請求發(fā)送給哪些bot呢?開發(fā)者在部署技能服務(wù)的時候,需要明確物理bot 的主機(jī)地址:

在技能通過審核之后,開發(fā)者申請上線,Bot的服務(wù)部署地址以及相關(guān)屬性會注冊到 Bot Proxy。當(dāng)DuerOS 發(fā)送用戶用戶請求的時候,會智能地給出Bot ID,Bot Proxy 根據(jù)Bot ID 映射到對應(yīng)的服務(wù)地址,進(jìn)而建立連接,透傳請求。同理, 當(dāng)技能下線的時候, Bot Proxy 會從bot的注冊表中摘除對于的Bot id 及相關(guān)屬性。
另外,技能服務(wù)的健康檢查也是通過Bot Proxy 完成的。根據(jù)一個周期性的策略,Bot Proxy 會從DuerOS 系統(tǒng)的多個機(jī)房,通過 http 的 head 方法,完成對開發(fā)者技能服務(wù)的探活。很多開發(fā)者在提交技能上線,會遇到一個錯誤提示“請檢查部署地址是否支持https 和head 請求”,處于安全性考慮,支持https是很容易理解的,而對head 請求的要求就是處于對Bot Proxy 進(jìn)行健康檢查的需要。
Bot Broker
Broker 是一種中介性代理。在網(wǎng)絡(luò)與分布計算中, 兩個層次上的對等實體, 若不便彼此直接交往, 則可通過Broker實現(xiàn)通信。這些可以有各種各樣的定義和實現(xiàn), 也表現(xiàn)在不同的層次上。簡單一點, Broker提供了分布式服務(wù)和資源的透明訪問,屏蔽了異構(gòu)組件之間的差異。
“來而不往非禮也”,如果開發(fā)者的技能需要直接訪問DuerOS怎么辦呢?
先看看有哪些典型的應(yīng)用場景:
請求用戶地理位置權(quán)限
請求用戶打印機(jī)設(shè)備服務(wù)權(quán)限
請求用戶百度賬號信息權(quán)限
定時提醒服務(wù)
例如,當(dāng)開發(fā)者的技能服務(wù)需要獲取用戶的相關(guān)信息的時候,在交互中用戶完成授權(quán)后,bot會主動發(fā)送請求到DuerOS請求相應(yīng)的用戶信息。
那么,這時候Bot 是直接與DuerOS 通信么?當(dāng)然不是。
出于安全性的考量,DuerOS 引入了Bot Broker。Bot Broker 與Bot 之間進(jìn)行安全通信,采用了PKI的安全機(jī)制, 這就是開發(fā)者在開發(fā)相關(guān)特性是在DBP 的控制臺設(shè)置鑒權(quán)加密的原因。

關(guān)于與Bot Broker 安全通信的相關(guān)內(nèi)容,可以參考《放心用吧!淺談DuerOS的安全性》。
另一個典型的應(yīng)用場景是推送服務(wù)。DBP開放平臺向開發(fā)者開放了技能內(nèi)推送機(jī)制,技能內(nèi)推送意味著開發(fā)者能夠在用戶的會話周期內(nèi),調(diào)用推送接口向設(shè)備端推送相關(guān)內(nèi)容或協(xié)議。目前DBP平臺提供了兩大類的推送,分別為文本和BOT協(xié)議。文本又分為純文本,使用該類型將在設(shè)備端底部展示一個通知,同時內(nèi)容為文本內(nèi)容;另一種是TTS,設(shè)備端將用語音播報相關(guān)的TTS;BOT協(xié)議提供了更豐富的設(shè)備端內(nèi)容展示的情景。當(dāng)然, 推送服務(wù)也是由DuerOS Broker 來承載的。
Bot Agent
Agent是分布智能的基礎(chǔ)單元。它具有一定程度的獨立行為能力與智能,同時又遵從分布系統(tǒng)中某種統(tǒng)一的標(biāo)準(zhǔn)。在分布式環(huán)境中,Agent 可以和客戶端不在一臺主機(jī)上。
不論是bot broker 和 bot proxy,還是 bot delegate,都是DBP 平臺中的一個子系統(tǒng)。那么, 在DBP 平臺中有bot Agent 么?答案是 有的。
在《DuerOS的零編程技能實現(xiàn)》中談了小技能,就是通過Bot Agent機(jī)制實現(xiàn)的。小技能是DuerOS 平臺自動為用戶生成的技能,在限定交互場景之后,開發(fā)者只需提供內(nèi)容,即可在小度系列的智能語音設(shè)備上播放這些內(nèi)容。目前小技能功能包括話術(shù)類、音頻類,圖片類和視頻類的小技能,播放方式約定為順序播放,隨機(jī)播放和播放一個之后關(guān)閉。DBP中的小技能bot agent面對的是用戶需求固定的資源,并且用戶與技能的交互形式相對固定,如僅需要“再來一個”、“跳過”、“下一個”、“上一個”等切換資源內(nèi)容的話術(shù),bot agent通過類似工廠模式那樣更加開發(fā)者的輸入動態(tài)生成bot并關(guān)聯(lián)這些小技能。類似的應(yīng)用場景很多,如講個故事,播放音樂,播放視頻等。
當(dāng)然,DuerOS 內(nèi)部還有很多模塊涉及到了代理機(jī)制,由于不是開發(fā)者直接可見的,就不一一介紹了。
DuerOS 的近期彩蛋
“懂暢有快”一直是DuerOS 追求的目標(biāo),就在上個月,DuerOS 可以更“懂”用戶的說話了。DuerOS的開發(fā)者們可以在DBP 平臺在意圖配置頁面 勾選“深度模型”,就可以得到更好的用戶體驗了, 歡迎咱們可愛的開發(fā)者們使用,感謝大家為DuerOS用戶帶來的便捷與快樂!

【關(guān)聯(lián)閱讀】
