每个错误都成为规则:
diffray 如何从您的反馈中学习

为什么没有反馈学习的 AI 代码审查只是一个昂贵的噪音生成器

2026年1月9日
10 分钟阅读

Claude Code 的创造者 Boris Cherny 最近分享了他的工作流程,其中一句话在开发者社区引起了轰动:"每当我们看到 Claude 做错事,我们就把它添加到 CLAUDE.md 中,这样 Claude 下次就知道不要这样做了。"

产品负责人 Aakash Gupta 完美地总结道:"每个错误都成为规则。"团队与 AI 合作的时间越长,AI 就越聪明。

这正是 diffray 构建的理念。今天,我们将向您展示它是如何在底层运作的。

问题:上下文污染扼杀审查质量

在讨论规则之前,我们需要了解 AI 代码审查的主要技术挑战——上下文污染

Anthropic 的研究表明,LLM 像人类一样,随着上下文窗口的填充而失去焦点。修正不断累积,旁枝讨论堆叠,过时的工具输出仍然存在。结果是可预见的:

误报

AI 发现不存在的"问题"

幻觉

虚构的 bug 和不存在的模式

目标漂移

审查变得越来越不相关

JetBrains Research(2025年12月)量化了这一点:代理上下文增长如此之快以至于变得昂贵,但并没有带来显著更好的任务性能。更多上下文 ≠ 更好的结果。

解决方案:具有隔离上下文的专业子代理

Boris Cherny 使用子代理作为"最常见工作流程的自动化封装"。他的理念是:

"可靠性来自专业化加上约束"

他的代码审查命令不是使用一个全知的审查者,而是生成多个并行代理,各有不同的职责:

1.一个代理检查风格指南
2.另一个分析项目历史以理解模式
3.第三个标记明显的 bug
4.然后五个额外的代理专门在初始发现中寻找漏洞

这个对抗层至关重要。次级代理通过结构化的怀疑主义质疑第一轮的发现,消除误报。

用 Cherny 的话说,结果是:"找到所有真正的问题,没有虚假的。"

技术原理

当主代理委托给子代理时,会生成一个全新的上下文窗口,仅包含任务描述和相关参数。子代理可以广泛探索——在搜索代码时消耗数万个 token——但只返回一个1,000-2,000 token 的精简摘要

这在允许深度分析的同时保持了主代理的专注。

主代理(干净的上下文)
🛡️
安全
隔离的上下文
风格
隔离的上下文
性能
隔离的上下文
🏗️
架构
隔离的上下文
精简的摘要(各1-2K token)

在 diffray,我们使用30 多个专业代理,每个都专注于特定领域:安全、性能、代码风格、架构模式等。每个代理在隔离的上下文中运行,只返回实质性的发现。

规则制定:将反馈转化为知识

现在进入主题。子代理解决了上下文问题。但是如何让 AI 从您的修正中学习呢?

CLAUDE.md 模式

在 Claude Code 中,团队在其代码库中维护一个 CLAUDE.md 文件——项目的某种"宪法"。该文件在每次会话时自动加载到上下文中。

但有一个关键限制。HumanLayer 的研究表明,Claude Code 的系统提示已经包含约 50 条指令,而前沿 LLM 只能可靠地遵循总共150-200 条指令。随着数量增加,指令遵循质量均匀下降。

这意味着:你不能简单地倾倒 500 条规则然后期待奇迹。

知识的三个层次

有效的规则在三个层次上编码知识:

是什么(项目地图)

## 技术栈
- 后端:Python 3.11、FastAPI、SQLAlchemy
- 前端:React 18、TypeScript、TailwindCSS
- 数据库:PostgreSQL 15

为什么(架构决策)

## 为什么我们不使用 ORM 进行复杂查询
历史:ORM 在报告中生成 N+1 查询。
决定:分析用原生 SQL,ORM 仅用于 CRUD。

怎么做(流程)

## 提交前
- 运行 `make lint` — 必须无错误通过
- 运行 `make test` — 覆盖率不能下降

手动方法的问题

手动规则维护可以工作...只要您的团队小而有纪律。但实际上:

开发人员忘记更新规则

规则比代码过时得更快

