您的位置:  首页 > 技术杂谈 > 正文

那些让 ChatGPT review 代码的程序员,后来都怎么样了?

2023-04-10 17:00 https://my.oschina.net/u/4532842/blog/8645450 WasmEdge 次阅读 条评论

Review PR 是开源项目的重要一环。对于项目维护者来说,社区有人来贡献代码,是一件值得开心的事情,说明自己的项目受到了认可。开源项目将通过社区贡献变得更强大。对于贡献代码的开发者来说,编程能力获得了开源项目的认可,也是一件值得写到简历的事情。在 Review 代码的过程中加上了 ChatGPT,会发生什么化学反应?

我司 Second State 最近在自己的开源项目的 GitHub repo 中引入了一个基于 ChatGPT 的 PR Review 机器人。当有人提交新的 PR 的时候,这个机器人会总结 PR在干什么、潜在的风险与问题、以及这个 PR 里的每次 commit 都干了什么。这对 Reviewer 来说,能够大大增加 review PR 的速度。更重要的是 ChatGPT 还能找到代码里的潜在问题,提供更高效的写代码的方式。下面我们来看一个真实的例子。

看看下面这段代码,你有发现什么问题吗?

    let limit = (n as f64).sqrt() as i32;
    for a in 2..limit {
        if n % a == 0 {
            return JsValue::Bool(false);
        }
    }

这段代码是检查一个给定的正整数 n 是否为素数。其中,变量 limit 被初始化为 n 的平方根转换为整数,这可以有效地减少计算量。然后,使用 for 循环逐个测试从 2到 limit 之间的所有数字是否是 n 的因数。如果 n 能被其中任何一个数字整除,则说明 n 不是素数,并且代码将返回 false。反之,如果代码成功通过所有循环,则说明 n 是素数,并且将返回 true。这段代码看起来属于 Rust 语言,而 JsValue 是在 Rust 和 JavaScript 之间交换数据的类型之一,所以它可能用于将这段 Rust 代码嵌入到 JavaScript 中。

声明,以上代码解释文字由 ChatGPT 生成。

简单来说,如果给定的数字是 1927,这段代码就会先开根 1927,得出结果43,然后就开始循环除以从2开始到43的整数,一直到43结束。 从 2 到 43 所有的数字中,如果有能整除的数字,那1927就不是质数,如果没有,那1927 就是质数。

写到这里是不是也没有发现什么问题,这段代码在开始的时候就开根了正整数 n,已经提高了效率。

那让我们看看 ChatGPT 的 review 是什么样的,下面的 ChatGPT Review 结果是基于 GPT4 的。

之前已经介绍过,我们在 Second State 的主要 repo 都部署了一个基于 ChatGPT 的 PR Review 机器人。在部署这个机器人后,有人新提了 PR , 机器人会自动总结并审阅 PR,以往的 PR 也可以通过自己定义的关键词来触发机器人让它工作。

我们试验了一个之前的 PR,让 ChatGPT总结并审阅,ChatGPT 在 Potential problems 提到了下面这段话:

The check_prime function can be optimized further, as it checks for divisibility with even numbers after 2, which isn't necessary.

GPT4 说 check_prime 函数可以被更好的优化,因为没有必要检查2之后的偶数。看到这里,你有没有恍然大悟,想拍大腿的感觉。已经不能被2整除,就不用试 4 6 8 10 等偶数了,因为肯定也不能整除。节省了一半工作量!优秀还得是 ChatGPT,这是连人都容易忽略的地方。当然还可以继续沿着这个思路优化,任何在这个循环中发现的素数的倍数(比如 3 的倍数,5 的倍数),都不用在下面试啦。ChatGPT 也能帮你写这个通用的算法。

上面这个例子节选自 ChatGPT 在 WasmEdge-quickjs 项目的 PR Review: https://github.com/second-state/wasmedge-quickjs/pull/82 ChatGPT 还提了很多建设性意见,这个 PR 的改动不大,大家可以自行查看改动的代码与ChatGPT 的 Review。

ChatGPT 在复杂 PR 中也有不错的表现,这个 PR 有 56 次 commit。点击下面的链接可以查 Review 的具体情况。 https://github.com/WasmEdge/WasmEdge/pull/2314#issuecomment-1497861516

通过上面的例子,我们现在可以回答文章标题提出的问题了:那些让 ChatGPT review 代码的程序员,后来都怎么样了?这个答案是 ChatGPT 可以赋能程序员,让软件更好、更快地吃掉世界

看到这里,你一定有个问题,如何在自己的 GitHub Repo 安装一个这样的机器人,让 ChatGPT 提升自己的代码能力?下面就是手把手教程,教你在5分钟上线一个自己的 ChatGPT Review 机器人。

部署自己的 ChatGPT Review 机器人

首先我们要用到 flows.network 这个平台,这是一个联接 AI 大模型与真实世界 SaaS 的工作流自动化平台。使用它的好处之一是不用自己搭服务器(serverless),也不用自己做 Oauth,直接写了业务代码上传就可以!flows.nework 有着非常用户友好的界面。

首先第一步是 fork flows.network 的 github-pr-summary repo。这是开源的,你也可以根据自己的需求在代码里自定义 prompt,详情请见下文。这里将介绍如何通过无代码的形式,部署自己的机器人。

repo 地址:https://github.com/flows-network/github-pr-summary/

