超級(jí)APP手機(jī)百度怎么做云端架構(gòu)設(shè)計(jì)和個(gè)性化?
2015 年 6 月 28 日下午,百度與 InfoQ 攜手舉辦了手機(jī)百度“云和端技術(shù)實(shí)踐”沙龍活動(dòng)。這是手機(jī)百度首次公開(kāi)超級(jí) App 背后的技術(shù)知識(shí)?;顒?dòng)分云端和客戶端技術(shù)兩個(gè)會(huì)場(chǎng)同時(shí)舉辦,吸引了眾多技術(shù)愛(ài)好者前來(lái)學(xué)習(xí)交流。現(xiàn)場(chǎng)人數(shù)爆滿,氣氛熱烈。
手機(jī)百度產(chǎn)品總經(jīng)理,百度副總監(jiān)黎科峰出席會(huì)議并簡(jiǎn)要介紹了手機(jī)百度的業(yè)務(wù)狀況和講師團(tuán)隊(duì)成員。他談到,手機(jī)百度作為百度在移動(dòng)互聯(lián)網(wǎng)時(shí)代的億級(jí)用戶流量入口,不僅支撐著百度內(nèi)部產(chǎn)品,更希望打造一個(gè)開(kāi)放平臺(tái),支撐眾多第三方行業(yè)及應(yīng)用的發(fā)展,從連接人與信息拓展到連接人與服務(wù)。比如打開(kāi)手機(jī)百度就可以看到9塊9 上門(mén)推拿服務(wù)。手機(jī)百度的未來(lái)應(yīng)用前景擁有很大的想象空間,在云端和移動(dòng)客戶端技術(shù)業(yè)務(wù)的實(shí)現(xiàn)上也積累了很多寶貴經(jīng)驗(yàn)和創(chuàng)新實(shí)踐!
下面是此次技術(shù)沙龍活動(dòng)云端分會(huì)場(chǎng)的主題演講概要總結(jié):
主題一:個(gè)性化在手機(jī)百度中的實(shí)踐(蘭田)
手機(jī)百度是一個(gè)超級(jí) app , 不僅為用戶提供搜索服務(wù),而是覆蓋了用戶生活的各個(gè)方面。挑戰(zhàn)是非常多的,首先用戶獲取信息成本不斷增高,在時(shí)間和流量有限的情況下,如何能夠滿足使用各種垂類信息(小說(shuō),視頻),各種團(tuán)購(gòu),各種app, 各種O2O服務(wù)。然后是用戶多種多樣,需要對(duì)不同的用戶進(jìn)行場(chǎng)景化和個(gè)性化的運(yùn)營(yíng)和推送。主題先介紹了個(gè)性化任務(wù)在手百上的愿景:希望每個(gè)用戶的手機(jī)百度都是獨(dú)一無(wú)二的,用戶可以最快捷,最有效的發(fā)現(xiàn)此時(shí)此刻最適合自己的信息和服務(wù)。主題從移動(dòng)用戶的畫(huà)像(Profile)談起,進(jìn)而介紹了傳統(tǒng)的推薦算法,然后探討了移動(dòng)端給推薦帶來(lái)的機(jī)會(huì),之后以百度生活頻道采用的推薦作為案例講解,最后展望了手百個(gè)性化系統(tǒng)的未來(lái)。
手百個(gè)性化在設(shè)計(jì)的時(shí)候就考慮了精準(zhǔn)豐富的用戶標(biāo)簽,包括用戶本身的信息,如性別、年齡、職業(yè)、教育與消費(fèi)等,還有用戶的目的如興趣、關(guān)注、需求。豐富的標(biāo)簽在手百的實(shí)際使用中起到很重要的作用,可以進(jìn)行卡片推薦,幫助個(gè)性化解決冷啟動(dòng)問(wèn)題,幫助產(chǎn)品更加了解用戶的需求,幫助運(yùn)營(yíng)選擇特定興趣用戶并進(jìn)一步推薦相關(guān)運(yùn)營(yíng)活動(dòng)。蘭田給出了對(duì)95后用戶行為分析的例子,展現(xiàn)了95后用戶對(duì)游戲和動(dòng)漫更感興趣,而95前用戶則對(duì)購(gòu)物和美食等話題更感興趣。
主題接下來(lái)介紹了傳統(tǒng)的推薦系統(tǒng),從用戶行為出發(fā),根據(jù)用戶和用戶,item和item之間的各種關(guān)聯(lián)為用戶做出推薦,主要有兩種形式,一個(gè)是相關(guān)推薦,另一個(gè)是列表推薦,目前在手百上的應(yīng)用主要是視頻和小說(shuō)兩個(gè)垂直應(yīng)用。特別地,蘭田講解了相似性這一推薦系統(tǒng)的基石,從亞馬遜2003年提出的協(xié)同過(guò)濾入手,簡(jiǎn)要介紹了空間中相距近的點(diǎn)具有相同性質(zhì)這一樸素概念,并給出了概率解釋。隨后他介紹了常用的相似度量,分析了優(yōu)缺點(diǎn)。如基于用戶的計(jì)算量大,但可以帶來(lái)新穎的推薦,基于item的計(jì)算量相對(duì)小,是大多數(shù)推薦系統(tǒng)采用的度量方式,而基于內(nèi)容的可解決冷啟動(dòng)問(wèn)題,但需要專家知識(shí)。目前手百采用的是item+內(nèi)容相結(jié)合的度量方式。
主題接下來(lái)給出了手百推薦系統(tǒng)的現(xiàn)有架構(gòu)如下圖:
從圖中可以看出整個(gè)架構(gòu)非常靈巧松散,模塊之間都是通過(guò)API連接,可以進(jìn)行比較靈活的配置。底層機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘相關(guān)方法構(gòu)建在Hadoop之上,輸入有統(tǒng)計(jì)和行為數(shù)據(jù),而輸出則通過(guò)推薦算法的計(jì)算由推薦API給出。
手百推薦系統(tǒng)有兩大難點(diǎn),一是用戶數(shù)量極大,離線訓(xùn)練模型規(guī)模大,一周有千萬(wàn)數(shù)量級(jí)。二是需要整合多個(gè)資源方的內(nèi)容,需要在數(shù)據(jù)合并和清洗上做大量工作,保證資源的質(zhì)量。但與此同時(shí),手百具有相當(dāng)大的兩個(gè)優(yōu)勢(shì),一是百度內(nèi)部機(jī)器學(xué)習(xí)資源豐富,有易用的并行框架。處理過(guò)億的三元組,可以在10分鐘內(nèi)搞定。二是百度有大量的用戶搜索數(shù)據(jù)和用戶畫(huà)像數(shù)據(jù),可以幫助用戶更好的進(jìn)行冷啟動(dòng)。
與傳統(tǒng)的pc端相比,移動(dòng)端對(duì)推薦系統(tǒng)的需求更大,比如由于屏幕小,顯示空間有限等原因,就需要更精準(zhǔn)的推薦。另外,用戶信息更容易收集,因?yàn)闊o(wú)需登錄,且使用頻率很高,各方面數(shù)據(jù)的反饋都更加及時(shí)。以及,移動(dòng)端固有的特點(diǎn)可以為推薦系統(tǒng)引入更多的緯度,如時(shí)間地點(diǎn)和使用場(chǎng)景等。
主題隨后介紹了推薦系統(tǒng)的演變,從單純的評(píng)分到排序,到頁(yè)面優(yōu)化最后到基于上下文的推薦,越來(lái)越多地引入更多的特征,以尋求更加精準(zhǔn)的推薦結(jié)果。主題還進(jìn)一步介紹了一些推薦算法,如Point-wise、Pairwise 等排序?qū)W習(xí)的算法。
接下來(lái),主題給出了一個(gè)推薦系統(tǒng)在O2O領(lǐng)域的嘗試,試圖通過(guò)手百建立人和服務(wù)的連接,所采用的資源來(lái)自糯米,地圖和直達(dá)號(hào)等多個(gè)第三方服務(wù),給出的實(shí)例框架圖如下:
針對(duì)在推薦系統(tǒng)中使用場(chǎng)景的問(wèn)題,主題給出了人工匹配規(guī)則,修正然后作為特征加入學(xué)習(xí)算法的技術(shù)方案。具體來(lái)講,人工配置規(guī)則 (專家知識(shí)),由 PM和運(yùn)營(yíng)人工配置了近百條規(guī)則,由規(guī)則引擎根據(jù)場(chǎng)景和用戶畫(huà)像進(jìn)行匹配。人工規(guī)則作為先驗(yàn)概率,和熱門(mén)推薦點(diǎn)擊率相當(dāng),用戶實(shí)際點(diǎn)擊和常識(shí)并不一樣。然后利用用戶實(shí)際點(diǎn)擊情況修正規(guī)則。將用戶實(shí)際點(diǎn)擊修正先驗(yàn)概率,效果比人工配置提高 0.5% 左右。最后將場(chǎng)景作為特征,融入到機(jī)器學(xué)習(xí)算法中。機(jī)器學(xué)習(xí)算法還涉及到一個(gè)特征選擇問(wèn)題,目前手百所用的特征包括但不限于用戶、物料和場(chǎng)景等特征,而采用的算法除了常用的邏輯回歸以外,還有最近業(yè)界尤其是圖像領(lǐng)域常用的深度學(xué)習(xí)網(wǎng)絡(luò)模型。根據(jù)模型輸出的概率值對(duì)推薦結(jié)果進(jìn)行重新排序,在融入場(chǎng)景特征后,發(fā)現(xiàn)效果提升了 2%。
主題接下來(lái)探討了從推薦向個(gè)性化發(fā)展的問(wèn)題。推薦只是個(gè)性化的一種形式,不是所有的個(gè)性化都是推薦(買(mǎi)電影票的時(shí)候,幫助我選擇我經(jīng)常訂的位置 )?,F(xiàn)有推薦系統(tǒng)大多是幫助用戶發(fā)現(xiàn)某種商品/服務(wù),個(gè)性化有更廣泛的產(chǎn)品含義,可以具體到背景皮膚的選擇,產(chǎn)品 tag 的位置。這方面手百以個(gè)性化卡片為入口做了一些嘗試,產(chǎn)品目的是豐富手機(jī)百度首屏的內(nèi)容,將用戶日常關(guān)注的內(nèi)容用卡片的形式展現(xiàn)出來(lái)。通過(guò)個(gè)性化的推薦引導(dǎo)用戶添加。和傳統(tǒng)的推薦不同,卡片數(shù)目少,且興趣點(diǎn)基本上是熱點(diǎn)興趣(傳統(tǒng)推薦是頭部+長(zhǎng)尾)??ㄆg關(guān)聯(lián)關(guān)系弱,無(wú)法進(jìn)行協(xié)同過(guò)濾。會(huì)根據(jù)PM 和運(yùn)營(yíng)需求,隨時(shí)添加卡片,需要把這個(gè)卡片推送給最合適的用戶。需要不斷的挖掘用戶新的特征。需要挖掘用戶的興趣,最近的意圖,人生階段等各個(gè)方面。因此需要通過(guò)用戶畫(huà)像和產(chǎn)品屬性進(jìn)行規(guī)則匹配。
主題最后對(duì)手百推薦和個(gè)性化的未來(lái)做了展望,更完善的推薦系統(tǒng)框架。及時(shí)反饋,更迅速的響應(yīng)用戶的行為。做出最及時(shí)的推薦。更好的推薦效果展示和算法控制平臺(tái)。進(jìn)一步研究場(chǎng)景在推薦系統(tǒng)中的作用。引入更多的機(jī)器學(xué)習(xí) model,研究深度學(xué)習(xí)在推薦系統(tǒng)中的應(yīng)用。甚至提到了更遠(yuǎn)的類似 Google Now 的個(gè)人生活助手產(chǎn)品。
主題二:手機(jī)百度云端架構(gòu)設(shè)計(jì)與實(shí)踐(韓超 & 黎博)
主題主要介紹了手百云端在實(shí)際開(kāi)發(fā)過(guò)程中一些工程化的運(yùn)用,尤其是涉及傳統(tǒng)PHP工程師做web網(wǎng)站和超級(jí)APP的技術(shù)轉(zhuǎn)型和深化的過(guò)程。
主題首先分析了目前手百云端所面對(duì)的問(wèn)題,鑒于手百非純粹客戶端,而是瀏覽器和CS模式混合的產(chǎn)品,所面對(duì)的主要可分為三個(gè)問(wèn)題:軟件高并發(fā)、大容量,需要高靈活性和可靠性,然后還需要解決由于定制化程度高而帶來(lái)的兼容性問(wèn)題。對(duì)此,主題給出了一個(gè)多層解決方案,底層包含資源的云端聚合、不同功能的Cache和多種DB。中間層包含動(dòng)態(tài)界面展示、用戶賬戶狀態(tài)承載、多協(xié)議多平臺(tái)支持和信息主動(dòng)送達(dá)。上層則包括配置和運(yùn)營(yíng),H5和NA并存支持以及客戶端的動(dòng)態(tài)更新。傳統(tǒng)的Web網(wǎng)站的構(gòu)建中,LAMP架構(gòu)中的PHP+MySql+緩存已經(jīng)有了成熟理論和實(shí)踐。作為超級(jí)APP的服務(wù)器工程師,需要繼承Web網(wǎng)站的技術(shù)底蘊(yùn),并針對(duì)自身特性做出改進(jìn)。這種改進(jìn)主要來(lái)自三方面:性能優(yōu)化、兼容擴(kuò)展性和云端控制性。
主題開(kāi)始講解了性能優(yōu)化的部分,性能是任何服務(wù)器設(shè)計(jì)必須考慮的問(wèn)題,面對(duì)超級(jí)APP帶來(lái)的高QPS、峰值的高并發(fā)、不確定的寫(xiě)請(qǐng)求,系統(tǒng)不可能無(wú)限制地?cái)U(kuò)容,軟件設(shè)計(jì)要先行。Web網(wǎng)站性能優(yōu)化的N種武器,要換一種方式用起來(lái)。需要考慮兩方面的因素,一是服務(wù)器的容量,服務(wù)器端有限的CPU、 IO和內(nèi)存會(huì)面對(duì)無(wú)限的客戶端,壓力會(huì)傳遞給數(shù)據(jù)存儲(chǔ)、緩存、后端服務(wù),云端的每一個(gè)環(huán)節(jié)都有可能被壓垮。二是用戶體驗(yàn),從前做Web網(wǎng)站,現(xiàn)在做 Native客戶端。Native并非天然就比Web網(wǎng)站快,因?yàn)闉g覽器和服務(wù)器的優(yōu)化手段已經(jīng)很成熟。性能優(yōu)化部分本主題講的比較深入,主要涉及了 Page緩存、緩存協(xié)商和請(qǐng)求合并等,具體讀者可參考幻燈片。
主題接下來(lái)分享了兼容和擴(kuò)展性方面的內(nèi)容,一個(gè)超級(jí)APP的服務(wù)器,它所面臨開(kāi)發(fā)模型并不是一個(gè)點(diǎn)對(duì)點(diǎn)的開(kāi)發(fā),而是一個(gè)基于時(shí)間軸的矩陣,這就涉及兩方面內(nèi)容,一個(gè)方面客戶端本身在升級(jí),因此服務(wù)器在升級(jí)的時(shí)候,需要兼容歷史所有的客戶端,并且還要向未來(lái)進(jìn)行展望。更復(fù)雜的是客戶端本地還有豐富的存儲(chǔ),升級(jí)過(guò)程中也需要考慮,里面包含了一些不可控的因素,尤其是這種多版本多平臺(tái)的情況下。手百在這方面有幾個(gè)策略,首先服務(wù)端被動(dòng)兼容的條件是客戶端的特性可知,通過(guò)客戶端自身的信息進(jìn)行兼容,例如:操作系統(tǒng)、版本號(hào)、渠道等。然后是代碼分支方式,把穩(wěn)定基礎(chǔ)性功能分成不同的模塊,找到邏輯上需要區(qū)分的地方,由上層代碼對(duì)基礎(chǔ)功能組合調(diào)用。再有資源獲取,調(diào)整后端請(qǐng)求、持久化存儲(chǔ)、緩存的獲取順序,便于排列組合和再處理。還有特制化邏輯,了解客戶端的現(xiàn)實(shí)分布和業(yè)務(wù)情況,利用參數(shù)預(yù)處理篩選功能,對(duì)結(jié)果通過(guò)用個(gè)性化參數(shù)進(jìn)行調(diào)整、過(guò)濾和合并。最后是緩存策略,提高Cache的命中率和Cache使用效率;
主題最后一部分討論了云端可控性的問(wèn)題。由于客戶端APP的固有特點(diǎn),不可強(qiáng)制要求用戶手中的客戶端版本,從超級(jí)APP的功能上,要突破此瓶頸,在客戶端不升級(jí)的情況下,實(shí)現(xiàn)云端可控的特性。主要包括三方面,一是動(dòng)態(tài)展示,根據(jù)需要將最新的數(shù)據(jù)、樣式、界面送達(dá)給用戶。二是動(dòng)態(tài)事件和行為,服務(wù)端產(chǎn)生的事件可送達(dá)客戶端(客戶端拉取或服務(wù)端推送),可控制客戶端的各種行為。三是動(dòng)態(tài)的配置和策略,服務(wù)器上具有動(dòng)態(tài)配置和策略,客戶端通過(guò)獲得之后,根據(jù)自身的情況進(jìn)行實(shí)施。
主題給出了手百云端的技術(shù)架構(gòu)如下圖,主要解決了幾個(gè)業(yè)務(wù)特性帶來(lái)的挑戰(zhàn)。一個(gè)是軟件生命周期較長(zhǎng)。二是高并發(fā)且流量不均。三是資源鏈接眾多且不穩(wěn)定。四是需求比較復(fù)雜。更多關(guān)于云端開(kāi)發(fā)調(diào)試的手段和技巧可參見(jiàn)后續(xù)視頻與幻燈片資料。
主題三:手機(jī)百度前端探索之路(夏藝天)
主題主要分享了手百的前端探索之路,從開(kāi)發(fā)到工程,再到發(fā)布的整個(gè)過(guò)程。典型的小團(tuán)隊(duì)開(kāi)發(fā),利用Zepto、OpenJs等類庫(kù),在合理的組織下,撐起了手百的前端開(kāi)發(fā)。
第一部分是開(kāi)發(fā)環(huán)節(jié)。主要介紹了SASS框架,講解了手百如何針對(duì)SASS進(jìn)行改造和定制,并開(kāi)發(fā)了模擬客戶端的環(huán)境。在基礎(chǔ)類庫(kù)方面,Zepto是用的比較多的構(gòu)件?;A(chǔ)部分還包括了基于EMD模塊的實(shí)現(xiàn),以及模塊間、事件和跨域通信等。其他類目包括UI組件、監(jiān)控、統(tǒng)計(jì)和運(yùn)營(yíng)等等。在此基礎(chǔ)上,手百前端團(tuán)隊(duì)對(duì)一些常見(jiàn)的東西給出了解決方案,一個(gè)是前端的模板,二是本地緩存方案,三是SPA(單頁(yè)面應(yīng)用解決方案)。
第二部分是工程化。所謂的工程化,一開(kāi)始前端可能做的功能化是類似于手動(dòng)的去壓縮代碼,現(xiàn)在有了很多工程化的解決方案,手機(jī)百度工程化是用公司統(tǒng)一的FIS集成方案,同時(shí)對(duì)FIS的插件進(jìn)行改造,通過(guò)這些東西可以完成以上的全部的工作,以及更多的比如依賴分析、代碼檢測(cè),按需加載,代碼檢測(cè)代碼的規(guī)范,還有緩存、壓縮、合并最后達(dá)到整個(gè)模板編印的效果。整個(gè)構(gòu)建化流程,有一個(gè)線下的系統(tǒng),線下構(gòu)建去完成前端代碼的壓縮以及拼接,完成這部分功能后,首先會(huì)把其它資源打個(gè)包,然后在發(fā)布的時(shí)候這個(gè)靜態(tài)資源會(huì)發(fā)布到CDN服務(wù)器上,同時(shí)線下的構(gòu)建工具會(huì)去生成一個(gè)類似于資源地圖的東西,記載每一個(gè)模塊每一個(gè)JS文件的依賴,它大概是一個(gè)表,編輯整個(gè)文件去生成記錄所有模塊與模塊依賴的一個(gè)表。然后在訪問(wèn)的時(shí)候,template根據(jù)頁(yè)面所需要的模塊,在資源地圖,完成拼接過(guò)程,交給用戶,這就是整個(gè)工程化構(gòu)建的流程。
第三部分是發(fā)布。主要是利用Tiny快速搭建平臺(tái),通過(guò)上線系統(tǒng)進(jìn)行配置管理,然后通過(guò)模塊化的接口提供API,并利用MDP設(shè)備畫(huà)像平臺(tái)進(jìn)行監(jiān)控統(tǒng)計(jì)。
主題還對(duì)前端發(fā)展的未來(lái)進(jìn)行了展望,即更加的混合模式的開(kāi)發(fā)。例如,不在利用網(wǎng)絡(luò)來(lái)請(qǐng)求前端代碼,而是直接預(yù)裝到APP,以及React Native模式等。