译者 | 布加迪
审校 | 重楼
代码审查是现代软件开发的一个关键方面。在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