fork 之后,就可以直接去 flows.network 部署。

首先你要在 flows.network 有一个账号,你可以直接用 github 账号登录,不需要任何费用。

然后点击 Create a flow 按钮,创建一个新的flow。然后在 UI 中导入你刚刚 fork 的这个 repo。

然后点开 advanced,去配置环境变量,让 flows.network 知道你要在哪个 github repo 部署这个机器人,OpenAI API Key 是什么,哪个词语能够唤醒这个 function。

  • login: 填写你个人的 github 账号. 当发布 review 的时候,这个机器人会扮演你的角色来 review。
  • owner: 填写你想部署机器人的 Github repo 属于哪个组织。
  • repo : 填写你想部署机器人的 Github repo 名字。
  • openai_key_name: 填写你想给 OpenAI Key 命名的名字,后续我们直接用到。
  • trigger_phrase: 填写你想要触发这个机器人的词语。

输入这些环境变量后,就可以点击 deploy 按钮。这个时候 flows.network 会自动进行build 你的函数,未来你的 repo 如果有了新的 commit,flows.network 也会自动帮你 build 部署。

下一步是配置我们需要连接的 SaaS,flows.network 会根据你的函数提示你需要验证哪些 SaaS 的账号。刚刚我们在环境变量里已经填写我们想在哪个 repo 部署机器人,OpenAI API key 的名字是什么,现在我们要授权 flows.network ,让它能够访问你的 repo 和你的 OpenAI API key,才能真正生效。

点击紫色的 connect 连接 OpenAI 账号,你需要输入你从 OpenAI 申请到的 API Key 并命名这个 OpenAI Key。 这里的名字要和前面在环境变量输入的名字一致。

OpenAI 验证完后,继续验证 GitHub,点击 Connect ,你会打开一个由 GitHub 提供的验证页面,选择你刚刚选好的 Repo, 安装 flows network integration,这样才能在你的 repo 进行评论。

这些都设置好后,点击 Go to the Flow 按钮。等待函数编译完,flow 的状态变成 running,就可以让 ChatGPT 帮你 review PR 啦。

进阶玩法:自定义规则与 prompt

github-pr-summary repo 是开源的,你也可以根据自己的需求在代码里自定义 prompt。 函数逻辑主要在 github-pr-summary.rs 文件。

repo 地址:https://github.com/flows-network/github-pr-summary/

    let mut reviews: Vec<String> = Vec::new();
    let mut reviews_text = String::new();
    for (_i, commit) in commits.iter().enumerate() {
        let system = "You are an experienced software developer. You will act as a reviewer for GitHub Pull Requests.";
        let co = ChatOptions {
            // model: ChatModel::GPT4,
            model: ChatModel::GPT35Turbo,
            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() + commit;
        if let Some(r) = chat_completion(openai_key_name, &chat_id, &question, &co) {
            write_error_log!("Got a patch summary");
            if reviews_text.len() < 9000 {
                reviews_text.push_str("------\n");
                reviews_text.push_str(&r.choice);
                reviews_text.push('\n');
            }
            reviews.push(r.choice);
        }

这段代码里的 system 与 question 都可以根据自己需求进行重写。比如,如果你的项目是纯 Rust 或 纯 C++ 代码,你可以让 ChatGPT 扮演成一个有经验的 Rust / C++ 开发者,而不是笼统的有经验的软件开发者。如果你有 GPT4 的权限,也可以在代码里把模型换成 GPT4。这些都可以根据你自己的需求来定制。

上面我们介绍了通过 flows network 平台的环境变量把一些参数如部署到哪个 GitHub repo、OpenAI API key 的名字传到函数里,这里我们来介绍如何直接在代码里告诉 flows.network。

参照下面的代码,把 login 里的 juntao 改成自己个人的 github 账号,把 ownerjuntao 改成自己的 github repo 所在的 org,把 repotest 改成你的 github repo 名字,openai_key_name 里的 global.free.trial 改成你想给 OpenAI Key 命名的名字。最后是 trigger_phrase 里的 flows summarize 改成你想触发这个的词语,也可以不改,就用这个。 这里的逻辑和环境变量那一步是一样的,只是我们直接在代码里改了。

pub async fn run() -> anyhow::Result<()> {
    dotenv().ok();

    let login = env::var("login").unwrap_or("juntao".to_string());
    let owner = env::var("owner").unwrap_or("juntao".to_string());
    let repo = env::var("repo").unwrap_or("test".to_string());
    let openai_key_name = env::var("openai_key_name").unwrap_or("global.free.trial".to_string());
    let trigger_phrase = env::var("trigger_phrase").unwrap_or("flows summarize".to_string());

如果你改好了你的函数,那下一步就是去 flows.network 部署你的函数,只需要点点点点,就能上线一个 GitHub 机器人。

看到这里,实属真爱了!flows.network 与 GitHub PR Summary bot 正在 Product Hunt 上 launch,觉得还不错的朋友,请点击下方的链接给这个机器人投一票吧。

https://www.producthunt.com/posts/gpt-nitro-for-github-pr

<a href="https://www.producthunt.com/posts/gpt-nitro-for-github-pr?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-gpt-nitro-for-github-pr" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=387993&theme=light" alt="GPT Nitro for Github PR - A ChatGPT-based reviewer for your GitHub pull requests | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接