你是成熟的 AI 了,應該本身學會補全代碼

在項目開發中,優秀的代碼自動補全工具能夠提高工做效率。然而,近來的 IDE 基本都使用搜索方法進行補全,在一些場景下效果不佳。html

近日,有開源項目用深度學習模型進行代碼補全,顯示出很是有潛力的效果。python

近日,Reddit 上的一篇帖子引發了網友的熱議。帖子做者「mlvpj」稱:git

「咱們使用深度學習完成了一個簡單的項目,能夠自動進行 Python 代碼補全。」github

根據介紹,該項目基於 LSTM 模型,訓練後,負責對代碼的缺失部分進行補全。評價模型的方法是判斷節省了多少的按鍵信息——即模型給出長度爲 L 的代碼建議,若是和真實的代碼匹配,則節省 L - 1 個鍵入操做。實驗結果說明,大約有 30%-50% 的鍵入成本能夠節省下來。面試

做者在帖子中表示,他們接下來會嘗試不一樣的架構,並提升推斷的表現。而如今的模型推斷很慢,不能實際使用。做者已在 GitHub 開源了項目代碼:服務器

連接地址: https://github.com/vpj/python...架構

和 IDE 的自動補全有什麼區別機器學習

該項目對 Python 代碼的自動補全與傳統 IDE(如 PyCharm)等不一樣。IDE 補全基於檢索方法,須要從已有代碼中進行搜索。函數

以 PyCharm 中的基本補全(Basic Completion)方法爲例。基本補全可幫助補全可見區域的類、方法、關鍵詞代碼。使用時,PyCharm 會分析補全使用狀況,並提供當前位置可能的選擇。若是是對空間、參數或變量聲明進行補全,則 PyCharm 會基於類別提供一系列可能的命名。工具

當出現已定義的類、函數、模塊和變量時,基本補全就會啓動。

此外,PyCharm 也提供智能補全等其餘補全功能,但基本上都須要對已有文本進行搜索,根據位置和類型判斷補全的方法。這些方法都沒有配置機器學習模型。

Pycharm 的自動補全介紹:https://www.jetbrains.com/hel...

深度學習怎樣腦補缺失 TF 代碼

最經常使用的 PyCharm 自動補全也能省不少功夫,但它須要 IDE 能檢索到你的代碼文件或庫,並且補全會提供多個可能的選項。可是在本項目實驗的工具中,LSTM 會根據上下文語義肯定最可能調用的函數,所以它能節省更多的成本。做者表示若是使用束搜索,那麼一次能預測 10 多個字符,不過這樣對於實際使用仍是有點低效。

在訓練深度補全模型前,咱們須要先創建訓練集。開發者會在清洗評論、標註和空行後,構建比較乾淨的 Python 代碼。而後,模型會在這些數據上進行訓練與預測。在數據預處理上,開發者發現經過 tokenizing Python 代碼,模型效果比經過 BPE 編碼的字符級預測效果還要好。做者提供了一個簡單的預訓練模型,它是在整個 TensorFlow 項目的 models 代碼中訓練的。

下圖就是做者在驗證集中測試的驗證樣本。綠色的字符表示自動補全的起始位置,用戶須要按下 Tab 鍵選擇開始補全。綠色及後面高亮的灰色字符是自動補全的結果。

如上所示爲驗證樣本中的自動補全效果。與代碼生成相似,粗略看起來,彷佛效果很是不錯,但實際上會有不少不合理的地方。不過有意思的是,自動補全中全部字符串都只有一個佔位操做,這也是很是合理的處理方法。

樣本中自動補全的起始和結束位置都是隨機的,也就是說代碼可能補全到「tensorfl」就結束了,並不會補全完整的標識符「tensorflow」。這在實際場景中用處很是有限,所以做者將生成結束位置限制爲終止 token 而修復問題。目前自動補全能完成多種 operator,且當咱們增長束搜索的長度時,它完成的代碼長度會更多。

整個模型的主體都是 LSTM,它在 TensorFlow 模型代碼庫訓練後能捕捉很是豐富的 TensorFlow API。以下所示爲自動補全模型的主體代碼,基本上簡單的一個 LSTM 就能搞定:

網友評價

項目開源後,有些網友對做者提出了質疑:

「咱們已經有不少很好用的自動補全工具了,好比 kite(一個能夠在 IDE 上使用的插件),爲何還要費心搞個機器學習模型?」

在討論中,有人提出,一些無良的自動補全工具會悄悄上傳代碼到他們的服務器中,(而自行訓練的深度學習模型不存在這個問題)。

也有人提出,其實不必定要用 LSTM 模型,隱馬爾科夫模型在處理序列數據上效果也很好。

此外,也有網友建議使用 CuDNN 加速 LSTM 的推斷過程。這樣能大大提高推斷速度,集成到 IDE 中也就有了可能。

讀者福利限時分享

Android開發資料+面試架構資料 免費分享 點擊連接 便可領取

《Android架構師必備學習資源免費領取(架構視頻+面試專題文檔+學習筆記)》

相關文章
相關標籤/搜索