首頁>技術>

作為一個整天以程式碼為伴的碼農,避免不了會接觸到各種程式碼提示工具,但是呢,用久了之後會發現他們都有個共同點,那就是 模型巨大,動輒幾百兆;並且模型大必然需要更多的計算,同樣會導致電腦記憶體佔用高,風扇呼呼的轉,時間久了逐漸會發現電腦儲存不夠用了,電腦變卡了等等問題。

那麼,有沒有一款輕量化的程式碼提示外掛?或者說,如何實現一款輕量化的程式碼提示外掛呢?

下面我會從 模型選擇、模型實現、模型最佳化三個方面 來介紹我們在程式碼智慧提示方面的一些實踐。

模型選擇

如何衡量一個模型的效果是好還是不好呢?

我們首先建立了基本的模型衡量體系,見下圖。

我們會從推薦的準確性完整性連續性效能個性化以及智慧性六個維度去綜合評價一個模型的優劣。之後,我們會進一步完善這個體系,使之能夠系統完整的評測模型的效果。

實踐中,我們選取了 GPT-2模型和基於markov的n-gram統計模型進行對比。

對比發現,GPT-2模型在準確性完整性方面表現優異,但是在效能方面,由於模型較大,推薦一次耗時較久,(這裡我們試了最少引數的版本,訓練之後模型在500M左右,推薦一次大概需要10S ),由於暫時沒找到模型壓縮的方法,只能暫時放棄。

另一個n-gram模型,在測試後發現,它在持續推薦效能 方面表現優異,模型大小僅有40M,但也並非完美,在準確性完整性方面表現的不是很好。

在實踐中,我們發現,推薦耗時在毫秒級別能夠使使用者順暢無阻礙的編寫下去,多於1s,則會讓使用者的輸入產生停頓。 基於此我們暫時選取n-gram作為我們的推薦模型。

模型實現

下面介紹一下n-gram模型的基本原理以及我們的實現。

首先,n-gram模型基於馬爾可夫鏈的假設,即:當前這個詞出現的機率僅僅跟前面幾個有限的詞相關。 以最簡單的n=2為例,即 下一個詞出現的機率僅跟之前一個詞相關,基於這個思想,我們將大量程式碼進行切分,這樣我們得到了很多的二元組,這裡可以使用單詞的出現次數代表機率。這樣,我們根據一個詞就可以得到一個不同機率分佈的推薦列表,然後每次都以當前詞進行推薦,就可以產生持續不斷的推薦了。切分的效果參考這張圖

以下是模型訓練和產生推薦的大致流程。

模型最佳化

在真實應用中,僅僅有這些是遠遠不夠的。模型只是其中一部分,更多的應該是在應用過程中,依據實踐經驗和使用者的反饋,對模型進行不斷調優:

比如,在實際應用中,基於同一個上下文,我們一般會同時產生基於n=3,n=4等等不通粒度的推薦,我們會給不通粒度賦予不同的權重,然後結合機率進行篩選和排序,並且根據實際效果以及我們的反饋體系,對權重進行斷最佳化,確保產生最佳效果的推薦。另外,為了讓推薦更加個性化,我們的模型需要具備實時訓練的能力,即使用者的輸入在產生推薦的同時,還要參與模型的增量訓練,並根據使用者實際的選擇對模型進行調優,確保模型的準確性和個性化,大致流程圖如下還有,為了得到更加輕量的模型,我們對語料庫也進行了精簡,比如,在初始模型中,我們對出現機率極低的語料進行了刪減,保持模型的輕巧和高效,同時由於具備實時訓練的能力,確保這個操作不會影響到推薦的準確率。結語

當然,目前的這些對於一個輕巧好用的程式碼提示來說是遠遠不夠的,當前我們正在嘗試完善模型的衡量體系 ,並且在嘗試更多輕量的語言模型,希望給使用者提供完美的體驗。

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 決策樹之 GBDT 演算法 - 迴歸部分