你是一個成熟的AI了,應該自己學會補全Python代碼了

在項目開發中,優秀的代碼自動補全工具可以提升工作效率。然而,近來的 IDE 基本都使用搜索方法進行補全,在一些場景下效果不佳。近日,有開源項目用深度學習模型進行代碼補全,顯示出非常有潛力的效果。

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

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

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

作者在帖子中表示,他們接下來會嘗試不同的架構,並提高推斷的表現。而現在的模型推斷很慢,不能實際使用。作者已在 GitHub 開源了項目代碼:

鏈接地址: https://github.com/vpj/python_autocomplete

和 IDE 的自動補全有什麼區別

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

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

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

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

Pycharm 的自動補全介紹:https://www.jetbrains.com/help/pycharm/auto-completing-code.html

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

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

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

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

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

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

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

網友評價

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

「我們已經有很多很好用的自動補全工具了,比如 kite(一個可以在 IDE 上使用的插件),爲什麼還要費心搞個機器學習模型?」

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

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

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

對於使用深度學習自動補全代碼,機器之心的讀者們有什麼想法呢?歡迎留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章