一个开源的PR审查机器人:LangGraph、Node.js以及GitHub Webhooks
使用经过分阶段配置的LangGraph代理来审查拉取请求,该代理会检查安全性、性能和架构,并通过GitHub API发布行级评论。
来源: Building an AI Code Review Agent: Architecture, LangGraph, and Practical Lessons
几乎每个团队都会面临拉取请求积压的问题。通常只有资深工程师才能发现那些细微的问题:N+1查询、硬编码的敏感信息、以及未被处理的边缘情况。他们也是最忙碌的人,因此代码审查往往会被仓促处理或推迟,不管怎样总会有问题漏过。
商业化的AI代码审查工具往往都是闭源的,或者价格昂贵,甚至两者皆有。另一种选择是让小团队在自己的代码仓库中运行机器人,这样就不必将代码交给黑盒系统处理。下面的设计是一个开源机器人,它能够监听GitHub上的新拉取请求,通过多步骤的LangGraph智能体对每个请求进行审查,并以具体的行级反馈形式作为PR评论发布出来。
当拉取请求被创建时会发生什么
- GitHub webhook会传递相关事件。
- 通过Octokit,GitHub API会获取代码差异内容。
逐阶段处理正是关键所在。如果仅用一个提示让大语言模型“审查这段代码”,往往只能得到模糊、笼统的评论。将任务拆分为安全检查、性能检测和架构评估三个阶段,就能得到更精准的结果,因为每个阶段都有明确的职责。
技术栈
| 层级 | 技术 |
|---|---|
| 智能体框架 | 用于多步骤推理的LangGraph |
| 大语言模型 | OpenAI GPT-4或Claude,可自行选择 |
| 后端 | 基于Express的Node.js |
该技术栈与大多数 Node.js 团队当前使用的技术非常接近。展示新的框架并非目标,关键是要让团队能够部署并信任该方案。
流程与结构
整个处理流程从打开的 PR 开始,通过经过验证的 Webhook 传递给代理程序,最后以评论的形式反馈出来:
GitHub PR opened
│
▼
Webhook (signed, verified)
│
▼
Express API ──► Fetch diff (Octokit)
│
▼
LangGraph Agent
├── Security check
├── Performance check
└── Architecture check
│
▼
Post PR comment + save to PostgreSQL
在 LangGraph 流程中,每个检查项都是一个独立的节点。团队可以单独测试、调整或关闭某个检查项,而不会影响其他项目,这对于那些只关心安全问题、不想在每个 Pull Request 中都看到架构相关意见的人来说非常有用。
两个值得展示的代码片段
首先是 webhook 签名验证。如果没有这一机制,任何发现 webhook URL 的人都可以发送虚假事件,从而触发不必要的审核流程:
function verifySignature(payload: string, signature: string) {
const hmac = crypto.createHmac("sha256", process.env.GITHUB_WEBHOOK_SECRET!);
const digest = "sha256=" + hmac.update(payload).digest("hex");
return crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(signature));
}
它虽然很小,但在基于 webhook 的工具中却常常被忽略,这是一个常见的错误。
其次,LangGraph 的流程是由多个独立的节点构成的,而非一个庞大的提示语:
const graph = new StateGraph(ReviewState)
.addNode("security", securityCheckNode)
.addNode("performance", performanceCheckNode)
.addNode("architecture", architectureCheckNode)
.addEdge("security", "performance")
.addEdge("performance", "architecture");
每个节点都会收到差异信息并仅返回自身的检测结果,这些结果会被合并成一条评论。这样一来调试会更加方便。如果性能检测出现异常,只需检查一个节点即可,而不需要处理庞大的提示信息。
哪些方法有效
- 将审查流程拆分为独立的安全、性能和架构检查,相比综合性的提示,能够提供更清晰、更具体的反馈。这是整个项目中质量提升最大的方面。
- 从一开始就验证 webhook 签名,使得安全性成为设计的一部分,而非后期才添加的功能。
- 即便以简单形式将审查历史存储在 PostgreSQL 中,也能让后续发现某些模式,比如哪些类型的问题会在不同的 PR 中反复出现。
哪些问题依然棘手
- 误报在所难免。基于大语言模型的代码审查有时会将并非问题的事物标记出来,相关文档应当明确说明这一点。信任度比华丽的功能列表更重要。
- 成本会逐渐累积。每次代码提交进行三次大语言模型检测虽然比一次更准确,但成本更高且耗时更长。小型团队需要在审查质量与自身承受能力之间找到平衡。
- 让评论看起来像真人所写,比优化LangGraph的逻辑需要更多次的提示词调整。评论应当简短、具体,并注明行号,因为没人会去阅读代码提交讨论帖中长达五段的AI生成的文字。
该机器人属于一系列小型开源实验项目之一,这些项目利用 LangChain 和 LangGraph 的大语言模型编排功能来解决具体的工作流程问题,例如基于 RAG 的文档问答、面向公民服务的政策问答,以及将语音笔记转换为敏捷用户故事,而非仅仅构建通用的演示版本。它并非一个已经完成、可随处部署的产品,而是一个可供团队在此基础上进行扩展和优化、以适应自身环境的工作起点。
在本地尝试
该代码仓库很容易运行。克隆它,安装依赖项,然后启动开发服务器即可:
git clone https://github.com/Srameshgitnow/agentic-code-reviewer.git
cd agentic-code-reviewer
npm install
npm run dev
README文档涵盖了完整的设置流程、环境变量以及如何连接GitHub webhook。关于误报的反馈或对LangGraph工作流的改进建议,都是最能提供帮助的报告类型。