那些让 ChatGPT review 代码的程序员,后来都怎么样了?
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,详情请见下文。这里将介绍如何通过无代码的形式,部署自己的机器人。
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
文件。
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 账号,把 owner
的 juntao
改成自己的 github repo 所在的 org,把 repo
的 test
改成你的 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,觉得还不错的朋友,请点击下方的链接给这个机器人投一票吧。
<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>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
详解事务模式和Lua脚本,带你吃透Redis 事务
摘要:Redis事务包含两种模式:事务模式和Lua脚本。 本文分享自华为云社区《一文讲透 Redis 事务》,作者: 勇哥java实战分享。 准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。 先说结论: Redis的事务模式具备如下特点: 保证隔离性; 无法保证持久性; 具备了一定的原子性,但不支持回滚; 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。 但Lua脚本更具备实用场景,它是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua脚本可以保证隔离性,而且可以完美的支持后面的步骤依赖前面步骤的结果。 Lua脚本模式的身影几乎无处不在,比如分布式锁、延迟队列、抢红包等场景。 1 事务原理 Redis的事务包含如下命令: 事务包含三个阶段: 事务开启,使用 MULTI , 该命令标志着执行该命令的客户端从非事务状态切换至事务状态 ; 命令入队,MULTI 开启事务之后,客户端的命令并不会被立即执行,而是放入一个事务队列 ; 执行事务或者丢弃。如果收到 EXEC 的命令,事务队列里的命令将会被执行 ,如果是...
- 下一篇
KubeVela:云原生应用和平台工程之路
作者:殷达 背景 最近,云原生计算基金会 CNCF 下的 App Delivery TAG (应用交付领域小组)发布了《CNCF 平台工程白皮书》,KubeVela 被纳入“统一 API 层”项目。 原文下载链接: https://appdelivery.cncf.io/whitepapers/platforms/ 回溯 2019 年,Kubernetes 逐渐成为部署和管理基础设施的事实标准。越来越多的平台工程师开始在 Kubernetes 之上构建平台,并向最终用户提供服务。容器化部署和声明式 API 大大降低了复杂系统操作的难度。 然而,当集群中存在数千个工作负载和相关资源时,操作人员很难识别逻辑关系,并根据其内部关系进行准确且符合业务需要的管理。 同时,像 Helm 或 Kustomize 这样的工具已经探索了打包和交付 Kubernetes 资源的解决方案。这些已被证明是非常有效的,显然 Helm Chart 现在是在 Kubernetes 中打包和分发制品最受欢迎的方式。 另一方面,各种项目也开始定义应用程序。这些尝试不仅是简单地打包资源,而是从自上而下的视角寻求解决方案。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19