Hermes 自动化代码评审:基于大模型的 GitHub PR 审查方案

发布时间:2026/9/8 18:19:58
Hermes 自动化代码评审:基于大模型的 GitHub PR 审查方案 GitHub 上的 PR 一多人工 review 就成了项目里最容易被忽略又最不能省的环节。我们团队上个月刚开始引入 Hermes 做自动化代码评审最初只是想让机器人帮我们跑一遍语义层面的检查没想到它在安全问题和重复代码上抓得比人还细。如果你也维护开源项目或者在公司里带团队Hermes 这套 GitHub PR 审查方案值得你认真看看——它不是一个简单的 lint 插件而是能基于大模型理解 diff、给出带上下文建议的代码评审智能体。我接触 Hermes 是因为看到 Hermes Agent 的部署文档发现它可以接 DeepSeek 这类模型来跑代码审查。后来在 GitHub 上翻了 Hermes 官方仓库越看越觉得这套设计很符合实际需要它把审查流程拆成采集 diff、分块分析、生成评论、汇总报告几个环节每一个环节都保留人工干预和复核的入口。今天这篇就围绕 Hermes GitHub PR 审查的落地全过程把我的部署思路、配置细节、踩坑记录一次讲清楚。1. Hermes GitHub PR 审查的整体设计与思路1.1 为什么要把代码评审交给 Hermes代码评审这件事难的不是“看出问题”而是“在正确的时间看完整上下文”。一个 PR 动辄几百上千行人工 review 到后面很容易丢失前文的判断依据。尤其当团队里有人对业务模块不够熟评审往往变成“挑语法毛病”真正关键的安全漏洞和逻辑缺陷反而被漏掉。Hermes 解决的是语义层面的评审盲区。它会自动拉取 PR 的 diff、对应的 issue 上下文和历史提交信息然后把代码变更按文件、按函数切分交给大模型逐块理解最后把发现的问题按严重级别分类以 GitHub review 评论的形式贴回 PR。这个过程不依赖固定的规则模板所以即使团队编码风格在变化它也能靠模型的语义理解能力保持相对稳定的评审质量。从实际使用体验来看Hermes 给团队最大的价值不是替代人工而是充当第一道过滤器。开发者提交 PR 后机器人先扫一遍明显的问题维护者再聚焦在看业务逻辑和架构层面评审时间能压缩一半以上。对于开源项目来说这个价值更明显外部贡献者的代码水平参差不齐Hermes 可以把低级问题的沟通成本直接降到零。1.2 Hermes 与 DeepSeek 等大模型的协作方式我最初看到“deepseek hermes”这个组合时有点疑惑以为是另一个独立项目后来才弄明白Hermes 本身是编排层真正干活的是底层大模型。它的架构类似Hermes Agent 负责和 GitHub API 打交道解析 PR 数据结构管理评论状态大模型负责理解代码语义输出评审意见。所以你完全可以根据成本和隐私要求选不同的模型DeepSeek 只是其中一个很常见的选择。配置方式也不复杂因为 Hermes 兼容 OpenAI 风格的接口协议DeepSeek 提供了类似的 base_url 和 api_key 接入方式。只要在环境变量里指定LLM_BASE_URL、LLM_API_KEY和LLM_MODELHermes 就会把文本片段发送到对应的模型服务。对于代码审查场景我建议把模型温度调到 0.1 左右温度太高模型会发挥过度给出一堆似是而非的建议温度太低又容易漏掉需要推理的问题。这个参数值得你针对自己的代码库做几次对比实验。选型上有一个需要注意的点不同模型的上下文窗口差别很大。Hermes 默认会按文件长度和 token 预算做分块但如果你的项目里有那种几千行的巨型文件无论模型上下文多大都应该强制分块否则单次请求的 token 消耗会非常夸张。DeepSeek 的上下文和价格在同类模型里属于比较平衡的选择日常 PR 审查成本可以压到很低。1.3 理解 PR 时间轴上的 v1、a1 标识用 Hermes 审查过几个 PR 之后你会发现 GitHub 的 PR 时间轴里出现了一些带有 v1、a1 前缀的事件标识。我第一次看到时也很困惑以为是插件版本号之类的信息后来翻了源码才明白这是 Hermes 自己定义的事件追踪标记。v1 代表 review run 的版本号也就是同一轮 PR 里Hermes 针对当前代码状态完成的一次完整审查。a1 是这个 review run 内部的 action 序号因为一次审查可能要拆成多个子任务比如安全扫描、性能分析、测试覆盖检查每个子任务都会在时间轴上留下一个 action 记录。这样设计的好处是你在事后追溯某个评论是“哪一轮审查、哪一步分析”产出的可以快速定位模型是否基于过时代码给出了错误建议。对于团队管理者来说这个标记很实用。PR 更新后会触发新的一轮审查时间轴上的 v2、v3 能清楚展示机器人是否已经跟上最新提交。如果开发者后续 push 了新代码但 v 的版本号没有增加说明 Hermes 没有监听到更新需要检查 Webhook 配置或者 Actions 触发条件这是一个非常容易忽视的细节。2. 部署形态与最小化环境搭建2.1 GitHub Actions、CLI、Docker 三种部署方式对比Hermes 提供了三种主流部署方式我用表格整理一下适用场景部署方式适用场景优点需要注意的点GitHub Actions公共仓库、托管运行器可用的项目配置简单不依赖本地环境与 GitHub 深度集成对私有仓库有分钟数限制大型 PR 耗时会占用较多CLI 本地运行科研项目、内部代码库、隐私要求高的场景代码不出内网可控性强可手动批量审查需要自己维护 token 和模型接入没有自动触发Docker 容器服务器长期运行、需要定时扫描全部 PR环境隔离好方便定时任务可以挂载自定义配置需要运维容器更新镜像时要留意版本兼容大部分团队建议从 GitHub Actions 模式开始因为维护成本最低。你只需要在仓库里放一个 workflow 文件配置好触发条件和环境变量Hermes 就会在每次 push、pull_request 事件时自动执行。等到你确认这套流程稳定了再根据是否需要私有化部署来评估 CLI 或 Docker 模式。我的经验是如果公司代码完全不能出内网从一开始就应该跳过 GitHub Actions 模式直接用 CLI 接入企业内部的模型服务。不要先跑通再迁移因为一旦评论风格和规则配置积累多了迁移到本地之后还要重新校准模型输出反而更折腾。2.2 最小配置文件与权限说明Hermes 的配置目录一般叫.hermes/里面最关键的文件是hermes.yml。一个能跑起来的最小配置大概长这样review: model: deepseek-chat temperature: 0.1 max_review_comments: 30 include: - src/** - tests/** exclude: - generated/** - dist/** security: enabled: true blocking: false summary: enabled: true sections: - security - performance - maintainability这里的max_review_comments一定要设置否则模型可能在大型 PR 里生成几十条评论直接把作者淹没。include和exclude用来控制审查范围生成代码、第三方目录这些没必要让模型逐行看的地方提前排除能省下大量 token。权限方面Hermes 需要读取代码内容和写入评论的权限。如果使用 GitHub Actionspermissions字段至少要包含pull-requests: write和contents: read。我见过不少人在配置时把contents给成write这其实没必要还扩大了安全问题的影响面。遵循最小权限原则能给 read 就不要给 writeHeremes 读代码、写 PR 评论就够了。2.3 国内环境安装 hermes-agent 的依赖镜像配置如果你选择 CLI 方式在本地环境安装 Hermes 时会遇到一个常见痛点默认的 Anaconda 源在国外下载慢还经常超时。这个问题我的处理办法是直接改用清华镜像源。在~/.condarc里写入下面的配置再执行 conda 命令速度会从几十 KB/s 提升到几 MB/schannels: - defaults - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pr show_channel_urls: true注意pkgs/pr目录对应的是 Anaconda 的 main 等通道很多第三方包都在这里。如果你在安装 hermes-agent 时提示找不到包可以先把defaults放在首位然后补一个conda-forge镜像源再清理一下缓存conda clean -i conda update conda conda install -n hermes-env hermes-agent安装完之后记得验证一下版本CLI 工具最怕装到旧版有些版本对 GitHub API 的兼容性不一样建议直接看官方仓库的 release 页面来确定当前稳定版本。我个人的习惯是固定版本号而不是用 latest这样能避免隔几天升级一次导致配置行为变化。3. 审查规则与参数调优实战3.1 自定义代码审查规则Hermes 默认的审查已经覆盖了安全、性能、可维护性这些常见维度但如果你希望它特别关注某些团队规范可以通过规则文件做定向约束。规则文件的格式很直白核心就是“什么情况算问题、问题有多严重、给什么建议”。例如我要求 Hermes 在 Python 代码中发现直接拼接 SQL 时必须给出参数化查询的建议并且标记为严重级别rules: - name: sql-injection-check language: python pattern: execute\\s*\\(.*f[\] message: 检测到可能的 SQL 拼接建议使用参数化查询。 severity: critical comment_style: suggestion这类规则的实现原理其实是正则匹配加上模型语义判断的双重校验。正则能快速定位高风险代码行模型再判断这个位置是否有真正的注入风险。我强烈建议你为项目里最容易出现的几类问题都配上规则尤其是资金相关的订单金额计算、用户权限校验、文件路径拼接这些地方Hermes 能帮你做到常规 review 很难做到的覆盖率。配置规则的时候有一点要克制规则不是越多越好。每一条规则都会增加模型的判断负担如果规则之间互相冲突模型输出会变得摇摆不定。我的经验是先让 Hermes 跑一周默认配置把它的评论导出来看看主要集中在哪些类别再针对最高频的几类问题加规则这样调优路径最清晰。3.2 控制 token 成本与审查深度自动化代码评审听起来美好但大模型接口是按 token 计费的如果不加控制一个大 PR 就能烧掉不少钱。这里我给出一个我自己在用的估算方法你部署的时候可以直接套用。假设一个 PR 变更了 1000 行代码平均每行代码包含约 12 个 token那么光 diff 文本就是 12000 个 token。再加上文件路径、函数上下文、代码片段前缀、模型的 system prompt实际一次完整审查大约需要 16000 到 20000 个 token。Hermes 支持max_context_tokens和chunk_size两个参数通过它们可以把长文件拆成多个块每个块控制在 4000 token 左右。review: chunk_size: 4000 max_context_tokens: 8000 max_review_comments: 30这样拆的好处是既不会超过模型单次请求的上下文上限也能避免模型在长代码里丢失前文信息。你还可以把temperature调低来减少无意义评论一般审查任务用 0.1 到 0.2 是比较合适的区间。成本上我实测下来一个 1000 行的 PR用 DeepSeek 模型审查一次的成本大概在几分钱到一毛钱级别相比人工评审时间来说几乎可以忽略。真正要警惕的是那种频繁触发的大仓库——每个 PR 跑一次一天几十个 PR一个月累积下来也是不小的开销。解决办法是只对pull_request的synchronize和opened事件触发不要对edited这种频繁发生的事件触发。3.3 与分支保护规则和 CI 流程集成Hermes 不只是给你看评论它还可以作为强制质量门禁参与合并流程。GitHub 的分支保护规则支持必需状态检查如果 Hermes 审查后认为代码存在问题并且你已经把对应规则配置成阻塞级别那么这个 PR 就无法被 merge直到作者修复问题并重新触发审查。具体操作上你需要在 workflow 文件里让 Hermes 把结果写成一个 check run然后在 GitHub 仓库的 Settings - Branches - Branch protection rules 里添加这个 check run 为 required。配置完成后PR 页面上会明确显示“Hermes review 失败”开发者就知道必须处理机器人的评论。这里要做一个权衡如果所有规则都设置成阻塞团队的开发效率会受到不小影响。我的建议是安全类问题必须阻塞性能和维护性建议可以降级为普通评论让作者自己判断是否处理。你可以在规则文件里用blocking: true/false控制。实际操作下来这种“关键问题强阻塞非关键问题软提示”的策略团队接受度最高。4. 一次完整的 PR 审查实操记录4.1 安装并初始化 Hermes我在一台 Ubuntu 服务器上做的是 CLI 模式部署Python 环境用的是 3.10。首先建一个独立的虚拟环境避免污染系统环境conda create -n hermes python3.10 -y conda activate hermes pip install hermes-agent hermes inithermes init会生成默认的配置目录和样例文件然后你需要设置环境变量。建议不要直接把 API key 写进配置文件用环境变量引用更安全export GITHUB_TOKENghp_xxxx export LLM_API_KEYsk-xxxx export LLM_BASE_URLhttps://api.deepseek.com/v1 export LLM_MODELdeepseek-chat初始化完成之后可以用hermes doctor检查环境状态它会告诉你 token 是否有效、模型接口是否连通、GitHub API 是否正常。这一步我强烈建议做因为很多新手上来就直接跑审查结果评论没发出来排查了半天才发现是 token 权限不够。4.2 创建测试 PR 并触发机器人评审为了验证效果我在一个测试仓库里建了一个分支故意提交了一段有问题的 Python 代码比如直接拼接 SQL、忘记处理异常、硬编码密码。然后发起一个 PRHermes 会自动检测到这个事件。如果你用 CLI 模式可以手动执行手动审查命令hermes review --repo myorg/myrepo --pr 42命令执行后你会看到 Hermes 在终端输出解析 diff、分块、调用模型的过程。整个 500 行的 PR 大概用了 40 秒左右。审查完成后GitHub 的 PR 页面上就会出现一条 review summary类似这样的内容本次审查发现 3 个问题严重数据库查询存在 SQL 拼接风险建议使用参数化查询。一般函数fetch_user未处理空值返回可能导致后续调用报错。建议硬编码的数据库密码应移动到环境变量中。下面还会附带逐行评论点击具体代码行就能看到机器人标注的问题原因和修改建议。这种体验非常接近人工 review 的流程但反馈速度要快得多。4.3 人工确认与反馈闭环得到机器人的审查结果后我们团队的做法是作者先自己看一遍所有评论能改的立即改不能改的回复一条“won’t fix”并说明理由。维护者在合并前再快速扫一遍机器人和作者之间的讨论确认没有明显分歧后点 merge。这里要特别强调一个经验不要允许 Hermes 自动合并 PR。虽然它理论上可以做到但代码审查中的很多判断需要业务上下文机器人不一定了解你的领域约束。把它定位成一个“高并发初筛助手”比“自动批准机器人”要稳妥得多。我们跑了一个月下来团队的 PR 平均 review 时间从 3 小时缩短到 40 分钟而且低级安全问题的漏网率明显下降。更有价值的是Hermes 的评论记录形成了一个可搜索的历史库新人可以通过翻评论来了解项目的常见坑这比看文档更生动。5. 常见问题与排查实录5.1 GitHub 网络连接与依赖下载问题国内访问 GitHub 不稳定这个大家心里都有数。遇到 Hermes 下载失败或者 GitHub API 请求超时我的解决方案分两步第一步安装依赖时启用国内镜像Python 包用清华 PyPIAnaconda 环境用清华 conda 镜像这能解决大部分下载问题。第二步如果 GitHub API 拉取 diff 超时优先考虑是不是用了本地 CLI 加 GitHub 远程仓库这种情况可以改用 GitHub Actions 模式让托管运行器直接访问 GitHub API网络链路更稳定也省去本地网络折腾。要特别提醒不要为了访问 GitHub 去安装来历不明的加速工具既不安全也可能违反公司安全策略。企业环境里更靠谱的做法是让网络管理员配置一个稳定的访问策略或者在能访问 GitHub 的内部 CI 服务器上部署 Hermes。5.2 Flutter 构建环境中的 flutter-gradle-plugin 报错有同事在跑 Hermes 审查一个 Flutter 项目时遇到了failed to apply plugin dev.flutter.flutter-gradle-plugin的报错。乍一看和 Hermes 没关系但实际上是环境问题Hermes CLI 所在的机器上安装了多个 Gradle 版本Flutter 插件和 Gradle 版本不兼容。这个时候不要急着改 Hermes 配置先去检查运行环境的 Flutter SDK 和 Gradle 版本。处理方法很简单把 Flutter SDK 固定到项目指定的版本然后清理 Gradle 缓存flutter doctor cd android ./gradlew cleanHermes 在默认配置下不会编译代码它只是做静态的 diff 分析所以这类环境报错通常出现在你把 Hermes 和构建任务放在同一个 workflow 里的时候。建议把审查步骤和编译步骤拆成两个独立的 job互不干扰问题会少很多。5.3 LLM API 超时与评论缺失如果你发现 Hermes 跑了半天PR 上却没有任何评论先看两处一是模型接口是否返回了内容二是 Hermes 是否有写评论的权限。排查时先看日志Hermes 的日志会输出每个阶段的状态如果停在generating comments但一直没有写入大概率是 API 超时。这种情况我建议在配置里加长超时时间同时开启重试api: timeout_seconds: 120 max_retries: 3还有一个容易忽略的问题max_review_comments设置得太小比如设成 5一旦超过这个数量Hermes 会把多余的评论直接丢弃看起来就像“评论缺失”。实际使用下来30 左右是一个合理的默认值既不会淹没作者也不会漏掉重要问题。5.4 隐私与 token 安全最后说一个所有团队都必须重视的问题代码是公司最敏感的资产之一把代码发给外部模型接口之前一定要确认数据合规性。如果公司有严格的数据安全要求你有两个选择一是部署支持私有化的大模型服务让 Hermes 指向内网地址二是用开源模型在本地跑推理虽然速度慢一些但代码完全不出机房。另外GitHub Token 的权限一定要控制好。Heremes 只需要读取代码库和写 PR 评论不要给它repo全量权限更不要用个人账号的 token 跑在服务器上。创建一个独立的 GitHub App 或使用细粒度 token限制到单个仓库这样即使 token 泄露影响范围也是可控的。从我个人的实践来看自动化代码评审永远替代不了人的设计判断但它能把人从重复劳动里解放出来。用 Hermes 跑通第一版之后我最大的感受是团队 review 的讨论质量变高了因为大家不需要再花时间争论那些机器人一眼就能看出的低级问题可以把精力放在真正重要的架构和逻辑上。如果你正准备引入类似的工具我建议先从一个非核心仓库开始跑两周收集一下团队反馈再逐步推广到所有项目。这个节奏最稳。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询