- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 引言 — 为什么是现在的 AI 代码审查
- AI 代码审查是什么
- 开源生态 — 现在有些什么
- Git diff 是如何被分析的
- 缺陷检测 — 擅长找什么,又容易漏掉什么
- 与人工审查的角色分工
- 准确率与误报管理
- CI 流水线集成
- 实务引入路线图
- 安全审查这一特殊领域
- 开发者体验与信任问题
- 陷阱与批判性视角
- 提示词与规则的结合 — 混合架构
- 提示词设计的实际操作
- 大型仓库中的可扩展性
- 度量与持续改进
- 最佳实践小结
- 亲自使用开源工具时的实务考量
- 智能体运行环境视角 — 代码即接口
- 场景案例 — 适合哪些团队,不适合哪些团队
- 结语
- 参考资料
引言 — 为什么是现在的 AI 代码审查
2026 年上半年,GeekNews 和 Hacker News 的首页格外频繁地出现「AI 代码审查」这个关键词。尤其引发热议的是两条消息 — 阿里巴巴将内部大规模使用的代码审查系统开源,以及多家创业公司争相在 GitHub Marketplace 上推出自动审查机器人。
就在两年前,「LLM 审查代码」还更像是一个演示玩具。把整段 diff 贴进提示词,说一句「帮我审查这段代码」,得到的往往是听起来像模像样的句子,但真正被团队看重的实际缺陷却被漏掉,反而只挑一些无关紧要的风格问题。而现在情况不同了。随着上下文窗口变大,以及对整个仓库做索引、把相关代码一并带入的检索技术走向成熟,AI 审查的信噪比已经提升到了实务中真正可用的水平。
本文将梳理 AI 代码审查究竟在做什么、有哪些开源工具可用,以及应该如何把它融入团队工作流,才能在不取代人工审查者的前提下发挥作用。核心主张只有一个:AI 代码审查不是「代替人按下批准按钮的工具」,而是「减轻人工审查者认知负荷的过滤器」。
AI 代码审查是什么
传统代码审查是这样进行的。开发者打开一个 Pull Request,同事阅读 diff、留下评论、展开讨论,然后批准或要求修改。这个流程是软件质量的最后一道安全网,但同时也是瓶颈。审查者很忙,大型 PR 会迅速耗尽注意力,而重复出现的指摘(命名、遗漏空值检查、日志级别)会让审查者身心俱疲。
AI 代码审查在这条流水线上加了一道自动化的第一遍筛查。PR 一旦打开,机器人就会读取 diff,从仓库中拉取相关上下文,并对潜在问题留下评论。人工审查者看到的是机器人已经过滤过的代码,认知负荷因此下降。
从概念上说,AI 审查者所做的事大体可分为三类。
- 缺陷检测:查找空引用、边界条件错误、资源泄漏、竞态条件、错误的异常处理等逻辑性 bug。
- 规约强制:检查是否遵守团队的编码规约、命名规则、架构模式,也包括静态代码检查工具(linter)抓不到的「语义层面」的规约。
- 语境说明:指出变更对其他部分的影响、缺失的测试,以及需要补充文档的地方。
开源生态 — 现在有些什么
截至 2026 年,开源的 AI 代码审查工具大体分为两类。一类是大公司将内部工具开源,另一类是社区打造的轻量级框架。
最受关注的案例,是那些已经在大型组织中实际应用于数十万个 PR 的审查系统被开源出来。这类工具不只是「把 diff 丢给 LLM」这么简单,其中包含仓库索引、跨文件依赖分析、规则过滤与 LLM 判断相结合等工程实践。在大规模使用场景中被验证过,正是它们获得信任的依据。
主要开源项目的对比如下。
| 项目类型 | 优势 | 需要注意的点 |
|---|---|---|
| 大公司开源型 | 大规模验证、仓库索引、规则与 LLM 结合 | 配置繁重,预设特定基础设施 |
| 轻量级 CLI 封装 | 引入简单,易于接入 CI | 上下文浅,误报较多 |
| PR 机器人集成型 | GitHub/GitLab 原生体验 | 厂商锁定,API 成本 |
| 本地执行型 | 代码不外泄,隐私性好 | 模型质量受本地硬件限制 |
选择标准取决于组织的隐私要求、仓库规模,以及已经在用的 CI 平台。对于代码禁止外流的组织而言,本地执行型或以自托管模型为主的工具事实上是唯一的选择。
Git diff 是如何被分析的
AI 审查的出发点是 diff。但仅凭 diff 是不够的。来看下面这段代码。
def apply_discount(price, rate):
return price - price * rate
只看这个函数本身,似乎没有问题。但 rate 是否可能超过 1.0、调用方是否做了校验、是否允许负数价格,这些都处在 diff 之外的语境中。因此成熟的 AI 审查者会把 diff 周边的代码、调用点、相关测试一并喂给模型。
典型的分析流水线要经过以下几个阶段。
PR 事件
|
v
+--------------+ +------------------+ +-----------------+
| diff 解析 | --> | 上下文检索 | --> | LLM 判断请求 |
| (按 hunk) | | (相关文件/符号) | | (结构化提示词) |
+--------------+ +------------------+ +-----------------+
|
v
+------------------+
| 后处理过滤 |
| (抑制误报) |
+------------------+
|
v
以 PR 评论形式发布
diff 会按 hunk 拆分,提取每个 hunk 所涉及的符号(函数、类、变量),再从仓库索引中查找这些符号的定义和使用处,一并加入提示词。这一检索步骤决定了 AI 审查质量的一半以上。
缺陷检测 — 擅长找什么,又容易漏掉什么
有一些缺陷类型是 AI 审查者确实擅长发现的。来看下面这个例子。
func readConfig(path string) (*Config, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
data, err := io.ReadAll(f)
if err != nil {
return nil, err
}
return parse(data)
}
这里 AI 审查者会立刻指出 f.Close() 从未被调用,导致文件句柄泄漏。像资源泄漏、遗漏空值处理、忽略错误这类模式在训练数据中很丰富,因此检测率很高。
反过来,AI 容易漏掉的东西也很明确。
- 领域规则违反:像「这个账户的余额不能为负」这样的业务规则,仅凭代码本身是无法得知的。
- 性能回归:如果不了解真实负载和数据规模,就很难判断一个 O(n²) 循环是否构成问题。
- 架构判断:诸如「这段逻辑应该放在领域层而不是服务层」这类判断,取决于团队内部的默契共识。
也就是说,AI 擅长局部的、模式化的缺陷,而在全局的、依赖语境的判断上较弱。理解这条边界,是引入成功与否的关键。
与人工审查的角色分工
核心原则是这样的:AI 审查不取代人工审查,而是清理人工审查的前置环节。
按下面这样划分角色是有效的。
| 项目 | AI 审查者 | 人工审查者 |
|---|---|---|
| 资源泄漏、空值检查 | 强(自动) | 仅需确认 |
| 编码规约 | 强(自动) | 可委托 |
| 测试覆盖率指摘 | 一般 | 需判断 |
| 业务逻辑正确性 | 弱 | 核心职责 |
| 架构方向 | 弱 | 核心职责 |
| 变更的意图与权衡 | 弱 | 核心职责 |
这样划分之后,人工审查者可以专注于机器无法做出的判断,重复性的指摘则交给机器人。实际上,许多团队会定下这样一条规则:"即便是 AI 通过的 PR,也必须有一名人类做最终批准。" 明确划出「AI 只是评论者,不是批准者」这条界线,非常重要。
准确率与误报管理
引入 AI 代码审查时最常见的失败原因,不是准确率,而是误报(false positive)。如果机器人每个 PR 都留下 10 条评论,其中 8 条毫无意义,开发者很快就会把机器人的评论整体忽略掉。一旦如此,真正重要的指摘也会一并被埋没。这被称为「警报疲劳(alert fatigue)」。
抑制误报的实务策略包括以下几种。
- 置信度阈值:模型给出低置信度判断时,不发布评论。
- 类别过滤:抑制风格类评论,只发布缺陷类评论,以降低噪音。
- 去重:linter 已经能抓到的问题,不让 AI 重复指出。
- 反馈闭环:学习被开发者标记为「没有帮助」的模式,此后加以抑制。
量化准确率时要看两个指标。一个是机器人所留评论中实际被采纳处理的比例(精确率),另一个是人工事后发现的 bug 中机器人曾提前捕捉到的比例(召回率)。大多数团队会把精确率置于召回率之上 — 因为比起漏掉问题,失去信任的代价更致命。
CI 流水线集成
实际集成通常是把机器人挂到 CI 事件上。下面是一个概念性的 GitHub Actions 工作流示例。
name: ai-code-review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run AI review
env:
MODEL_API_KEY: SECRET_PLACEHOLDER
run: |
ai-reviewer \
--base "origin/main" \
--head "HEAD" \
--max-comments 5 \
--min-confidence 0.7
这里有几个实务要点。需要用 fetch-depth: 0 拉取完整历史,才能算出正确的 diff 基准。用 max-comments 限制每个 PR 的评论数量,防止噪音。用 min-confidence 过滤掉低置信度的评论。而 API 密钥这类敏感值,绝不能硬编码在代码里,而要以 secret 的形式注入。
另一个重要决定,是是否把审查设为「阻断式(blocking)」。在引入初期,让机器人的评论不阻断合并,是更安全的做法。如果在信任建立之前机器人就阻断合并,会引发团队的抵触。
实务引入路线图
引入新工具时常见的失误,是从一开始就全面铺开。建议采用以下分阶段的方法。
- 观察模式:机器人留下评论,但没有人被强制遵循。这一阶段用来测量误报率。
- 选择性启用:只启用特定类别(例如安全、资源泄漏),其余关闭。
- 团队调优:把团队规约反映到提示词或规则中,并抑制被反复忽略的评论模式。
- 落地固化:机器人赢得信任后,将其提升为必需检查项,但最终批准权仍然属于人。
每个阶段最好都用开发者问卷来确认实际体感的有用程度。即便指标看起来不错,如果开发者感到厌烦,这次引入就算失败。
安全审查这一特殊领域
在 AI 代码审查的诸多用途中,安全领域尤其值得关注。2026 年上半年 HN 上关于 AI 自动化模糊测试和漏洞赏金成果的讨论成为话题,也是这股潮流的一部分。这是因为 AI 在代码中发现漏洞模式的能力,已经达到了实用水平。
从安全角度看,AI 审查擅长抓到的问题包括以下几类。
- 硬编码的敏感信息:API 密钥、密码、令牌被原样写死在代码里的情况。
- 注入类漏洞:用户输入未经校验就进入查询或命令的模式。
- 不安全的反序列化:把不可信数据原样还原成对象的代码。
- 弱加密:过时的算法或不当的密钥管理。
下面是一个 AI 会立刻指出的典型漏洞模式。
def get_user(user_id):
query = "SELECT * FROM users WHERE id = " + user_id
return db.execute(query)
如果这里的 user_id 是用户输入,就暴露在 SQL 注入风险之下。AI 审查者会看到这种字符串拼接模式,并建议改用参数绑定。这类模式在训练数据中很丰富,因此检测率很高。
但即便在安全领域,局限也很明显。AI 擅长抓局部模式,却容易漏掉跨多个组件的复合型漏洞,或业务逻辑缺陷(权限绕过、利用竞态条件的二次支付)。因此即便在安全审查上,AI 也只是第一道扫描器,无法取代专业的安全审查。
开发者体验与信任问题
AI 代码审查成败与否,不只取决于技术,也取决于开发者体验。无论机器人多么准确,只要开发者反感,引入就会失败。这里起作用的是一种微妙的心理。
第一是语气。如果机器人的评论以命令式口吻说「这是错的」,开发者会变得有防御性。像「这里看起来可能会泄漏文件句柄」这样带建议性的语气,接受度要高得多。人与人之间的代码审查礼仪,同样适用于机器人。
第二是时机。如果机器人在 PR 打开几分钟后才留下评论,开发者往往已经转去做别的工作了。即时反馈的效果要好得多。因此缩短审查延迟很重要。
第三是可解释性。如果机器人只说「把这里改一下」而不给出理由,开发者不会信服。必须同时说明为什么这是个问题、在什么情况下会出问题,信任才会逐渐建立。没有依据的指摘会被当作噪音对待。
归根结底,选择 AI 代码审查工具时,开发者体验和准确率同样重要。好的工具既准确又有礼貌,既快速又解释充分。
陷阱与批判性视角
不应该无批判地全盘接受 AI 代码审查。下面梳理几个根本性的局限与风险。
过度信任的风险。 机器人说「没有问题」时,人往往会开始草草浏览。这是自动化制造的经典陷阱。团队文化中必须刻入这样一点:机器人的沉默不等于安全的保证。
隐私与知识产权。 把 diff 发送给外部 API,意味着源代码离开了组织。合同和监管往往禁止这种做法。自托管模型或本地执行是替代方案,但存在质量上的取舍。
表面优化。 让机器人满意的代码,未必是好代码。已经观察到这样的副作用:开发者为了让机器人评论消失,添加毫无意义的防御性代码。一旦开始「刷指标」,这个工具就变成了危害。
审查的社会功能丧失。 代码审查同时也是知识共享和指导新人的场合。把重复性的指摘交给机器人是好事,但如果审查完全沦为机械式的检查站,团队的学习会被削弱。
成本。 用大模型审查每一个 PR,API 成本会迅速累积。需要根据仓库规模和 PR 频率,提前算清成本模型。
提示词与规则的结合 — 混合架构
成熟的 AI 审查工具并不单纯依赖 LLM。它们采用把确定性规则与概率性的 LLM 判断结合起来的混合架构。理由很明确。LLM 灵活但一致性较差,规则一致但僵化。把两者的优点结合起来,才在实战中行得通。
典型的混合流程由以下几个阶段构成。
变更的代码
|
v
+------------------+
| 1. 规则过滤 | <- 先过滤掉确定的问题
| (linter、静态) | (例如硬编码密钥、禁用 API)
+------------------+
|
v
+------------------+
| 2. 风险打分 | <- 判断哪个 hunk 风险高
| (变更规模/位置) |
+------------------+
|
v
+------------------+
| 3. LLM 深度判断 | <- 只对高风险部分用昂贵模型
| (选择性应用) |
+------------------+
这套结构的核心是「不对所有东西都用 LLM」。硬编码的敏感信息或明显的反模式,静态规则能以远低的成本、更准确地捕捉到。LLM 只被选择性地投入到规则无法捕捉的微妙逻辑缺陷上。这样一来,成本和误报都能同时下降。
风险打分阶段同样重要。要优先处理变更规模大、触及认证/支付/安全等敏感路径、或测试覆盖率低的 hunk。为一个无关紧要的拼写修正调用大模型,是一种浪费。
提示词设计的实际操作
AI 审查质量的相当一部分,取决于提示词设计。糟糕的提示词像「帮我审查这段代码」一样含糊。好的提示词会明确角色、语境、输出格式和抑制规则。
一个有效提示词应当包含的要素如下。
- 角色指定:告诉模型该从哪种视角(安全、性能、可读性)去看。
- 注入团队规约:把这个团队的编码规约作为语境放进去。
- 输出结构化:要求每条评论都写明文件、行号、严重程度、依据。
- 抑制指令:预先屏蔽噪音来源,例如要求不要做风格方面的指摘。
强制输出为结构化格式,能让后处理变得容易。例如可以要求模型以如下 JSON 形式作答。
{
"comments": [
{
"file": "config.go",
"line": 42,
"severity": "high",
"category": "resource-leak",
"message": "file handle not closed on error path",
"confidence": 0.9
}
]
}
这样结构化之后,按置信度过滤、按严重程度排序、按类别去重这些后处理,全都可以用程序完成。用自由文本回答是做不到这种控制力的。
大型仓库中的可扩展性
在小项目里运转良好的 AI 审查,往往在数百万行代码的单体仓库(monorepo)里崩溃。可扩展性问题大致有三个。
第一是索引成本。把整个仓库做成嵌入索引,初始成本和维护成本都很大。每当代码变化就需要做增量索引,一旦这一步落后,检索质量就会下降。
第二是上下文预算。无论多想把相关代码都塞进去,模型的上下文窗口终究有限。决定放进什么、舍弃什么的检索排序,在大规模场景下显得格外重要。
第三是并发。在大型组织里,每秒都有数十个 PR 打开。审查请求一旦堆积,队列就会积压,开发者要等上好几分钟才能看到机器人评论。审查太慢会打断开发节奏,因此实时性很重要。
正因为这些问题的存在,大公司开源出来的工具才有价值。它们已经在大规模场景中解决过这些问题,而那些解法就沉淀在代码里。
度量与持续改进
引入只是开始。要持续改进 AI 审查,需要一套度量体系。值得追踪的指标如下。
| 指标 | 含义 | 好的方向 |
|---|---|---|
| 评论采纳率 | 机器人评论中被采纳处理的比例 | 越高越好 |
| 评论忽略率 | 被人忽略的比例 | 越低越好 |
| 事后发现的 bug | 机器人漏掉、之后才暴露的 bug | 越低越好 |
| PR 审查耗时 | 从打开到批准的时间 | 越短越好 |
| 开发者满意度 | 基于问卷的体感 | 越高越好 |
把这些指标做成仪表盘定期查看,就能看出哪一类评论经常被忽略、机器人在哪些团队里效果好。忽略率高的类别应予以抑制,采纳率高的类别应予以强化。没有这个反馈闭环,工具就会停滞不前。
最佳实践小结
把到目前为止的内容压缩成一份实务清单:
- 让 AI 审查始终停留在评论者的角色,批准权留给人。
- 从观察模式开始,先测量误报率。
- 把精确率置于召回率之上,以守住信任。
- linter 能抓到的问题,不要让 AI 再去做,避免角色重叠。
- 如果存在隐私限制,考虑自托管。
- 用评论数量和置信度阈值来控制噪音。
- 管理团队文化,不要把机器人的沉默当作安全的保证。
亲自使用开源工具时的实务考量
想要自行引入开源 AI 代码审查工具的团队,会面对一些实务性的决定。与商业 SaaS 不同,开源在给予自由的同时,也把责任一并交了过来。
第一是模型选择与托管。开源工具通常不绑定某一个特定模型,可以接入多种后端。需要决定是用外部 API、自托管模型,还是根据情况混用两者。如果隐私很重要,就意味着自托管,但运维负担也随之增大。
第二是仓库索引管理。为了保证检索质量,必须对仓库做索引,而这个索引存放在哪里、如何更新,就成了一项运维任务。需要自行搭建一条每当代码变化就增量更新的流水线。
第三是升级与维护。开源项目演进很快。新版本一旦改变了提示词或规则,审查结果可能随之变化,因此升级前需要做回归测试。
把这些考量整理成表格如下。
| 决策 | 偏向自托管 | 偏向外部 API |
|---|---|---|
| 隐私性 | 强 | 弱 |
| 运维负担 | 大 | 小 |
| 模型质量 | 依赖硬件 | 容易用上最新模型 |
| 成本结构 | 固定基础设施 | 按用量计费 |
这里没有标准答案。选择会随组织的约束条件和优先级而变化。但如果选择了开源,就必须清楚地认识到:这不是「免费」,而是「以承担运维责任为代价换取控制权」。
智能体运行环境视角 — 代码即接口
2026 年的一大趋势,是「代码作为智能体运行环境(agent harness)」这一视角。随着 AI 编码智能体的普及,代码库不再只是给人看的东西,也成了智能体读取和操作的对象。这一变化,也在改变 AI 代码审查的定位。
在智能体写代码的时代,审查的流程会发生微妙的变化。不再只是机器人审查人写的代码,而是出现了这样一种多层结构:一个机器人审查另一个机器人写的代码,再由人做最终审查。
AI 智能体生成代码
|
v
AI 审查者做第一遍审查
|
v
人做最终判断
|
v
合并
在这种结构下,会浮现出一个有趣的问题:AI 审查 AI 写的代码,有意义吗?答案是「有」。因为生成模型和审查模型有着不同的视角,也会犯不同的错误,一个模型漏掉的东西,另一个模型可能捕捉到。这就好比人类作者和人类审查者拥有不同的眼光一样。
不过这种结构也有风险。如果人逐渐被推到后台,最终审查变成走过场,就可能出现没有任何人真正理解代码却被合并进主干的情况。这正是在 LLM 时代「深入理解」的价值重新被重视的原因。工具越是进步,人类真正理解代码的能力,反而变得越珍贵,这是一种悖论。
场景案例 — 适合哪些团队,不适合哪些团队
即便是同一个工具,效果也会因团队情况的不同而天差地别。来看几个场景。
快速成长的创业公司。 在新人多、代码风格参差不齐的团队里,AI 审查帮助很大。重复性的规约指摘交给机器人代劳,节省了资深工程师的审查时间,而新人也能通过即时反馈迅速掌握团队风格。
成熟的大型组织。 在已经建立起严格审查文化和静态分析体系的团队里,AI 审查的边际效用较小。因为机器人指出的问题,大多数早就被 linter 抓到了。对这样的团队来说,把 AI 窄化地投入到 linter 无法处理的领域(比如逻辑缺陷检测)会更合适。
开源项目。 在有着各种背景的贡献者提交 PR 的开源项目中,AI 审查能极大减轻维护者的负担。贡献者先从机器人那里得到第一轮审查、自行打磨之后再交给维护者,维护者就能专注在本质性的判断上。
由此可见,工具的价值并非绝对,而是依赖语境的。仅仅因为「大家都在用,所以我们也用」而引入,很容易失望。正确的顺序是先弄清楚自己团队的瓶颈究竟在哪里,再判断 AI 能否解决那个瓶颈。
结语
截至 2026 年,AI 代码审查正处在从「实验」迈向「基础设施」的拐点上。开源化降低了准入门槛,大型组织的验证案例也建立起了信任。但工具成熟,不代表用好它就会自然而然地发生。
最大的错误,是把 AI 视为人的替代品。AI 代码审查真正的价值,不在于消灭人工审查者,而在于减轻他们的认知负荷,让他们能专注在机器做不到的判断上。重复性的指摘交给机器,语境和权衡的判断留给人。当这种分工真正落地时,团队会变得既更快,又更审慎。
工具已经准备好了。剩下的,是如何把它融入团队文化。
参考资料
- Hacker News: https://news.ycombinator.com/
- GeekNews (Hada): https://news.hada.io/
- GitHub Actions 文档: https://docs.github.com/en/actions
- GitHub REST API (Pull Requests): https://docs.github.com/en/rest/pulls
- GitLab CI/CD: https://docs.gitlab.com/ee/ci/
- Git diff 文档: https://git-scm.com/docs/git-diff
- OWASP 代码审查指南: https://owasp.org/www-project-code-review-guide/
- Google Engineering Practices (Code Review): https://google.github.io/eng-practices/review/