Conceitos Básicos
大型語言模型(LLM)在程式碼翻譯方面具有巨大潛力,但目前的模型在處理 Python 語言的翻譯任務時仍面臨挑戰,特別是在 Python 到其他語言的翻譯方向上。
這篇研究論文探討了大型語言模型(LLM)在程式碼翻譯任務上的表現。作者們首先指出,儘管 LLM 在許多程式碼理解和生成任務中表現出色,但在程式碼翻譯方面仍有待充分挖掘。
研究問題
為了解決現有程式碼翻譯基準測試的局限性,作者們建立了一個新的基準測試 PolyHumanEval,涵蓋了 14 種程式語言。基於此基準測試,他們對多個最先進的程式碼 LLM 進行了超過 110,000 次翻譯的評估,並試圖回答以下研究問題:
程式碼 LLM 在執行程式碼翻譯方面的效率如何?
如何有效地提示 LLM 進行原始碼翻譯?
有哪些有效的方法可以提高 LLM 在程式碼翻譯方面的效能?
研究發現
研究結果表明,LLM 在程式碼翻譯方面表現出不對稱的能力:
LLM 在將其他語言翻譯成 Python 時表現出色,但在將 Python 翻譯成其他語言時卻面臨挑戰。
LLM 在理解和生成同一種語言的程式碼方面也表現出不對稱的能力。
廣泛採用的 LLM 優化技術,如指令微調,對程式碼翻譯的影響微乎其微。
提升方法
為了進一步提高 LLM 在程式碼翻譯方面的效能,作者們提出了兩種新方法:
中介翻譯:選擇一種介於源語言和目標語言之間的中介語言進行翻譯。研究發現,Go 語言可以作為一種通用語言,用於在任何兩種研究語言之間進行翻譯。
自我訓練:在自我生成的平行程式碼上對 LLM 進行微調。
實驗結果表明,這兩種方法都能顯著提高 LLM 的程式碼翻譯能力。
Estatísticas
CodeLlama-13B 在將其他語言翻譯成 Python 時的平均計算精度 (CA) 得分为 86.16,但在將 Python 翻譯成其他語言時下降到 66.93。
在所有研究的程式語言中,Go 語言最容易被 LLM 理解,而 Python 語言最難理解。在目標語言中,Python 語言最容易生成,而 Rust 語言最難生成。
使用 Go 語言作為中介語言進行翻譯,在所有任務中都能持續提高效能。
在 Python→Go 翻譯任務中,使用自我生成的驗證資料進行微調,可以使 CA 得分提高 14.57%。
結合自我訓練和中介翻譯的方法在 Python→X 任務上取得了最佳效能,平均 CA 得分为 74.77,比原始 CodeLlama-13B 提高了 11.7%。