在機器學習以及智能化的潮流下,如果智能化與前端相結合,能否産生一些化學反應,指導我們發現一些新的方向呢?
我們是阿裡雲大資料團隊,我們在 代碼智能 方向進行了深入探索。在2020年開年,這個注定不會平凡的日子,我們釋出了第一款前端方向智能化産品--
Sophon代碼智能提示插件 ,我們希望在這款智能插件的幫助下,前端開發者們能夠“鍵”步如飛,再也不用擔心寫不完代碼。功能展示
讓我們看看有哪些炫酷的功能吧。
- 推薦如絲般順滑

- 具備實時學習的能力,實作個性化推薦

- 内置了多個常用的前端代碼片段

看到這麼多實用且智能的功能,是不是有點心動呢?
關于代碼安全
到這裡,有使用者可能會擔心代碼安全的問題,我想說完全不用擔心,因為我們是以本地化的方式提供服務的,即我們的推薦模型是部署在使用者本地的,完全不需要遠端通信。我們承諾,我們不會上傳任何使用者的代碼和隐私。
Sophon智能插件的前世今生
如此好用的神器, 是不是很好奇它的推薦是怎樣産生的呢?請聽我慢慢道來。
我們最初調研發現VsCode自帶的智能提示是由各種語言的
Language Server提供的,而TypeScript(JavaScript)語言自帶的智能提示僅限于關鍵字或基于文法的提示,如在tsx檔案中this.會提示出目前可用的類屬性、方法等,作為前端開發者,我們認為這些是遠遠不夠的。我們希望在任何位置、基于任何輸入都可以進行産生提示,讓開發者不斷檔的持續輸入下去。
為了實作這個目标,我們開始了我們自己的VsCode插件的研發。
開發一個代碼提示的插件,并不難,參考
官方Demo幾分鐘就可以搞定。難的是如何能夠了解使用者的需求,之後向使用者推薦有效、正确的代碼。
我們調研了很多,最初我們嘗試了基于
GPT-2的自然語言生成算法進行訓練和推薦,發現它可以産生大篇幅的推薦,但是推薦的準确率卻不高,我們總結的原因有以下幾個:
- 訓練集不夠多,模型未能完全學習到前端代碼的“模式”,是以無法準确推薦;
- 每個人寫代碼有自己的風格,并且不會寫完全一模一樣的代碼,導緻訓練難度增高;
- 我認為最重要一點是:機器對于寫代碼前的每個需求都是未知的,它無法準确感覺到具體需求是什麼,是以無法推薦出符合預期的代碼。
是以,我想,如果有機器能夠了解的“需求”,然後基于此進行大量針對性的訓練,自然語言生成也不失為一個好的方案。
之後,我們嘗試了機率統計算法,發現此方案在準确性、響應速度上完全滿足我們的需求,是以我們此種算法為基礎,實作了我們的推薦模型。
算法的選取思路
我們認為 “代碼”可以被視為一種高度結構化的自然語言,是以可以應用NLP的相關技術優化。以下是通常比較常用的算法。
- Text Classification(文本分類)
把最終提示的内容作為分類種類,把輸入文本的上文都當作文本,進行文本分類的訓練。
優點:方案簡單,所選擇的算法較多
缺點:類别較多(每種可提示的内容都是一種類别),訓練的準确率不高
- 自然語言生成(NLG)
把需要提示的内容作為需要生成的内容,把輸入文本的上文當作訓練資料,每次都進行生成。
優點:可以大規模應用訓練資料,可擴充性強。
缺點:可能會生成不符合文法的結果,并且要産生可信度高的推薦,需要大量的訓練集
- Markov機率模型
通過n-gram進行切詞,切完之後,通過Markov算法建構機率模型,
優點:訓練速度快,模型可解釋性強
缺點:對于複雜文法的上下文記憶能力弱。
在綜合對比之後,我們采用了Markov機率模型的方案,建構機率模型。
在離線訓練中, 需要提前準備大量的代碼片段,此處我們選擇了github上優秀的開源代碼進行了預訓練,來建構n-gram機率模型。在比較了不同的方案之後我們選取了n=4,同時通過對訓練資料拼寫的訓練建立了大量的詞表,實作了在變量命名等範代碼推薦領域也可以進行推薦。
以下是我們整體推薦的大緻流程圖

至此,基于機率模型而又非常好用的智能插件就誕生了。
關于Sophon
Sophon, 即智子,取自優秀科幻小說《三體》,在書中,智子擁有高度的人工智能以及領先人類的科學技術。我們希望借用她來表達我們對代碼智能方向的探索和追求。
目前,我們的
Sophon智能插件已經在VsCode插件市場上線了,歡迎大家下載下傳使用、拍磚。

我們緻力于前端代碼智能化,歡迎一起交流。