我的同事们非常喜欢人工智能代码审查工具,每次我在他们的代码仓库里提交 pull request 时,似乎都会发现又多了一个新的 AI 代码审查 SaaS 产品。鉴于这类产品如此之多,我决定尝试开发一个针对 GitHub 代码仓库的 AI 代码审查机器人。我只用了一个下午就用桌面上的模型完成了它的核心部分。最终,我得到了一个名为reviewbot 的小工具,它可以接收 GitHub pull request 的信息并提交相应的代码审查。
reviewbot 由DGX Spark 、 llama.cpp和 OpenAI 的GPT-OSS 120b驱动。该 AI 模型运行在我桌面上的机器上,其 AI 推理的功耗甚至低于我的游戏主机运行一些轻量级 3D 游戏时的功耗。测试表明,即使 DGX Spark 每秒仅生成 60 个 token,reviewbot 的几乎所有运行时间也都在两分钟以内。
reviewbot 是一个大约 350 行 Go 代码的程序,它只是将拉取请求信息输入到模型的上下文窗口中,并提供一些工具来执行诸如“留下拉取请求评论”和“读取文件内容”之类的操作。我正在考虑添加其他操作,例如“读取线程中的消息”或“读取问题内容”,但目前还没有用到它们。
为了方便起见,我将其分发为Docker 镜像,每当拉取审查评论包含神奇短语/reviewbot时,该镜像就会在 GitHub Actions 中运行。
我开发 reviewbot 的主要原因是,我找不到任何类似的工具可以让你指定以下组合:
- 您自己的AI模型名称
- 您自己的 AI 模型提供商 URL
- 您自己的 AI 模型提供商 API 令牌
我相当肯定市面上有成千上万个类似的AI工具,但我找不到,因为谷歌是个坏掉的工具,不过这个是我的。
工作原理
当 reviewbot 审核拉取请求时,它会生成一个类似这样的 AI 模型提示:
Pull request info: <pr> <title>Pull request title</title> <author>GitHub username of pull request author</author> <body> Text body of the pull request </body> </pr> Commits: <commits> <commit> <author>Xe</author> <message> chore: minor formatting and cleanup fixes - Format .mcp.json with prettier - Minor whitespace cleanup Assisted-by: GLM 4.7 via Claude Code Reviewbot-request: yes Signed-off-by: Xe Iaso <[email protected]> </message> </commit> </commits> Files changed: <files> <file> <name>.mcp.json</name> <status>modified</status> <patch> @@ -3,11 +3,8 @@ "python": { "type": "stdio", "command": "go", - "args": [ - "run", - "./cmd/python-wasm-mcp" - ], + "args": ["run", "./cmd/python-wasm-mcp"], "env": {} } } -} \ No newline at end of file +} </patch> </file> </files> Agent information: <agentInfo> [contents of AGENTS.d in the repository] </agentInfo>该人工智能模型可以返回以下三种结果之一:Pull request info: <pr> <title>Pull request title</title> <author>GitHub username of pull request author</author> <body> Text body of the pull request </body> </pr> Commits: <commits> <commit> <author>Xe</author> <message> chore: minor formatting and cleanup fixes - Format .mcp.json with prettier - Minor whitespace cleanup Assisted-by: GLM 4.7 via Claude Code Reviewbot-request: yes Signed-off-by: Xe Iaso <[email protected]> </message> </commit> </commits> Files changed: <files> <file> <name>.mcp.json</name> <status>modified</status> <patch> @@ -3,11 +3,8 @@ "python": { "type": "stdio", "command": "go", - "args": [ - "run", - "./cmd/python-wasm-mcp" - ], + "args": ["run", "./cmd/python-wasm-mcp"], "env": {} } } -} \ No newline at end of file +} </patch> </file> </files> Agent information: <agentInfo> [contents of AGENTS.d in the repository] </agentInfo>
- 通过
submit_review工具进行最终审批,该工具会批准更改并提供代码更改摘要。 - 通过
submit_review工具明确拒绝更改,该工具会拒绝更改并提供拒绝原因的摘要。 - 不表示批准或拒绝代码的评论。
reviewbot 的核心是“AI 代理循环”,或者说是一个像这样工作的循环:
- 收集信息以输入人工智能模型
- 向人工智能模型提交信息
- 如果 AI 模型运行
submit_review工具,则发布结果并退出。 - 如果 AI 模型运行任何其他工具,则收集它请求的信息,并将其添加到下一个循环中要提交给 AI 模型的列表中。
- 如果 AI 模型在任何时候只是返回文本,请将其视为对更改的不置可否的评论。
不要使用评论机器人
reviewbot 对我来说是一个足够好用的临时解决方案。它有一些局限性,包括但不限于:
- 由于gitfs库不支持克隆需要身份验证的闭源仓库,因此它无法与闭源仓库一起使用。如果报酬足够,我或许可以花点功夫解决这个问题。
- 相当一部分测试调用中,代理程序依赖于 GitHub API 中未填充的字段,这导致了程序崩溃。我确信我还会发现更多类似的例子,并且需要为此提交补丁。
- reviewbot 就像是用 Go 语言手工编写的 300 行代码,只花了一下午的时间。如果你真的需要类似的东西,自己写一个应该也不费吹灰之力。
常见问题解答
当像评论机器人这样的创新出现时,人们自然会产生疑问。为了给您提供最佳的阅读体验,我向我的朋友、赞助人和亲友征集了关于评论机器人的问题。以下是一些可能对您有所帮助的解答:
世界真的需要另一个人工智能代理吗?
大概不是!这只是我出于好奇做的,并不是真的想让你用。它比我想象的要容易得多,而且考虑到它所花费的精力,它的实用性也出奇地高。
您是否在寻找某个主题的常见问题解答?
不,一片混乱。就让一切以一种辉煌的方式发生吧。
我们死后会去哪里?
我他妈怎么会知道?我甚至都不知道椅子这玩意儿到底有没有存在过。
有没有人真的走得很远,甚至决定去那里,想让自己看起来更像?
至少有一半的时间我都想用 go wish 来实现这个功能。这其实就是常识而已。
如果你有一堆沙子,一次拿走一粒,那么什么时候它就不再是一堆沙子了?
当风能把所有的沙子都吹走的时候。
多久需要一次燕麦片?
每天三次,否则冥界巨兽就会出现,毁灭整个人类社会。我们可不想这种情况发生,所以我们确保每天给评论机器人喂燕麦粥。
铺一个狗窝需要多少张煎饼?
至少十二个。不太确定,因为我的煎饼吃完了。
这样就能击溃我的敌人,让他们臣服于我的脚下,夺走他们的马匹和货物吗?
只有通过拉取请求添加该功能,reviewbot 才能做到。只要代码经过扩展,reviewbot 就能完成任何操作。
我为什么要使用评论机器人?
坦白说,你不应该这样做。