首页 / 文章

一个开源的PR审查机器人:LangGraph、Node.js以及GitHub Webhooks

使用经过分阶段配置的LangGraph代理来审查拉取请求,该代理会检查安全性、性能和架构,并通过GitHub API发布行级评论。

发布者:REACTAPP.TOP阅读约 4 分钟994 词

来源: Building an AI Code Review Agent: Architecture, LangGraph, and Practical Lessons

几乎每个团队都会面临拉取请求积压的问题。通常只有资深工程师才能发现那些细微的问题:N+1查询、硬编码的敏感信息、以及未被处理的边缘情况。他们也是最忙碌的人,因此代码审查往往会被仓促处理或推迟,不管怎样总会有问题漏过。

商业化的AI代码审查工具往往都是闭源的,或者价格昂贵,甚至两者皆有。另一种选择是让小团队在自己的代码仓库中运行机器人,这样就不必将代码交给黑盒系统处理。下面的设计是一个开源机器人,它能够监听GitHub上的新拉取请求,通过多步骤的LangGraph智能体对每个请求进行审查,并以具体的行级反馈形式作为PR评论发布出来。

当拉取请求被创建时会发生什么

  1. GitHub webhook会传递相关事件。
  2. 通过Octokit,GitHub API会获取代码差异内容。
  • LangGraph智能体会逐阶段检查代码差异,以识别安全问题、性能缺陷及架构方面的隐患。
  • 该机器人会在拉取请求上留下评论,指出具体的代码行并给出反馈。
  • 所有审查记录都会保存到数据库中,因此历史数据会随着时间不断积累。
  • 逐阶段处理正是关键所在。如果仅用一个提示让大语言模型“审查这段代码”,往往只能得到模糊、笼统的评论。将任务拆分为安全检查、性能检测和架构评估三个阶段,就能得到更精准的结果,因为每个阶段都有明确的职责。

    技术栈

    层级 技术
    智能体框架 用于多步骤推理的LangGraph
    大语言模型 OpenAI GPT-4或Claude,可自行选择
    后端 基于Express的Node.js
    数据库 用于存储审核历史记录的 PostgreSQL GitHub 集成 Octokit Webhooks 带有签名验证功能的 Express 中间件

    该技术栈与大多数 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工作流的改进建议,都是最能提供帮助的报告类型。