人工智能與軟件架構(gòu)
因?yàn)?AlphaGo 的出現(xiàn),過(guò)去的 2016 年可謂是人工智能元年。記得當(dāng)時(shí)我們正在蘇州封閉研發(fā)The Platform,工作之余討論到人機(jī)對(duì)戰(zhàn)的真正意義,并不在于技術(shù)上的突破,而在于對(duì)人們固有知識(shí)的影響,人工智能的應(yīng)用會(huì)如雨后春筍般誕生,以后沒(méi)有人工智能的軟件以后你都不好意思開(kāi)口了。大家都在問(wèn),自己的工作與人工智能有什么關(guān)系,如何在自己的工作中應(yīng)用人工智能,如何在軟件中植入人工智能的基因,使用人工智能應(yīng)該從何處入手,學(xué)習(xí)人工智能應(yīng)該從哪里開(kāi)始,更深層次的問(wèn)題是人工智能能否代替人類,作為一個(gè)程序員,人工智能是否會(huì)代替人類寫(xiě)程序···這里根據(jù)我們團(tuán)隊(duì)的實(shí)踐介紹一下如何在軟件中應(yīng)用人工智能。
人工智能(AI)的目標(biāo)是增強(qiáng)智能(IA),而不是替代人類
人工智能并不是一個(gè)新概念,40年代維納的《控制論——關(guān)于在動(dòng)物和機(jī)器中控制和通訊的科學(xué)》就是人工智能。但早年的人工智能受限于計(jì)算能力,更多在解決模型的計(jì)算速度和精度上存在著諸多問(wèn)題。近年來(lái)隨著云計(jì)算技術(shù)的發(fā)展,計(jì)算機(jī)的計(jì)算能力提高了,同時(shí)隨著大數(shù)據(jù)的發(fā)展,更復(fù)雜的計(jì)算問(wèn)題可以用更多的數(shù)據(jù)進(jìn)行修正,人工智能的可用性大大提高。但是我們從目前人工智能應(yīng)用的情況可以看到,人工智能并不能替代人類,例如在圖像識(shí)別、語(yǔ)音識(shí)別等方面的突破,僅僅是讓機(jī)器更加聰明而已,還遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到人類的程度,作為人類的智能助手更加合適。
理清人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、統(tǒng)計(jì)等基本概念之間的關(guān)系
把人工智能的方法應(yīng)用到軟件中,我們先梳理清楚幾個(gè)概念之間的關(guān)系:
人工智能(Artificial Intelligence)是一個(gè)大的概念,是讓機(jī)器像人一樣思考甚至超越人類;
機(jī)器學(xué)習(xí)(Mechine Learning)是實(shí)現(xiàn)人工智能的一種方法,機(jī)器學(xué)習(xí)最基本的做法,是使用算法來(lái)解析數(shù)據(jù)、從中學(xué)習(xí),然后對(duì)真實(shí)世界中的事件做出決策和預(yù)測(cè);
深度學(xué)習(xí)(Deep learning)又是機(jī)器學(xué)習(xí)的一種實(shí)現(xiàn)方式,他是模擬人神經(jīng)網(wǎng)絡(luò)的方式,用更多的層數(shù),更多的神經(jīng)元,然后給系統(tǒng)輸入海量的數(shù)據(jù),來(lái)訓(xùn)練網(wǎng)絡(luò);
統(tǒng)計(jì)學(xué)是機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的一種基礎(chǔ)知識(shí),從傳統(tǒng)分工來(lái)看,統(tǒng)計(jì)學(xué)一般是數(shù)學(xué)、統(tǒng)計(jì)等專業(yè)研究的方向,而機(jī)器學(xué)習(xí)是計(jì)算機(jī)科學(xué)的研究方向,但是目前大家的研究成果越來(lái)越殊途同歸,有統(tǒng)計(jì)學(xué)的大師就認(rèn)為統(tǒng)計(jì)實(shí)際上一直在從事機(jī)器學(xué)習(xí)的工作。
對(duì)于深度學(xué)習(xí)、統(tǒng)計(jì)的專家來(lái)說(shuō),他們更加關(guān)注于模型、算法等等,找到可以普適性解決問(wèn)題的辦法。而對(duì)于我們應(yīng)用來(lái)說(shuō),具體的算法實(shí)現(xiàn)不需要我們考慮太多,而是找到適合的場(chǎng)景、合適的模型、匹配的算法,所以應(yīng)用人工智能實(shí)際上是一個(gè)計(jì)算機(jī)、統(tǒng)計(jì)、知識(shí)工程、行業(yè)知識(shí)的一個(gè)交叉應(yīng)用。在經(jīng)常涉及到的應(yīng)用中,我一般在處理結(jié)構(gòu)化、半結(jié)構(gòu)化數(shù)據(jù)時(shí)優(yōu)先考慮傳統(tǒng)統(tǒng)計(jì)學(xué)的方法,例如分類、數(shù)據(jù)相關(guān)性、回歸等,而處理非結(jié)構(gòu)化數(shù)據(jù)時(shí)(例如圖像、視頻、文本)優(yōu)先考慮深度學(xué)習(xí)的方法,但這些方法也需要有統(tǒng)計(jì)學(xué)知識(shí)。所以,需要補(bǔ)課:線性代數(shù)、數(shù)理統(tǒng)計(jì)、Python,我覺(jué)得《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》這書(shū)入門(mén)不錯(cuò),上述幾方面知識(shí)都介紹了。
應(yīng)用人工智能實(shí)現(xiàn)增強(qiáng)智能的三個(gè)層面
應(yīng)用人工智能的時(shí)候,人們會(huì)有一個(gè)誤區(qū),總是希望得到一個(gè)意想不到的結(jié)果,也就是希望探索出新知識(shí)。經(jīng)常有人問(wèn)我,得到的結(jié)果好像沒(méi)有什么我不知道的,我說(shuō)這就對(duì)了,因?yàn)槟闶菍<?,要是?jì)算機(jī)得到的結(jié)果都是不可知的,你怎么能相信他?例如AlphaGo下的棋,絕大多數(shù)都是人類已知的,非常少非常少的情況下,下出一招另類,這已經(jīng)是一個(gè)頂天星的水平了。很多人失望了,這還有啥意思,其實(shí)意義很大:
(1)計(jì)算機(jī)可以讓常人快速獲得以往專家才能具備的知識(shí)
例如有經(jīng)驗(yàn)的客戶經(jīng)理,肯定非常了解客戶的情況,誰(shuí)是優(yōu)質(zhì)客戶,誰(shuí)需要什么產(chǎn)品等等,不需要計(jì)算機(jī)。但是通過(guò)用戶畫(huà)像等人工智能的手段,計(jì)算機(jī)可以讓經(jīng)驗(yàn)不夠豐富的人,也具備了上述經(jīng)驗(yàn),這個(gè)做法價(jià)值就非常高,畢竟專家是少的;
(2)幫助專家減少重復(fù)性的工作
例如醫(yī)生在做病理檢測(cè)時(shí),絕大多數(shù)沒(méi)有生病的情況和有典型病理特征的情況,機(jī)器都可以提醒醫(yī)生,節(jié)約醫(yī)生的寶貴時(shí)間。如此看來(lái),我們就會(huì)理解,人工智能不是替代人,而是給人類增加一個(gè)智能的助手,是增強(qiáng)智能(IA Intelligence Augmentation)。
計(jì)算機(jī)作為一個(gè)智能助手,可以在不同層面和手段幫助我們,我把他分為機(jī)械智能、實(shí)現(xiàn)意圖的智能和創(chuàng)造意圖的智能三個(gè)方面:
(1)機(jī)械智能
我們目前從事的主要工作都是這個(gè),事先設(shè)定規(guī)則(代碼也是規(guī)則),讓計(jì)算機(jī)完成大量重復(fù)計(jì)算,充分利用計(jì)算機(jī)的計(jì)算能力,替代人的手工勞動(dòng),這是一個(gè)以規(guī)則為核心的模式,而這些規(guī)則來(lái)自于人現(xiàn)有的知識(shí);
(2)實(shí)現(xiàn)意圖智能
人知道最終結(jié)果是什么,但是并不告訴計(jì)算機(jī)采用什么樣的規(guī)則計(jì)算,通過(guò)大量數(shù)據(jù)訓(xùn)練計(jì)算機(jī)找到規(guī)則,然后再讓計(jì)算機(jī)完成大量重復(fù)計(jì)算,計(jì)算機(jī)究竟找到的規(guī)則是什么,有可能人并不一定能理解,其實(shí)往往也不需要理解,把計(jì)算機(jī)當(dāng)成了黑盒;
(3)創(chuàng)造意圖智能
也就是讓計(jì)算機(jī)自己找到人并不知道的新知識(shí),這也是我們最向往的場(chǎng)景。
從具體的實(shí)現(xiàn)層面看,第一種情況無(wú)疑是最多的,我們需要提煉總結(jié)規(guī)則,用好第一種情況很重要;第二種情況以前相對(duì)少一些,但恰恰是目前需要改進(jìn)的,在第二種情況下我們往往優(yōu)先用統(tǒng)計(jì)學(xué)的方法處理結(jié)構(gòu)化、半結(jié)構(gòu)化數(shù)據(jù)(例如格式化日志),用深度學(xué)習(xí)的方法處理非結(jié)構(gòu)化數(shù)據(jù),這就需要讓我們的團(tuán)隊(duì)具備人工智能的思維。
實(shí)踐人工智能應(yīng)用需要新思維,不能再用規(guī)則理解計(jì)算機(jī)實(shí)現(xiàn)智能的方式
實(shí)踐人工智能,需要在在思維上進(jìn)行調(diào)整。我們往往習(xí)慣于用制定規(guī)則的方式指揮計(jì)算機(jī),輸入計(jì)算規(guī)則和輸出結(jié)果都是已知的,也就是我上面說(shuō)的機(jī)械智能方式。但后兩種模式就不是規(guī)則方式了,因?yàn)橐?guī)則是計(jì)算機(jī)找到的,這也就是經(jīng)常說(shuō)的數(shù)據(jù)訓(xùn)練。
這里我舉一個(gè)我們自己實(shí)現(xiàn)的例子,讓大家理解一下什么是模型、算法和數(shù)據(jù)訓(xùn)練。
先說(shuō)一個(gè)背景,我們?cè)谑崂憩F(xiàn)有企業(yè)數(shù)據(jù)架構(gòu)的時(shí)候,需要建立數(shù)據(jù)間的關(guān)聯(lián),用人進(jìn)行梳理費(fèi)工費(fèi)力,我們就打算用計(jì)算機(jī)自動(dòng)完成一部分,然后人工修正,這就是一個(gè)增強(qiáng)智能(IA)的例子。這里面就有一個(gè)情況,如果數(shù)據(jù)庫(kù)中沒(méi)有建立外鍵,如何把這種實(shí)際的外鍵關(guān)系找出來(lái),我們就用這個(gè)例子解釋一下機(jī)械智能和實(shí)現(xiàn)意圖智能的方法:
(1)用規(guī)則的方式查找外鍵關(guān)系
首先要定義規(guī)則,外鍵關(guān)聯(lián)的規(guī)則包括字段類型一致、長(zhǎng)度一致、包含相同數(shù)據(jù)等等,然后在所有數(shù)據(jù)中遍歷,進(jìn)行匹配。這種方式需要有完整的數(shù)據(jù),而且是否為外鍵關(guān)系的判斷規(guī)則往往有些模糊,在沒(méi)有得到全量數(shù)據(jù)時(shí)有一定局限性;
(2)用統(tǒng)計(jì)學(xué)方法查找外鍵關(guān)系
首先,我們定義出字段的特征(類似用戶畫(huà)像),字段特征是一個(gè)向量,就是一個(gè)一維數(shù)組,包括表名、字段名、字段類型、注釋、樣例數(shù)據(jù)最大長(zhǎng)度、樣例數(shù)據(jù)最小長(zhǎng)度等等,由于表名、字段名不是數(shù)值,我們要把他們變成數(shù)值,可以和同一個(gè)標(biāo)準(zhǔn)字符串作比較,也就是通過(guò)移位的方式把字符串移動(dòng)成標(biāo)準(zhǔn)字符串,移動(dòng)次數(shù)越少,相似度就越高,這樣就得到了一個(gè)真正的一維數(shù)組(向量)了。
其次,我們拿出一部分已知關(guān)系的表和字段,作為訓(xùn)練樣本,逐一計(jì)算兩個(gè)字段之間的相關(guān)系數(shù)(相關(guān)系數(shù)的計(jì)算方法是現(xiàn)成的,我這里就不介紹了,一上公式我就暈,Python的發(fā)行版Anaconda里面就有,用了這個(gè)就體會(huì)到 Python 是最好的語(yǔ)言了),相關(guān)系數(shù)高的說(shuō)明特征類似,認(rèn)定為外鍵關(guān)系。這時(shí)候人工判斷一下,如果結(jié)果不錯(cuò),那這個(gè)模型就是正確的,如果結(jié)果不好就換一種相關(guān)系數(shù)計(jì)算方法,或者改變數(shù)據(jù)特征,或者對(duì)數(shù)據(jù)特征進(jìn)行加工,總之,外鍵特征作為一個(gè)客觀存在,一定能夠找到符合的特征,這就是數(shù)據(jù)訓(xùn)練。通過(guò)數(shù)據(jù)訓(xùn)練,找到合適的字段特征(模型)和計(jì)算方法(算法),也可以交給計(jì)算機(jī)做處理了,把所有的外鍵找出來(lái)。
你看,這里沒(méi)有定義規(guī)則,處理方法是通過(guò)數(shù)據(jù)訓(xùn)練的方式,讓計(jì)算機(jī)自己找出來(lái)的,我不需要知道相關(guān)系數(shù)這玩意到底是什么意思,這就是上面說(shuō)的,計(jì)算機(jī)是一個(gè)黑盒。
需要說(shuō)明的事,在上述例子中,我簡(jiǎn)化了不少動(dòng)作,實(shí)際上最開(kāi)始還找出來(lái)很多不是外鍵關(guān)系的字段,例如 createTime,我們還要把這種噪音字段的特征訓(xùn)練出來(lái),剔除噪音。
這個(gè)示例說(shuō)明了應(yīng)用人工智能時(shí)不同的兩種思維模式,簡(jiǎn)單的說(shuō)不能再用創(chuàng)造規(guī)則的方式指揮計(jì)算機(jī),而是訓(xùn)練計(jì)算機(jī)自己找出規(guī)律。
上面我們分析了人工智能相應(yīng)的基本概念,人工智能的幾種模式以及應(yīng)用人工智能時(shí)需要的思維突破,下面我們從軟件架構(gòu)發(fā)展和面臨的挑戰(zhàn),看看應(yīng)用人工智能時(shí)的切入點(diǎn)在哪里,哪里更容易爆發(fā)出人工智能的火花。
應(yīng)對(duì)軟件架構(gòu)分而治之帶來(lái)集成的挑戰(zhàn),探索智能的連接
什么是軟件架構(gòu),在InfoQ出版的《聊聊架構(gòu)》中講的很清楚(感謝老王,總結(jié)非常到位),軟件架構(gòu)就是
(1)根據(jù)問(wèn)題確定系統(tǒng)邊界;
(2)按一定原則進(jìn)行切分;
(3)建立不同模塊間的溝通機(jī)制;
(4)整體性交付軟件功能。
可見(jiàn),架構(gòu)的關(guān)鍵是分而治之的哲學(xué),但切分是為了軟件研發(fā)、運(yùn)維方便,軟件的目標(biāo)是整體交付,分與合存在這矛盾,這一矛盾是由集成解決的,但是集成往往是復(fù)雜的,大家在架構(gòu)方面的分享,也以如何切分居多,如何集成相對(duì)較少。
集成工作的復(fù)雜度影響了復(fù)雜度系統(tǒng)的研發(fā)
Unix的實(shí)踐無(wú)疑對(duì)軟件架構(gòu)有著巨大的影響,做一個(gè)事情,做到最好,一直是 Unix 風(fēng)格所倡導(dǎo)的,但“在理想世界中,Unix程序員只愿意手工打造小巧完美的軟件寶石,每個(gè)都那么小巧、那么優(yōu)雅、那么完美。然而顯示中很不幸的是,太多復(fù)雜問(wèn)題需要復(fù)雜的解決方案。僅僅十行的程序,再優(yōu)雅也無(wú)法控制噴氣式客機(jī)。那兒有太多的裝備、太多的通路和界面,太多不同的處理機(jī),太多不同操作人員定義的子系統(tǒng),他們甚至連基本的約定都無(wú)法統(tǒng)一。即使能夠成功地將航空系統(tǒng)所有的個(gè)體軟件部分做的優(yōu)雅,但拼裝結(jié)果很可能是一堆龐大、復(fù)雜、糟糕的代碼···噴氣客機(jī)的復(fù)雜是必然的。
過(guò)去有個(gè)尖銳的觀點(diǎn),不能為簡(jiǎn)單性而犧牲功能,因?yàn)轱w機(jī)必須要能飛。正是這個(gè)事實(shí),航空控制系統(tǒng)并不會(huì)產(chǎn)生關(guān)于復(fù)雜度的圣戰(zhàn)—-Unix程序員往往敬而遠(yuǎn)之(摘自《Unix編程藝術(shù)》)。
不幸的是,我們面臨的往往是復(fù)雜性的系統(tǒng),片面理解Unix風(fēng)格分而治之往往帶來(lái)更大的集成難度。為了降低集成的難度,我們往往采用巨石型的系統(tǒng)架構(gòu),用一個(gè)大一統(tǒng)的方式設(shè)計(jì)系統(tǒng),僅僅在系統(tǒng)內(nèi)部進(jìn)行模塊的拆分,用codebase和規(guī)范進(jìn)行約束,走上了和Unix風(fēng)格背道而馳的道路。當(dāng)性能和可維護(hù)性壓力到來(lái)后,這樣的系統(tǒng)又不得不進(jìn)行拆分:我過(guò)去常常看到,當(dāng)軟件系統(tǒng)達(dá)到 100 萬(wàn)行代碼規(guī)模時(shí),人們會(huì)覺(jué)得維護(hù)困難,產(chǎn)生了強(qiáng)烈的拆分念頭;當(dāng)達(dá)到 300 萬(wàn)行代碼規(guī)模時(shí),人們往往再也按耐不住拆分的欲望;當(dāng)達(dá)到 500 萬(wàn)行代碼規(guī)模時(shí),再保守的組織也會(huì)作出拆分的決定。
軟件架構(gòu)中復(fù)雜的集成工作需要利用人工智能方式簡(jiǎn)化下來(lái)
回顧一下解決集成問(wèn)題的歷史,我們會(huì)發(fā)現(xiàn)較早的集成架構(gòu)模式來(lái)自于 Unix,就是眾說(shuō)周知的管道(Pipe)模式。Pipe模式將數(shù)據(jù)傳遞到一個(gè)任務(wù)序列中,管道扮演者流水線的角色,數(shù)據(jù)在這里被處理然后傳遞到下一個(gè)步驟。
管道模式作為一種最基本的方式,理論上可以解決所有集成問(wèn)題,但涉及到具體問(wèn)題時(shí),就需要針對(duì)不同情況做應(yīng)對(duì),針對(duì)各種復(fù)雜的情況,可以總結(jié)出更多的模式,《企業(yè)集成模式》(EIP)一書(shū)中圍繞消息集成,總結(jié)出若干集成模式,可謂是消息集成的集大成式總結(jié)。但EIP的集成模式主要針對(duì)系統(tǒng)間后臺(tái)服務(wù)的集成,SOA架構(gòu)提出了以Portal(前端集成)、BPM(流程集成)、ESB(服務(wù)集成)、DI(數(shù)據(jù)集成)以及事件/消息集成的多層面集成體系,更加系統(tǒng)性的為集成工作提供指導(dǎo)。SOA的集成方式需要一系列的集成基礎(chǔ)設(shè)施支持,屬于一種中心化的集成方式,我們可以稱之為MiddleBox的方式,在微服務(wù)架構(gòu)提出后,我們會(huì)采用把集成邏輯與業(yè)務(wù)功能部署在一起的去中心化集成方式,可以稱之為MiddlePipe的模式。
集成方式一路演進(jìn)下來(lái),主要是集成的手段上不斷翻新,多種框架和基礎(chǔ)設(shè)施越來(lái)越多的解決了非功能需求,例如 ESB 可以解決路由、安全、流控等問(wèn)題,一定程度上減少了集成的工作量。但集成的業(yè)務(wù)復(fù)雜度還存在很多,這里我列舉幾個(gè)常見(jiàn)的問(wèn)題:
(1)數(shù)據(jù)的查找問(wèn)題
針對(duì)業(yè)務(wù)需求,需要使用已存在的數(shù)據(jù)和服務(wù),但在企業(yè)環(huán)境中,系統(tǒng)、服務(wù)、數(shù)據(jù)眾多(想象一下具有10多萬(wàn)服務(wù)、10多萬(wàn)數(shù)據(jù)標(biāo)準(zhǔn)的情況),想找到試用的服務(wù)和數(shù)據(jù),不是一件容易的事情,一般我們都要依賴專家在這方面的知識(shí),通過(guò)總體設(shè)計(jì)指定了數(shù)據(jù)的流向,這依賴于專家的能力,專家的能力也是慢慢積累起來(lái)的。我們需要幫助業(yè)務(wù)更快速的找到數(shù)據(jù)和服務(wù),幫助專家快速實(shí)現(xiàn)積累,減少重復(fù)勞動(dòng)。
(2)數(shù)據(jù)的適配問(wèn)題
通過(guò)服務(wù)方式進(jìn)行集成,原子服務(wù)往往需要大量的輸入?yún)?shù)。舉個(gè)例子,調(diào)用一個(gè)發(fā)短信的接口,不僅僅是收信人電話號(hào)碼和短信內(nèi)容,還要包括很多業(yè)務(wù)含義的參數(shù),例如發(fā)信人的姓名、組織、發(fā)信的系統(tǒng)、發(fā)信的原因、發(fā)信時(shí)和客戶接觸的渠道(客服渠道、網(wǎng)點(diǎn)渠道、網(wǎng)銀渠道、自助終端等等)、發(fā)信時(shí)關(guān)聯(lián)的產(chǎn)品,這些信息是可以用來(lái)計(jì)算成本、控制次數(shù)、避免重復(fù)騷擾客戶;用戶名、密碼、驗(yàn)證碼、發(fā)送時(shí)間等這是用作安全驗(yàn)證的;優(yōu)先級(jí)、發(fā)送渠道等是用來(lái)做流量控制的;流水號(hào)、全局業(yè)務(wù)ID、請(qǐng)求ID、請(qǐng)求時(shí)間等等是用來(lái)做監(jiān)控的。上述信息來(lái)自與每次發(fā)短信的上下文,在實(shí)際開(kāi)發(fā)期間就要做很多的賦值、轉(zhuǎn)換工作,將上下文的信息傳遞給服務(wù),這種轉(zhuǎn)換就像下圖那樣,典型的面多了加水,水多了加面。我們需要根據(jù)當(dāng)前上下文和服務(wù)的特征,自動(dòng)的進(jìn)行一些適配,避免人工的重復(fù)性勞動(dòng)。
(3)系統(tǒng)的聯(lián)動(dòng)問(wèn)題
當(dāng)一個(gè)業(yè)務(wù)事件產(chǎn)生時(shí),有很多相關(guān)聯(lián)的系統(tǒng)都會(huì)需要作出關(guān)聯(lián)性反映,例如一個(gè)航班延誤,就會(huì)涉及機(jī)票的改簽、酒店的改期、接車服務(wù)的改期、會(huì)議安排的變更、日程計(jì)劃的變更。一般我們會(huì)設(shè)計(jì)一個(gè)事件中心,為各個(gè)系統(tǒng)開(kāi)發(fā)出監(jiān)聽(tīng)的程序,當(dāng)事件到來(lái)時(shí)判斷上下文信息,決定產(chǎn)生的動(dòng)作。如果事先沒(méi)有設(shè)定的規(guī)則,就無(wú)法產(chǎn)生聯(lián)動(dòng),我們期待更加自動(dòng)化的建立這種聯(lián)動(dòng)關(guān)系,讓計(jì)算機(jī)智能的產(chǎn)生動(dòng)作而不僅僅通過(guò)人為設(shè)置。
類似問(wèn)題還有很多,我們期待能夠更加智能的集成。
需要集成的部分不只是軟件本身,軟件過(guò)程也是一個(gè)復(fù)雜的集成/協(xié)作工作
分而治之的軟件需要通過(guò)集成方式整體交付,軟件的生產(chǎn)過(guò)程也是一個(gè)多人、多組織協(xié)作的過(guò)程,也需要集成。把軟件看成是一個(gè)產(chǎn)品,產(chǎn)品就有策劃、研發(fā)、運(yùn)營(yíng)和退出各個(gè)階段,每個(gè)階段可能由不同的人或組織完成。軟件的研發(fā)階段就是一個(gè)一個(gè)項(xiàng)目的實(shí)施過(guò)程,包括立項(xiàng)、執(zhí)行和完工。這樣的過(guò)程組織起來(lái),就是一條軟件生產(chǎn)的流水線。從早期瀑布式的軟件研發(fā),到后來(lái)敏捷研發(fā)過(guò)程、CMM,到目前風(fēng)頭正勁的DevOps,都是在解決軟件生產(chǎn)流水線不同階段的協(xié)作問(wèn)題,敏捷針對(duì)軟件定義、設(shè)計(jì)、構(gòu)建(開(kāi)發(fā))階段的協(xié)作,持續(xù)集成是構(gòu)建(開(kāi)發(fā))與測(cè)試階段的協(xié)作,持續(xù)交付是從定義階段到部署(交付)階段的協(xié)作。
協(xié)作中面臨的問(wèn)題,就是集成的問(wèn)題,我們可以想到很多,這里也舉幾個(gè)例子:
(1)需求、設(shè)計(jì)與構(gòu)建(開(kāi)發(fā))的溝通問(wèn)題:我們需要把需求/設(shè)計(jì)的知識(shí)圖譜化、條目化,自動(dòng)與開(kāi)發(fā)工作做一定程度的適配,減少需求/設(shè)計(jì)到代碼的轉(zhuǎn)換工作;
(2)構(gòu)建(開(kāi)發(fā))與測(cè)試的溝通問(wèn)題:我們需要根據(jù)服務(wù)和數(shù)據(jù)特性以及積累的歷史數(shù)據(jù),自動(dòng)產(chǎn)生測(cè)試用例和測(cè)試方法;
(3)運(yùn)營(yíng)的溝通問(wèn)題:我們需要通過(guò)應(yīng)用畫(huà)像、資源畫(huà)像等方式,服務(wù)與物理資源之間建立連接,快速定位問(wèn)題,進(jìn)行容量預(yù)測(cè),實(shí)現(xiàn)更智能的運(yùn)維。
在軟件架構(gòu)中應(yīng)用人工智能的目標(biāo):通過(guò)增強(qiáng)智能方式實(shí)現(xiàn)軟件系統(tǒng)與軟件工程的智能連接
應(yīng)對(duì)復(fù)雜集成的挑戰(zhàn),我們可以引入人工智能的思路,將人與軟件之間、物體與軟件之間、軟件與軟件之間、軟件生產(chǎn)線各環(huán)節(jié)之間通過(guò)知識(shí)使能的方式集成起來(lái),在傳統(tǒng)完全依賴規(guī)則進(jìn)行集成的方式基礎(chǔ)上,采用新的集成方法:以上下文信息為輸入,利用專家已有的知識(shí),通過(guò)數(shù)據(jù)訓(xùn)練和強(qiáng)化學(xué)習(xí)的方式,讓計(jì)算機(jī)能夠理解集成的意圖,成為我們的智能助手,幫助我們實(shí)現(xiàn)智能的連接,進(jìn)而可以讓計(jì)算機(jī)探索新的連接知識(shí)。這里,我把連接也分為三個(gè)層面:機(jī)械連接、基于知識(shí)連接、創(chuàng)造知識(shí)連接。
從智能連接入手探索在軟件架構(gòu)中應(yīng)用人工智能
從何處入手,探索人工智能在軟件中的應(yīng)用,是大家最關(guān)注的話題,這里我把普元在探索人工智能初期經(jīng)歷的幾個(gè)案例,給大家做一個(gè)介紹。普元董事長(zhǎng)劉亞?wèn)|博士早年就從事神經(jīng)網(wǎng)絡(luò)的研究,他指出在目前并行計(jì)算等技術(shù)充分發(fā)展的今天,算法已經(jīng)不是人工智能的瓶頸,應(yīng)用人工智能需要有兩個(gè)突破:
(1)找到人工智能應(yīng)用的切入點(diǎn)
(2)團(tuán)隊(duì)具備人工智能應(yīng)用的思維
所以我們?cè)趹?yīng)用人工智能的時(shí)候,不是成立一個(gè)專門(mén)的小組做研究,而是百花齊放的方式。了解普元的朋友會(huì)知道,普元的研發(fā)分為云計(jì)算&SOA、大數(shù)據(jù)、移動(dòng)、工程效率與技術(shù)平臺(tái)、產(chǎn)品支持中心幾個(gè)團(tuán)隊(duì),我們讓每個(gè)團(tuán)隊(duì)從數(shù)據(jù)+連接方向上入手,各自探索人工智能在領(lǐng)域上的應(yīng)用場(chǎng)景,通過(guò)找到切入點(diǎn)和初步實(shí)踐,逐步建立團(tuán)隊(duì)的人工智能思維。其中云計(jì)算&SOA團(tuán)隊(duì)的方向是通過(guò)服務(wù)畫(huà)像方式解決微服務(wù)的智能運(yùn)維與智能匹配,大數(shù)據(jù)團(tuán)隊(duì)的方向是通過(guò)知識(shí)圖譜實(shí)現(xiàn)數(shù)據(jù)自服務(wù),移動(dòng)團(tuán)隊(duì)的方向是UI的智能化開(kāi)發(fā),工程效率與技術(shù)平臺(tái)團(tuán)隊(duì)的方向是深度學(xué)習(xí)在流程與智能制造的應(yīng)用。由于篇幅有限,這里我只把普元大數(shù)據(jù)團(tuán)隊(duì)和移動(dòng)團(tuán)隊(duì)所做的工作做一個(gè)介紹。
案例一:基于知識(shí)圖譜,實(shí)現(xiàn)數(shù)據(jù)的自服務(wù)能力
先簡(jiǎn)單介紹一下背景:大家經(jīng)常會(huì)聽(tīng)到有人問(wèn)我們有哪些數(shù)據(jù),這些數(shù)據(jù)在哪里,如何獲取數(shù)據(jù)的問(wèn)題,能否建立一個(gè)平臺(tái),讓我們象百度搜索一樣,根據(jù)我們的知識(shí)(業(yè)務(wù)術(shù)語(yǔ))找到相關(guān)的數(shù)據(jù),提交申請(qǐng),得到數(shù)據(jù),這就是一個(gè)獲取數(shù)據(jù)的自助服務(wù)。
以往數(shù)據(jù)在哪里往往通過(guò)人工梳理完成,我們希望能夠自動(dòng)化一些,為專家提供一個(gè)智能的助手,這里的工作分為三部分:
(1)建立知識(shí)圖譜
人進(jìn)行數(shù)據(jù)搜索是通過(guò)業(yè)務(wù)術(shù)語(yǔ)(知識(shí))來(lái)搜索的,而知識(shí)之間是有相互聯(lián)系的,例如水果和西紅柿是上下位關(guān)系(后者是前者的具體體現(xiàn)),搜索是除了要列出直接結(jié)果,還需要顯示一些關(guān)聯(lián)的知識(shí),這就要建立知識(shí)圖譜。簡(jiǎn)單說(shuō)知識(shí)圖譜就是概念、屬性以及概念之間的關(guān)聯(lián)關(guān)系, 這個(gè)關(guān)系可以手工建立,我們通過(guò)對(duì)政策、法規(guī)、需求、數(shù)據(jù)庫(kù)comments、界面等多種來(lái)源,采用自然語(yǔ)言處理等方法,可以建立起部分的知識(shí)圖譜,輔助專家的工作;
(2)梳理技術(shù)元數(shù)據(jù)
整理各個(gè)系統(tǒng)內(nèi)部數(shù)據(jù),以及數(shù)據(jù)之間的關(guān)系,形成數(shù)據(jù)地圖。這里的難度是數(shù)據(jù)之間的關(guān)系,例如數(shù)據(jù)的血緣關(guān)系、影響度關(guān)系、關(guān)聯(lián)關(guān)系、主數(shù)據(jù)關(guān)系等,這里我們采用字段特征的相關(guān)性、數(shù)據(jù)處理邏輯的詞法/語(yǔ)法分析等手段,配合強(qiáng)化學(xué)習(xí)來(lái)完成,前面列舉的查找外鍵示例,就是一部分;
(3)建立知識(shí)圖譜與技術(shù)元數(shù)據(jù)之間的關(guān)系
這里就要通過(guò)分析界面/服務(wù)與代碼之間的關(guān)聯(lián),建立起映射關(guān)系。最終效果就是,使用數(shù)據(jù)搜索,錄入希望查找的業(yè)務(wù)術(shù)語(yǔ),得到相關(guān)結(jié)果,查看樣例數(shù)據(jù),如果是需要的數(shù)據(jù),提交使用申請(qǐng),如果不是,繼續(xù)根據(jù)相關(guān)知識(shí)進(jìn)行數(shù)據(jù)探索。提供數(shù)據(jù)自服務(wù)能力,就是在應(yīng)用的設(shè)計(jì)師、數(shù)據(jù)科學(xué)家或者業(yè)務(wù)分析師與數(shù)據(jù)之間建立起連接,我們的團(tuán)隊(duì)就是從連接的思路出發(fā),找到了人工智能的切入點(diǎn)。
實(shí)際上,數(shù)據(jù)自服務(wù)包含有找、獲、用等眾多環(huán)節(jié),我這里說(shuō)的是找的環(huán)節(jié)如何實(shí)現(xiàn),這種找的方法,也不可能100%準(zhǔn)確,還需要專家進(jìn)行調(diào)整,以及通過(guò)強(qiáng)化學(xué)習(xí)等手段不斷修正,可以看出,應(yīng)用人工智能也是一個(gè)漸進(jìn)完善的過(guò)程。
案例二:通過(guò)深度學(xué)習(xí),實(shí)現(xiàn)移動(dòng)UI的智能化開(kāi)發(fā)
移動(dòng)UI的智能化開(kāi)發(fā),是我們移動(dòng)團(tuán)隊(duì)?wèi)?yīng)用人工智能的第一個(gè)嘗試,現(xiàn)在看來(lái),就是在UI設(shè)計(jì)師與開(kāi)發(fā)工程師之間建立連接。大家會(huì)發(fā)現(xiàn),設(shè)計(jì)師的設(shè)計(jì)在變成代碼實(shí)現(xiàn)時(shí)總會(huì)有偏差,即使一個(gè)像素的差異,也會(huì)影響界面的效果,以往我們采取不同業(yè)務(wù)模板的方式,建立一些規(guī)范對(duì)設(shè)計(jì)和開(kāi)發(fā)做約束,后來(lái)移動(dòng)團(tuán)隊(duì)覺(jué)得,可以用深度學(xué)習(xí)的方式做一些嘗試,尋找不同的界面設(shè)計(jì)效果,首先通過(guò)數(shù)據(jù)標(biāo)簽方式確定頁(yè)面的風(fēng)格,再通過(guò)圖像片段的方式學(xué)習(xí)和識(shí)別設(shè)計(jì)稿中的組件,最終經(jīng)過(guò)多次的處理,變成一個(gè)樹(shù)狀的結(jié)構(gòu),把這個(gè)樹(shù)狀結(jié)構(gòu)與代碼進(jìn)行映射,就產(chǎn)生了和設(shè)計(jì)圖一致的代碼。
這個(gè)案例中,基于圖片的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)是一個(gè)關(guān)鍵技術(shù),但是如果單純使用這個(gè)技術(shù),計(jì)算量會(huì)無(wú)法承受,所以我們將處理過(guò)程分成了幾個(gè)階段,每個(gè)階段進(jìn)行分類,每個(gè)階段都可以配合強(qiáng)化學(xué)習(xí)的方式,由人工指定策略,指導(dǎo)計(jì)算機(jī)的學(xué)習(xí),提高了工程化的能力(類似做法在深藍(lán)對(duì)陣卡斯帕羅夫的時(shí)候就有應(yīng)用,有一位特級(jí)大師會(huì)指導(dǎo)深藍(lán)當(dāng)前的策略,例如進(jìn)攻還是防守,具體招數(shù)由深藍(lán)決定)。
上述兩個(gè)案例中,我們首先在各個(gè)領(lǐng)域中找到可能的切入點(diǎn),針對(duì)不同場(chǎng)景使用了不同的方案,并不是都采用了深度學(xué)習(xí)/神經(jīng)網(wǎng)絡(luò)的方法。我們沒(méi)有首先從Tensorflow等框架學(xué)起,而是在結(jié)構(gòu)化、半結(jié)構(gòu)化優(yōu)先使用統(tǒng)計(jì)方法,非結(jié)構(gòu)化數(shù)據(jù)再使用深度學(xué)習(xí),而是用業(yè)務(wù)驅(qū)動(dòng)的方式逐步推進(jìn),有效的避免了“深度泛濫”。
總結(jié)
未來(lái)的軟件必將是人工智能的軟件,但人工智能是通過(guò)技術(shù)手段實(shí)現(xiàn)智能增強(qiáng),幫助普通人迅速具備部分專家的技能,幫助專家減少重復(fù)性的勞動(dòng),探索新的知識(shí),而不是取代人。應(yīng)用人工智能,應(yīng)該在數(shù)據(jù)+連接的模式下,從智能集成入手,探索人工智能在軟件中的應(yīng)用。而這種探索,既包括傳統(tǒng)利用規(guī)則實(shí)現(xiàn)的機(jī)械智能,也包括利用統(tǒng)計(jì)學(xué)和深度學(xué)習(xí)方法支撐的實(shí)現(xiàn)意圖智能,還有創(chuàng)造意圖/尋找新知識(shí)的探索,而統(tǒng)計(jì)學(xué)方法往往用在結(jié)構(gòu)化數(shù)據(jù)和半結(jié)構(gòu)化的數(shù)據(jù)中,深度學(xué)習(xí)往往要利用非結(jié)構(gòu)化數(shù)據(jù)。
總之,人工智能是計(jì)算機(jī)科學(xué)、統(tǒng)計(jì)學(xué)、知識(shí)工程、領(lǐng)域知識(shí)的一個(gè)交叉學(xué)科,不能僅僅站在某個(gè)角度去理解和嘗試,正所謂“君子不器”。