一款面向開源項目的基于ChatGPT的代碼審核機器人程序
譯文譯者 | 布加迪
審校 | 重樓
代碼審查是現代軟件開發的一個關鍵方面。在GitHub工作流中,代碼審查從創建合并請求(PR)開始,到PR被批準、合并或拒絕時結束。審查人員通常是高級開發人員或架構師。他們幫助確保提交到代碼倉庫的代碼是正確的、可維護的、可擴展的、安全的。這對于開源項目尤為重要,因為貢獻的許多代碼可能來自社區。
然而,合并請求中的代碼審查常常也是軟件開發界最大的痛點。
- 高級開發人員非常忙碌,收費也非常高昂。他們用于審查代碼的時間最少。
- 然而如果沒有審查代碼,開發過程就無法向前推進(比如合并PR)。開發人員經常無所事事地等待審查。對于開源社區的開發人員來說,不及時的代碼審查只會阻礙進一步的貢獻。
- 管理層經常要求高級開發人員報告和解釋與PR相關的關鍵更改和風險因素,這進一步推遲了過程。
據一份針對2.6萬名開發人員編寫的70多萬個合并請求的調查顯示,審核一個合并請求平均需要4天以上的時間。開發人員每提交一個合并請求就浪費2天的空閑時間,這大大浪費了生產力。
我們在這篇博文中將討論由云原生計算基金會(CNCF)的WasmEdge社區創建的GitHub PR代碼審查機器人程序。它運行在開源WasmEdge運行時環境上,使用ChatGPT/GPT4來執行代碼審查任務。它已經部署在WasmEdge代碼倉庫上,可以自動審查每個合并請求。如果您沒有耐心,可以在不到5分鐘的時間內在GitHub上創建和部署自己的代碼審查機器人程序!
實際的例子
但是ChatGPT/4是否足夠聰明可以審查代碼?這不是高級開發人員的工作嗎?言歸正傳,不妨看一個例子。下圖顯示了提交給其中一個WasmEdge開源代碼倉庫的合并請求。它添加了一個check_prime()函數來檢查輸入的數字是否為素數。實現看起來非常標準。它從2循環到n的平方根,嘗試每個整數的可整除性。
圖1. 您發現檢查n是否是素數時的這段代碼有問題嗎?ChatGPT 發現了!
機器人程序提供了以下代碼審查注釋。不得不說它的表現非常驚艷!
圖2. 來自ChatGPT的代碼審查
如果您繼續進行對話,可以使用ChatGPT/4進一步優化代碼,并提出一個解決方案,跳過循環中已經發現的素數的所有倍數。
作為一名管理者/維護者,我發現代碼審查機器人程序編寫的技術總結也很有幫助。
圖3. 總結合并請求中的代碼更改
它是如何工作的?
代碼審查機器人程序是一個用Rust編寫的無服務器函數(即流函數),很快會用JavaScript編寫。它被編譯成了Wasm,在由flows.network托管的WasmEdge運行時環境中運行。
flows.network是一個PaaS,提供用戶界面(UI)和托管服務來運行WasmEdge函數,并將它們連接到外部API(比如GitHub)。它提供一個免費版。當然,如果您愿意,也可以運行自己的WasmEdge云服務。
在連接的GitHub代碼倉庫中創建合并請求時,流函數被觸發。流函數收集合并請求中的補丁和文件,并要求ChatGPT/4對它們進行審查和總結。然后將結果作為注釋發回給合并請求。
機器人程序持續監控合并請求中的新提交和更新。它根據需要更新(覆蓋)合并請求中的代碼審查注釋。
機器人程序可以由合并請求注釋部分中的一個神奇短語來觸發。比如說,如果審查人員希望機器人程序更新摘要,只需簡單地注釋“flows summarize”(“流摘要”)。
創建自己的機器人程序
若創建和部署自己的代碼審查機器人程序,遵循以下三個簡單步驟,不用5分鐘!
有兩種機器人程序模板可供選擇。一種是總結合并請求中的每個提交(由此創建機器人程序)。另一種是審查合并請求中的每個更改文件(由此創建機器人程序)。下面顯示了前一種方法的步驟。
圖4. 從模板創建機器人程序
1.在flows.network中加載代碼審查機器人程序模板。該模板含有機器人程序本身的源代碼。我們將源代碼克隆到您自己的GitHub帳戶,以便您以后可以修改和定制。點擊“創建和部署”。
2.給機器人程序提供OpenAI API密鑰。如果您以前保存過API密鑰,可以跳過這一步,重復使用這些密鑰即可。
3.授權機器人程序訪問GitHub。github_owner和github_repo指向目標GitHub代碼倉庫,機器人程序將在其中審查合并請求。點擊“授權”,為機器人程序提供GitHub中必要的權限。
下圖顯示了上面的第2步和第3步。
授權機器人程序使用GitHub提供的OAuth UI訪問WasmEdge/ WasmEdge -db-examples GitHub代碼倉庫。
就是這樣。在github_owner/github_repo代碼倉庫上創建一個新的合并請求,看看機器人程序如何神奇地工作!
定制機器人程序
在上面的過程中,您先將機器人程序源代碼從模板克隆到您自己的GitHub帳戶(比如your_id/ summary - GitHub -pull-requests repo)。然后由這個源代碼創建機器人程序。您可以通過在自己的帳戶中更改機器人程序的源代碼來定制或修改機器人程序的行為。
您必須將機器人程序源代碼的更改推送到GitHub,才能讓flows.network接收這些更改,并重新構建機器人程序(即流函數)。
這里有一些簡單的代碼更改,您可以用來定制機器人程序。只需更改您自己的克隆代碼倉庫中的src/github-pr-summary.rs的源代碼文件,如下所示。記得把您的更改推送到GitHub,這樣flows.network才能接收它們。
1. 選擇一種不同的模型。機器人程序默認使用GPT 3.5模型。如果您可以使用更高級的GPT-4模型,就將以下源代碼中的“GPT35Turbo”更改為“GPT4”。GPT4提供了更好的代碼審查,但成本更高。
static MODEL : ChatModel = ChatModel::GPT35Turbo;
// static MODEL : ChatModel = ChatModel::GPT4;
2. 設計ChatGPT提示。比如說,您可以讓ChatGPT成為經驗豐富的Java開發人員來審查Java源代碼文件。使用自定義提示,您可以讓機器人程序專注于代碼的某些方面(比如專注于安全問題或性能)。您還可以提示機器人程序給出特定類型的審查注釋,比如為建議的更改提供代碼片段,或者為安全問題列出要點。下面的代碼是模板中的提示。有許多提示庫可以為您賦予靈感。
let chat_id = format!("PR#{pull_number}");
let system = &format!("You are an experienced software developer. You will act as a reviewer for a GitHub Pull Request titled \"{}\".", title);
let mut reviews: Vec<String> = Vec::new();
let mut reviews_text = String::new();
for (_i, commit) in commits.iter().enumerate() {
let commit_hash = &commit[5..45];
let co = ChatOptions {
model: MODEL,
restart: true,
system_prompt: Some(system),
retry_times: 3,
};
let question = "The following is a GitHub patch. Please summarize the key changes and identify potential problems. Start with the most important findings.\n\n".to_string() + truncate(commit, CHAR_SOFT_LIMIT);
3. 讓機器人程序更友好。您可以改變機器人程序的合并請求注釋的內容和風格,只需改變下面源代碼中以“Hello, I am a code review bot on flows.network”(“嗨,我是flows.network上的代碼審查機器人程序”)開頭的句子。比如說,您可以為您的社區成員添加定制的問候語。
let mut resp = String::new();
resp.push_str("Hello, I am a [code review bot](https://github.com/flows-network/github-pr-summary/) on [flows.network](https://flows.network/). Here are my reviews of code commits in this PR.\n\n------\n\n");
if reviews.len() > 1 {
let co = ChatOptions {
model: MODEL,
restart: true,
system_prompt: Some(system),
retry_times: 3,
};
4. 定制審查策略。默認情況下,機器人程序將審查合并請求中的每個更改文件和每個提交。您可以編輯源代碼,使其僅審查某些文件或僅審查特定開發人員所做的更改。
在多個代碼倉庫上使用機器人程序
一旦您讓機器人程序在一個代碼倉庫上成功地運行,可能會想要對您的每個代碼倉庫都進行代碼審查!顯然,您可以通過模板為每個代碼倉庫部署不同的機器人程序。但這意味著每個機器人程序都有自己的源代碼要管理,這可能會變得難以管理。您可以使用同樣的機器人程序源代碼來創建多個機器人程序!在flows.network中,我們稱每個機器人程序為一個“流”。
首先,您可以點擊“創建一個流”,并為該流導入您的機器人程序源代碼。機器人程序源代碼在由模板克隆的GitHub代碼倉庫中。不要將它與您想要部署機器人程序進行合并請求審查的代碼倉庫混淆起來!
接下來,在“高級”部分,您可以添加github_owner和github_repo設置,以指向機器人程序將審查合并請求的目標GitHub代碼倉庫。
下圖顯示了“從由模板克隆的現有機器人程序源代碼庫創建新的機器人程序(流)”的幾個步驟。
最后,您將完成授權機器人程序(流)訪問OpenAI API密鑰和目標GitHub代碼倉庫將機器人程序部署上去的的過程。
接下來是什么?
人工智能輔助的代碼審查是一個快速發展的領域。CNCF的WasmEdge為代碼審查機器人應用程序提供了一個高效的運行時環境。社區正在嘗試許多新的想法來改進機器人程序模板。以下是一些近期可以期待的改進!
- 支持針對編碼任務訓練的其他大型語言模型(LLM),比如Claude、PaLM及其他LLM。
- 支持經過微調的模型,比如針對CVE數據庫訓練的Llama模型。
- 與其他研發管理工具集成,比如問題跟蹤器和項目管理工具。
- 支持GitHub之外的代碼托管服務。
趕緊為您的開源軟件倉庫提升代碼質量和開發人員的工作效率吧!
原文標題:A ChatGPT-powered code reviewer bot for open-source projects,作者:Miley Fu