隐式约定保持隐式

关键人员离开时部落知识消亡

diffray 如何自动化规则制定

diffray 颠覆了这个过程。不是手动编写规则,您只需对审查提供反馈

学习循环

📝
PR
🔍
diffray 审查
💬
开发者反馈
🧠
分析
🔬模式提取
哪里出错了?
⚙️规则生成
创建特定规则
验证
在 PR 历史上测试
下一个 PR 应用该规则

步骤 1:您提供反馈

给 diffray 评论点了踩?回复说"这不是 bug,是故意的"?忽略了一个建议?diffray 都会捕获。

步骤 2:模式提取

diffray 分析:究竟哪里错了?是误报(代码正确)、不适用的上下文(规则在这里不适用),还是项目特定的约定(这是我们这里的做法)?

步骤 3:规则生成

基于模式,diffray 制定一条规则,指定范围(哪些文件/目录)、要抑制或执行什么、以及原因。规则与原始反馈关联以便追溯。

步骤 4:验证

在应用规则之前,diffray 会针对历史 PR 运行它。有多少评论会被抑制?其中有多少是实际的误报?只有当规则提高准确性时才会被应用。

diffray 中的规则类型

🚫

抑制规则

"在上下文 Y 中不标记 X" — 在遗留代码、测试文件或生成的代码中静默特定警告。

🛡️

强制规则

"始终检查 Z" — 确保关键模式如 SQL 参数化或认证检查永不被遗漏。

🎯

上下文规则

"考虑具体情况" — 根据文件类型、装饰器或周围的代码模式调整优先级。

📖

术语规则

"我们这样称呼它" — 教 diffray 您的领域词汇,使其更好地理解您的代码库。

实际示例:从烦恼到规则

想象一下:diffray 在您的 PR 上留下评论:

警告 性能:使用 any 会降低类型安全性。考虑显式类型。

您知道这是一个计划在下个季度重写的遗留模块。现在修复类型将是浪费时间。

您回复:"这是遗留代码,类型将在 Q2 重构时处理"

接下来发生什么:

1.diffray 识别负面反馈
2.分析上下文:文件在 src/legacy/,有一个带日期的 TODO
3.在历史中找到类似案例:过去一个月有 12 条类似评论
4.src/legacy/** 生成带过期日期(Q2)的抑制规则
5.下一个 src/legacy/ 中的 PR — diffray 对类型保持沉默

但重要的是:规则不是永久的。过期日期意味着 Q2 之后,diffray 将再次开始检查该目录中的类型。

指标:降低误报率

AI 代码审查有效性的关键衡量标准是误报率。100 条评论中有多少是无用的?

典型的行业基准:

40-60%

基础 AI 审查误报

25-35%

带手动规则

8-13%

diffray 与学习规则

我们如何实现这一目标:

上下文隔离

通过子代理防止漂移

代理专业化

提高每个领域的准确性

从反馈中学习

消除反复出现的误报

规则验证

防止过拟合

入门:三个步骤

步骤 1:将 diffray 连接到您的代码库

通过 GitHub App 或 GitLab webhook 集成只需 5 分钟。

步骤 2:正常工作

在最初的 2-3 周,diffray 在学习模式下运行。它研究您的项目结构、PR 模式和审查者的评论风格。

步骤 3:提供反馈

不要默默忽略 diffray 评论。给有用的点赞,给无用的点踩,回复有争议的。

每次互动都会让 diffray 更聪明。一个月后,您将拥有一个个性化的 AI 审查者,比新员工入职后更了解您的约定。

结论:与您的团队一起成长的 AI

"每个错误都成为规则"的理念不仅仅是一个朗朗上口的短语。它是一个架构原则,将玩具工具与生产就绪的解决方案区分开来。

diffray 建立在三个支柱上:

具有隔离上下文的子代理

无污染的准确性

从反馈中制定规则

无需手动工作的学习

历史验证

对改进的信心

结果:AI 代码审查随着每个 PR 变得更好。不是因为模型更新了,而是因为它从您的团队中学习

今天就开始训练您的 AI 审查者

安装 diffray 并打开一个 PR。公共仓库免费,私人仓库也有慷慨的免费层。

相关文章