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

機器之心整理

參與:思源、一鳴

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

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

近日,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 會基於類別提供一系列可能的命名。

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

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

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

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

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

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

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

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

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

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

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

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

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

網友評價

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

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

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

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

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

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

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

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