一款面向開源項(xiàng)目的基于ChatGPT的代碼審核機(jī)器人程序
譯文譯者 | 布加迪
審校 | 重樓
代碼審查是現(xiàn)代軟件開發(fā)的一個(gè)關(guān)鍵方面。在GitHub工作流中,代碼審查從創(chuàng)建合并請(qǐng)求(PR)開始,到PR被批準(zhǔn)、合并或拒絕時(shí)結(jié)束。審查人員通常是高級(jí)開發(fā)人員或架構(gòu)師。他們幫助確保提交到代碼倉(cāng)庫(kù)的代碼是正確的、可維護(hù)的、可擴(kuò)展的、安全的。這對(duì)于開源項(xiàng)目尤為重要,因?yàn)?/span>貢獻(xiàn)的許多代碼可能來自社區(qū)。
然而,合并請(qǐng)求中的代碼審查常常也是軟件開發(fā)界最大的痛點(diǎn)。
- 高級(jí)開發(fā)人員非常忙碌,收費(fèi)也非常高昂。他們用于審查代碼的時(shí)間最少。
- 然而如果沒有審查代碼,開發(fā)過程就無法向前推進(jìn)(比如合并PR)。開發(fā)人員經(jīng)常無所事事地等待審查。對(duì)于開源社區(qū)的開發(fā)人員來說,不及時(shí)的代碼審查只會(huì)阻礙進(jìn)一步的貢獻(xiàn)。
- 管理層經(jīng)常要求高級(jí)開發(fā)人員報(bào)告和解釋與PR相關(guān)的關(guān)鍵更改和風(fēng)險(xiǎn)因素,這進(jìn)一步推遲了過程。
據(jù)一份針對(duì)2.6萬名開發(fā)人員編寫的70多萬個(gè)合并請(qǐng)求的調(diào)查顯示,審核一個(gè)合并請(qǐng)求平均需要4天以上的時(shí)間。開發(fā)人員每提交一個(gè)合并請(qǐng)求就浪費(fèi)2天的空閑時(shí)間,這大大浪費(fèi)了生產(chǎn)力。
我們在這篇博文中將討論由云原生計(jì)算基金會(huì)(CNCF)的WasmEdge社區(qū)創(chuàng)建的GitHub PR代碼審查機(jī)器人程序。它運(yùn)行在開源WasmEdge運(yùn)行時(shí)環(huán)境上,使用ChatGPT/GPT4來執(zhí)行代碼審查任務(wù)。它已經(jīng)部署在WasmEdge代碼倉(cāng)庫(kù)上,可以自動(dòng)審查每個(gè)合并請(qǐng)求。如果您沒有耐心,可以在不到5分鐘的時(shí)間內(nèi)在GitHub上創(chuàng)建和部署自己的代碼審查機(jī)器人程序!
實(shí)際的例子
但是ChatGPT/4是否足夠聰明可以審查代碼?這不是高級(jí)開發(fā)人員的工作嗎?言歸正傳,不妨看一個(gè)例子。下圖顯示了提交給其中一個(gè)WasmEdge開源代碼倉(cāng)庫(kù)的合并請(qǐng)求。它添加了一個(gè)check_prime()函數(shù)來檢查輸入的數(shù)字是否為素?cái)?shù)。實(shí)現(xiàn)看起來非常標(biāo)準(zhǔn)。它從2循環(huán)到n的平方根,嘗試每個(gè)整數(shù)的可整除性。
圖1. 您發(fā)現(xiàn)檢查n是否是素?cái)?shù)時(shí)的這段代碼有問題嗎?ChatGPT 發(fā)現(xiàn)了!
機(jī)器人程序提供了以下代碼審查注釋。不得不說它的表現(xiàn)非常驚艷!
圖2. 來自ChatGPT的代碼審查
如果您繼續(xù)進(jìn)行對(duì)話,可以使用ChatGPT/4進(jìn)一步優(yōu)化代碼,并提出一個(gè)解決方案,跳過循環(huán)中已經(jīng)發(fā)現(xiàn)的素?cái)?shù)的所有倍數(shù)。
作為一名管理者/維護(hù)者,我發(fā)現(xiàn)代碼審查機(jī)器人程序編寫的技術(shù)總結(jié)也很有幫助。
圖3. 總結(jié)合并請(qǐng)求中的代碼更改
它是如何工作的?
代碼審查機(jī)器人程序是一個(gè)用Rust編寫的無服務(wù)器函數(shù)(即流函數(shù)),很快會(huì)用JavaScript編寫。它被編譯成了Wasm,在由flows.network托管的WasmEdge運(yùn)行時(shí)環(huán)境中運(yùn)行。
flows.network是一個(gè)PaaS,提供用戶界面(UI)和托管服務(wù)來運(yùn)行WasmEdge函數(shù),并將它們連接到外部API(比如GitHub)。它提供一個(gè)免費(fèi)版。當(dāng)然,如果您愿意,也可以運(yùn)行自己的WasmEdge云服務(wù)。
在連接的GitHub代碼倉(cāng)庫(kù)中創(chuàng)建合并請(qǐng)求時(shí),流函數(shù)被觸發(fā)。流函數(shù)收集合并請(qǐng)求中的補(bǔ)丁和文件,并要求ChatGPT/4對(duì)它們進(jìn)行審查和總結(jié)。然后將結(jié)果作為注釋發(fā)回給合并請(qǐng)求。
機(jī)器人程序持續(xù)監(jiān)控合并請(qǐng)求中的新提交和更新。它根據(jù)需要更新(覆蓋)合并請(qǐng)求中的代碼審查注釋。
機(jī)器人程序可以由合并請(qǐng)求注釋部分中的一個(gè)神奇短語來觸發(fā)。比如說,如果審查人員希望機(jī)器人程序更新摘要,只需簡(jiǎn)單地注釋“flows summarize”(“流摘要”)。
創(chuàng)建自己的機(jī)器人程序
若創(chuàng)建和部署自己的代碼審查機(jī)器人程序,遵循以下三個(gè)簡(jiǎn)單步驟,不用5分鐘!
有兩種機(jī)器人程序模板可供選擇。一種是總結(jié)合并請(qǐng)求中的每個(gè)提交(由此創(chuàng)建機(jī)器人程序)。另一種是審查合并請(qǐng)求中的每個(gè)更改文件(由此創(chuàng)建機(jī)器人程序)。下面顯示了前一種方法的步驟。
圖4. 從模板創(chuàng)建機(jī)器人程序
1.在flows.network中加載代碼審查機(jī)器人程序模板。該模板含有機(jī)器人程序本身的源代碼。我們將源代碼克隆到您自己的GitHub帳戶,以便您以后可以修改和定制。點(diǎn)擊“創(chuàng)建和部署”。
2.給機(jī)器人程序提供OpenAI API密鑰。如果您以前保存過API密鑰,可以跳過這一步,重復(fù)使用這些密鑰即可。
3.授權(quán)機(jī)器人程序訪問GitHub。github_owner和github_repo指向目標(biāo)GitHub代碼倉(cāng)庫(kù),機(jī)器人程序將在其中審查合并請(qǐng)求。點(diǎn)擊“授權(quán)”,為機(jī)器人程序提供GitHub中必要的權(quán)限。
下圖顯示了上面的第2步和第3步。
授權(quán)機(jī)器人程序使用GitHub提供的OAuth UI訪問WasmEdge/ WasmEdge -db-examples GitHub代碼倉(cāng)庫(kù)。
就是這樣。在github_owner/github_repo代碼倉(cāng)庫(kù)上創(chuàng)建一個(gè)新的合并請(qǐng)求,看看機(jī)器人程序如何神奇地工作!
定制機(jī)器人程序
在上面的過程中,您先將機(jī)器人程序源代碼從模板克隆到您自己的GitHub帳戶(比如your_id/ summary - GitHub -pull-requests repo)。然后由這個(gè)源代碼創(chuàng)建機(jī)器人程序。您可以通過在自己的帳戶中更改機(jī)器人程序的源代碼來定制或修改機(jī)器人程序的行為。
您必須將機(jī)器人程序源代碼的更改推送到GitHub,才能讓flows.network接收這些更改,并重新構(gòu)建機(jī)器人程序(即流函數(shù))。
這里有一些簡(jiǎn)單的代碼更改,您可以用來定制機(jī)器人程序。只需更改您自己的克隆代碼倉(cāng)庫(kù)中的src/github-pr-summary.rs的源代碼文件,如下所示。記得把您的更改推送到GitHub,這樣flows.network才能接收它們。
1. 選擇一種不同的模型。機(jī)器人程序默認(rèn)使用GPT 3.5模型。如果您可以使用更高級(jí)的GPT-4模型,就將以下源代碼中的“GPT35Turbo”更改為“GPT4”。GPT4提供了更好的代碼審查,但成本更高。
static MODEL : ChatModel = ChatModel::GPT35Turbo;
// static MODEL : ChatModel = ChatModel::GPT4;
2. 設(shè)計(jì)ChatGPT提示。比如說,您可以讓ChatGPT成為經(jīng)驗(yàn)豐富的Java開發(fā)人員來審查Java源代碼文件。使用自定義提示,您可以讓機(jī)器人程序專注于代碼的某些方面(比如專注于安全問題或性能)。您還可以提示機(jī)器人程序給出特定類型的審查注釋,比如為建議的更改提供代碼片段,或者為安全問題列出要點(diǎn)。下面的代碼是模板中的提示。有許多提示庫(kù)可以為您賦予靈感。
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. 讓機(jī)器人程序更友好。您可以改變機(jī)器人程序的合并請(qǐng)求注釋的內(nèi)容和風(fēng)格,只需改變下面源代碼中以“Hello, I am a code review bot on flows.network”(“嗨,我是flows.network上的代碼審查機(jī)器人程序”)開頭的句子。比如說,您可以為您的社區(qū)成員添加定制的問候語。
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. 定制審查策略。默認(rèn)情況下,機(jī)器人程序將審查合并請(qǐng)求中的每個(gè)更改文件和每個(gè)提交。您可以編輯源代碼,使其僅審查某些文件或僅審查特定開發(fā)人員所做的更改。
在多個(gè)代碼倉(cāng)庫(kù)上使用機(jī)器人程序
一旦您讓機(jī)器人程序在一個(gè)代碼倉(cāng)庫(kù)上成功地運(yùn)行,可能會(huì)想要對(duì)您的每個(gè)代碼倉(cāng)庫(kù)都進(jìn)行代碼審查!顯然,您可以通過模板為每個(gè)代碼倉(cāng)庫(kù)部署不同的機(jī)器人程序。但這意味著每個(gè)機(jī)器人程序都有自己的源代碼要管理,這可能會(huì)變得難以管理。您可以使用同樣的機(jī)器人程序源代碼來創(chuàng)建多個(gè)機(jī)器人程序!在flows.network中,我們稱每個(gè)機(jī)器人程序?yàn)橐粋€(gè)“流”。
首先,您可以點(diǎn)擊“創(chuàng)建一個(gè)流”,并為該流導(dǎo)入您的機(jī)器人程序源代碼。機(jī)器人程序源代碼在由模板克隆的GitHub代碼倉(cāng)庫(kù)中。不要將它與您想要部署機(jī)器人程序進(jìn)行合并請(qǐng)求審查的代碼倉(cāng)庫(kù)混淆起來!
接下來,在“高級(jí)”部分,您可以添加github_owner和github_repo設(shè)置,以指向機(jī)器人程序?qū)彶楹喜⒄?qǐng)求的目標(biāo)GitHub代碼倉(cāng)庫(kù)。
下圖顯示了“從由模板克隆的現(xiàn)有機(jī)器人程序源代碼庫(kù)創(chuàng)建新的機(jī)器人程序(流)”的幾個(gè)步驟。
最后,您將完成授權(quán)機(jī)器人程序(流)訪問OpenAI API密鑰和目標(biāo)GitHub代碼倉(cāng)庫(kù)將機(jī)器人程序部署上去的的過程。
接下來是什么?
人工智能輔助的代碼審查是一個(gè)快速發(fā)展的領(lǐng)域。CNCF的WasmEdge為代碼審查機(jī)器人應(yīng)用程序提供了一個(gè)高效的運(yùn)行時(shí)環(huán)境。社區(qū)正在嘗試許多新的想法來改進(jìn)機(jī)器人程序模板。以下是一些近期可以期待的改進(jìn)!
- 支持針對(duì)編碼任務(wù)訓(xùn)練的其他大型語言模型(LLM),比如Claude、PaLM及其他LLM。
- 支持經(jīng)過微調(diào)的模型,比如針對(duì)CVE數(shù)據(jù)庫(kù)訓(xùn)練的Llama模型。
- 與其他研發(fā)管理工具集成,比如問題跟蹤器和項(xiàng)目管理工具。
- 支持GitHub之外的代碼托管服務(wù)。
趕緊為您的開源軟件倉(cāng)庫(kù)提升代碼質(zhì)量和開發(fā)人員的工作效率吧!
原文標(biāo)題:A ChatGPT-powered code reviewer bot for open-source projects,作者:Miley Fu