做开源维护者或者团队技术负责人久了,你会发现最消耗精力的往往不是写代码,而是审 PR。尤其项目活跃以后,每天涌进来的 Pull Request 动辄十几个,逐行看 diff 不现实,全凭感觉扫一眼又容易漏问题,等合并下去出了事故,回头定位的成本比当场拦住高出一个数量级。Hermes 这个自动化代码评审工具,就是我在这个场景里试了一圈以后留下来的一套解法。它本质上是一个面向 GitHub PR 的智能审查服务,能自动拉取变更内容、分析 diff、识别潜在缺陷,再把结论以评论、标签或者完整 summary 的形式贴回 PR 页面。对小团队和个人开发者,它相当于一个不用休息的 Code Reviewer;对开源维护者,它能把明显的问题挡在第一道关口,让人把精力集中在真正需要判断的地方。
这篇文章我会从 Hermes 的设计思路讲起,然后给出完整的接入方式、配置要点,以及我在真实项目里踩过的坑。如果你只想赶紧用起来,可以直接跳到第 3 节照着抄,配置文件我也放在那里了。
1. 为什么我把 PR 审查交给 Hermes 这个自动化工具
1.1 人工评审的四大痛点,哪一个戳中了你
先说我自己的真实状态。我手上有一个维护了三年的开源项目,高峰期一天能有七八个 PR,我自己的全职工作还要写业务代码。最早我试图每个 PR 都认真看,但坚持两周就撑不住了:打开 PR 列表,光是扫一遍标题和变更量就需要半小时,等真正看进去第一个 PR,已经过去一小时,后面几个只能象征性点个 approve。
这个场景拆开来看,人工评审至少有四个绕不开的痛点。
第一是耗时。一个稍有规模的 PR,涉及十几个文件、几百行改动时,完整看一遍需要的时间远超写这段代码的时间。遇到那种改一处逻辑、连带调整了五六个模块的 PR,人脑要在文件之间来回切换上下文,光是把逻辑关系在脑子里重建一遍就很累。
第二是标准不一致。上午你还有精力,会认真查空指针、边界条件、并发安全;下午开了三个会回来,你可能只想快速点个绿。同一个团队里,有人是细节控,有人是差不多先生,同一个代码问题在不同 PR 里得到完全不同的评审反馈,挺消磨信任的。
第三是上下文断裂。很多问题不是单看 PR 就能发现的。改了数据库索引,得知道线上表数据量;改了接口返回结构,得知道前端有没有依赖旧字段。评审人如果对项目背景不熟,看到的只是孤立代码,很难发现“代码本身没错,但和现状冲突”的问题。
第四是安全隐患容易被肉眼放过。硬编码密钥、SQL 拼接、越权接口、依赖版本带已知漏洞……这些在 diff 里往往一行就带过了,但靠人眼盯根本盯不住。我后来统计过,项目里出过线上事故的地方,有一半在 PR 阶段其实已经有明显信号,只是没有人注意到。
1.2 Hermes 的项目定位:不是替代评审人,而是做第一道防线
我开始找自动化方案的时候,市面上不是没有代码扫描工具,但它们大多只做静态检查,能抓空指针、未定义变量这类问题,对“这段业务逻辑对不对”“有没有更好的写法”“测试覆盖够不够”完全无能为力。Hermes 不一样,它在设计上就定位成一个智能体(Agent),不只是跑规则,而是真正去“理解”代码变更。
具体来说,Hermes 会做这么几件事:先读取 PR 的完整 diff 和关联文件,再把变更放到整个仓库上下文里理解,然后模拟一个资深评审者的思路,从正确性、安全性、性能、风格、测试完整性等维度逐条过一遍,最后生成带具体行号和修改建议的审查结论。
所以我对 Hermes 的定位从一开始就非常明确:它是第一道防线,不是最后一道闸门。它能帮我把 80% 的机械性、确定性问题挡在门外,让我只需要关注剩下 20% 真正需要人来判断的架构问题和业务权衡。这个定位很重要,因为如果指望它完全替代人工,用两天你就会觉得它“不够聪明”,然后弃用;把它当过滤器,它的价值会非常实在。
1.3 同类方案对比:Hermes 凭什么值得试
我实际对比过几个主流方案,包括 GitHub 原生内置的 code scanning、老牌的 SonarQube,还有后来出现的 CodeRabbit 这类 AI 审查工具。各有各的适用场景,但 Hermes 在几个维度上的表现让我决定长期用它。
| 对比维度 | GitHub Code Scanning | SonarQube | CodeRabbit | Hermes |
|---|---|---|---|---|
| 部署方式 | 云端内置 | 自建服务较重 | 云服务 | 支持 Action / CLI / 自托管 |
| 审查深度 | 静态规则为主 | 静态规则为主 | 大模型理解 | 大模型理解 + 可编程技能 |
| 自定义能力 | 有限 | 强但配置复杂 | 支持 prompt 定制 | 规则 + Skill 双重扩展 |
| 误报控制 | 中 | 中高 | 中 | 可训练调校,噪音较低 |
| 接入成本 | 低 | 高 | 低 | 低 |
| 是否闭源锁定 | 平台锁定 | 开源核心 | 闭源 | 开源可自托管 |
我不是说其他工具不好,SonarQube 在规矩严格的团队里依然有价值,GitHub 内置扫描也能兜底。但 Hermes 吸引我的是它的“可调教”属性:既能用仓库内配置文件定义规则,又能针对特定框架写 Skill 技能包,还能自由切换底层模型。对一个追求定制化的团队来说,这种自由度非常关键。
2. Hermes 的核心设计:它到底怎么审代码
2.1 变更提取与上下文构建
Hermes 处理一个 PR 的第一件事,是把变更内容完整、精确地提取出来。这一步看起来简单,实际很考验工程能力。GitHub 的 PR 本质上是基于 merge-base 的 diff,但大 PR、二进制文件变更、文件重命名、行号偏移这些情况,处理不好就会让后续分析建立在错误数据上。
我自己在用的版本对这类场景处理得比较稳,它会优先通过 GitHub API 获取正式 diff,再针对大文件做分块处理,避免把整个超大文件一次性塞进模型导致上下文溢出。同时,它会提取变更文件所属模块的目录结构、相关函数定义、导入关系,构建一个结构化的上下文图。这个设计让我印象很深,因为多数 AI 审查工具只看 diff 本身,而 Hermes 会去看“这个文件在项目里处于什么位置”,审查结论明显更贴实际。
2.2 大模型驱动的审查建议生成
上下文准备好以后,Hermes 会把 diff 和上下文组装成一连串审查任务,交给底层大模型逐个执行。它默认支持 OpenAI 兼容接口,也支持接入 DeepSeek、Qwen 这类国内模型,以及通过 Ollama 之类工具跑本地模型。实际操作里,不同模型的审查风格差异很大,这个我会在后面配置那一节详细说。
审查并不是一次性的“总结式”输出,而是分步骤的:先做变更摘要,再按文件逐个分析,最后汇总成整体结论。每个文件的分析会包含具体行号、问题类型、严重等级、修复建议。收到这些信息后,Hermes 还有一个后处理环节,会过滤掉明显重复、与上下文无关的噪音评论,并合并同一位置的多条建议。实测下来,噪音控制是 AI 审查工具里比较重要的体验指标,Hermes 在这块做得不差。
2.3 规则引擎与 Skill 技能体系
光靠大模型自由发挥,结果会有随机性,不同 PR 的审查风格不稳定。Hermes 解决这个问题的方式是加了一层规则引擎和技能体系。规则引擎沿用类似 ESLint 的思路,你可以在配置里声明“禁止检测到 console.log 时通过”“SSH 私钥文件不得进入仓库”“TODO 注释不得超过 3 个”这类显式规则,规则命中后不会被模型讨论,直接输出为必须处理的问题。
更进阶的是 Skill 技能体系,这也是我觉得 Hermes 比较有想象力的部分。一个 Skill 就是针对特定框架或业务的审查知识包,例如常见的sql-injection-guard、react-hooks-deps、api-breaking-change-detector。每个 Skill 包含触发条件、检查清单和参考示例,Hermes 会识别当前 PR 涉及的技术栈,自动加载对应 Skill 参与审查。团队内部也可以沉淀自己的 Skill,把踩过的坑固化成自动检查项,这是纯人工评审做不到的积累方式。
2.4 可配置的审查范围与严重级别
同一个仓库里,不同路径的代码重要程度完全不同。核心模块的改动需要严格审查,文档和示例代码随便看看就行。Hermes 配置里支持paths和ignore_paths做路径级策略,也支持按严重级别设置 PR 状态。
例如我会在配置里规定:
review_policy: paths: src/core: severity_threshold: error required_modules: [security, performance, compatibility] docs: severity_threshold: warning skip_review: true tests: severity_threshold: info check_only: true这样核心目录的 PR 一旦出现 error 级问题,Hermes 会通过 GitHub 的 commit status 阻止合并(需要配合分支保护规则);文档改动则干脆跳过,避免浪费模型调用额度。精确控制审查范围,不仅是为了质量,也是在控制成本——大模型 API 按 token 计费,无意义的全量审查会烧掉不少预算。
3. 实战:把 Hermes 接入 GitHub 仓库的完整流程
3.1 前置准备:仓库、权限与模型 Key
接入前需要准备四样东西:一个 GitHub 仓库、一个具有写入权限的 Personal Access Token、一个模型 API Key,以及仓库的 CI 执行环境。如果只是个人项目体验,GitHub 免费额度足够跑 Action;如果是公司私有仓库,需要确认 Runner 能正常访问模型 API 的地址。
Token 的权限范围按最小化原则配置,只需要repo读写权限和pull_requests: write权限,不要用最高权限的 token 跑到生产环境里。在仓库设置的Secrets and variables > Actions里添加HERMES_GITHUB_TOKEN和OPENAI_API_KEY(如果接 DeepSeek 就配置DEEPSEEK_API_KEY,名称取决于你用的模型服务)。
有一点要提醒:不要把 Token 直接写进 workflow 文件。哪怕仓库是私有的,workflow 日志也有泄露风险,统一走 Secrets 是比较稳的做法。
3.2 用 GitHub Actions 一键接入 Hermes
最快的方式是用别人已经封装好的 Hermes GitHub Action。在仓库根目录创建.github/workflows/hermes-review.yml:
name: Hermes PR Review on: pull_request: types: [opened, synchronize, ready_for_review] pull_request_review_comment: types: [created] jobs: hermes-review: runs-on: ubuntu-latest permissions: contents: read pull-requests: write issues: write steps: - name: Checkout uses: actions/checkout@v4 - name: Run Hermes Review uses: your-registry/hermes-action@v1 with: github_token: ${{ secrets.HERMES_GITHUB_TOKEN }} model_api_key: ${{ secrets.DEEPSEEK_API_KEY }} model: deepseek-chat config_path: .hermes.yml几个配置项的实际意义:types指定在 PR 创建、内容更新、转为 ready 时触发审查;permissions的pull-requests: write是必须的,否则 Hermes 无法创建审查评论;model用来切换底层模型,示例里用的是 DeepSeek 的 chat 模型,你也可以换成其他兼容接口。
第一次推上去后,随便开一个测试 PR,正常情况下几十秒内 Hermes 就会在 PR 下面回复一条审查 summary。等得久多半是 model 接口响应慢,可以调整超时配置。
3.3 配置文件详解:审查规则、路径过滤与输出格式
Hermes 的核心配置放在.hermes.yml里,我维护的那个仓库经过多轮调校,最终长这样:
version: "1.0" model: provider: deepseek name: deepseek-chat temperature: 0.3 max_tokens: 4000 review: languages: [python, javascript, typescript, go] ignore_paths: - "*.lock" - "node_modules/**" - "dist/**" - "*.min.js" severity_labels: error: "❌ 必须修复" warning: "⚠️ 建议修改" info: "💡 可优化" rules: - pattern: "console\\.log" level: warning message: "不要在生产代码中保留 console.log,请使用统一日志方案。" - pattern: "(api[_-]?key|secret|token)\\s*=\\s*['\"][^'\"]+['\"]" level: error message: "疑似硬编码敏感信息,请改用环境变量。" - pattern: "TODO|FIXME" level: info message: "存在未处理标记,请确认是否遗留。"temperature我建议设置到 0.2~0.4 之间。设置太高,模型输出飘,审查结论时好时坏;太低则缺乏灵活性,面对非常规写法容易误报。ignore_paths一定要配,否则每次 PR 都会把package-lock.json这种上千行的文件喂给模型,既慢又费 token。
输出格式这里有个容易被忽略的细节:Hermes 可以同时输出 review comment 和 commit status。在 GitHub 上,review comment 是给人看的,但真正能“卡住合并”的是 commit status。你需要配合分支保护规则,把 Hermes 生成的 status check 设为 required。这样只要 Hermes 给出 error 级问题,PR 的 Merge 按钮会被 GitHub 自动置灰,从流程上保证问题必须被处理。
3.4 本地 CLI 调试:不 push 也能跑
改配置的时候,如果每次都推到 GitHub 触发 Action,效率太低了。Hermes 提供本地 CLI 模式,可以先在本地验证配置效果再上 CI。安装方式很直接:
curl -sSL https://get.hermes.example.com/install.sh | bash本地跑审查需要配置环境变量:
export HERMES_GITHUB_TOKEN=ghp_xxx export DEEPSEEK_API_KEY=sk-xxx hermes review --pr 123 --config .hermes.yml它会把这次审查结果输出到终端,同时生成一份hermes-report.json,内容包含问题列表、对应文件行号、置信度、修复建议。我会先看这份 JSON 里的误报比例,再决定要不要调整规则。比如我第一次启用正则规则时,api这个词在英文注释里频繁命中,后来加上了边界匹配才消停。
个人体会:本地调试模式是 Hermes 在工程化上做得比较贴心的设计。审查工具不像编译器,它在改动配置后的行为变化不容易预测,能在本地快速跑一轮,调试成本会低很多。
3.5 让审查结果真正被团队采纳
工具接入不难,难的是让团队真正用起来。一开始我直接把 Hermes 全量接入,结果三天后被同事抱怨“机器人话太多了,刷屏”。后来我调整了策略,效果好了不少。
第一个调整是分级放量。先用一周观察模式,Hermes 只发评论、不设门禁,让大家感受它的输出质量;等大家对它的建议习以为常了,再把 error 级问题设成卡点。第二个调整是建立反馈通道,同事觉得某条评论是误报,可以在评论下回复/skip或/dismiss,Hermes 支持按指令忽略同位置的后续评论。第三个调整是把审查范围按目录收敛,核心模块卡严格,非核心模块只提示不拦截。事实证明,优先照顾人的体验,工具才能融进流程,否则再强的能力也会被抵制。
4. 高频问题排查与避坑实录
4.1 Action 跑不起来:权限、超时与 Auth 报错
接入第一天大概率会碰到问题。最常见的 Action 报错是权限不足:Resource not accessible by integration。这不是 Hermes 的问题,是你忘了在 workflow 里加permissions: pull-requests: write,或者 GitHub Token 作用域设置不对。
真正排查思路是这样的:先在本地用同样的 token 调一次 GitHub API,确认 token 有效;再看 workflow 的permissions节点是否声明了写权限;最后看仓库 Settings 里有没有把 Action 的权限级别限制成 read-only。顺着这条链查,几分钟就能定位。
另一个常见现象是 Action 运行时间超过一小时被 GitHub 杀掉。大 PR 加上模型响应慢,很容易超时。我的解决办法是把审查拆到不同 job 并行:一个 job 跑静态规则、一个 job 跑模型分析,最后汇总。实际效果是整体时间从四十多分钟降到十几分钟,体验提升明显。
4.2 审查噪音太大,怎么调教 Hermes
AI 审查工具最劝退人的就是误报。印象比较深的一次,Hermes 在某个 PR 里连续给了 14 条评论,我逐条看下来,真正有价值的只有 2 条,剩下都是无伤大雅的“建议改成单例模式”“这个变量可以更短”之类,同事当场表示要把机器人关掉。
后来我总结了一套调校方法。先看hermes-report.json里的置信度字段,把低于阈值的直接过滤掉。再针对反复误报的同类问题写豁免规则,比如项目里约定使用any类型的地方,就在配置里声明豁免。最后给每条评论设置分级,把风格类建议降级为 info,只有正确性和安全问题才升级为 error。三连操作之后,有效评论率从不到 20% 提到了 60% 以上。
还有一个思路:在 prompt 层面约束模型的语气和关注点。你可以自定义 Hermes 的 system prompt,明确写“不要啰嗦、不要给泛泛的建议、只关注会导致功能错误或维护困难的问题”,模型输出会明显收敛很多。模型本身是可调的,不要怕调 prompt 和温度参数。
4.3 大型 PR 超时或上下文截断
代码库大了以后,一个 PR 改 30 个文件很正常,但大模型的上下文窗口有限,不可能把全部变更一次性塞进去。Hermes 的分块策略虽然能解决大部分情况,但某些互相调用的核心模块同时改动时,分析结果还是会显得“只见树木不见森林”。
我的处理办法是在流程层做拆分:要求团队尽量把大 PR 拆成多个独立合并单元,每个 PR 的变更量控制在 400 行 diff 以内。这个约束一开始靠人肉沟通,后来写进了 CONTRIBUTING 文档,并且配置了一个检查 job,PR 变更量超过阈值就自动警告。效果是所有工具的审查质量都提升了,不只是 Hermes,人工评审压力也小了很多。工具倒逼流程改进,这一点是我没预料到的收获。
4.4 本地 merge 冲突后,Hermes 的审查如何衔接
热知识:CI 里的审查基于 push 的代码,而不是你在本地合并后的结果。所以当你的 PR 因为主分支更新产生冲突时,Hermes 审查的是旧代码,结论可能已经失真。Git 里 PR 被插队导致的冲突,处理步骤其实很标准:先同步最新主分支,再 rebase 自己的分支,解决冲突后 force push。此时 workflow 的synchronize事件会触发新一轮审查,Hermes 会根据新代码重新生成 summary,并保留上一轮评论的上下文。
需要留意的是,rebased 之后行号基本都对不上,旧评论里引用的位置可能是错的。我习惯在做完 rebase 后,在 PR 里手动回复一条@hermes re-review指令强制触发一次全量重审,而不是依赖增量更新。这个细节在协作频繁的项目里很实用。
4.5 多语言项目适配与私有大模型接入
团队项目往往多语言并存,前端 TS、后端 Go、脚本 Python 混在一个仓库里。Hermes 的默认提示词对主流语言覆盖得不错,但一些冷门语言或内部框架的审查质量明显偏低。解决办法是给不同语言配独立的 Skill 或提示词,例如 Python 项目重点查 GIL 误用和类型注解,Go 项目重点查错误处理和并发安全。
私有大模型这块,我试过用本地 Ollama 跑小型模型,效果一般,14B 以下的小模型做代码审查能看出明显的“智力不足”。如果要自托管,建议至少用 70B 级别的量化模型,或者直接走 DeepSeek 这类 API,性价比和效果平衡得比较好。从我实测看,模型选择对审查质量的权重非常大,值得花时间调。
最后再说一个容易被忽视的点:Hermes 审查和公司代码合规的关系。如果公司对代码外发给第三方模型有合规要求,记得选私有化部署或者与供应商签订数据协议的方案,或者直接接公司内网模型网关。建议在接入前和合规、安全团队确认一遍,别等功能上线了再被叫停。
我在实际项目里用了大半年 Hermes,最直观的感受是:它没有让我变成一个不用看代码的“甩手掌柜”,但确实把我从大量重复性的、低价值的检查工作里解放出来了。现在我审 PR 的效率大概比以前快出一倍,而且因为有一道机器防线在前面挡着,我反而更能静下心来看那些真正需要人来判断的设计问题。如果你也在被 PR 评审的琐碎消耗,不妨按上面的流程试一次。我觉得工具这东西,用不用是一回事,值不值得用,试两周就有答案了。