每个错误都成为规则:
diffray 如何从您的反馈中学习
为什么没有反馈学习的 AI 代码审查只是一个昂贵的噪音生成器
Claude Code 的创造者 Boris Cherny 最近分享了他的工作流程,其中一句话在开发者社区引起了轰动:"每当我们看到 Claude 做错事,我们就把它添加到 CLAUDE.md 中,这样 Claude 下次就知道不要这样做了。"
产品负责人 Aakash Gupta 完美地总结道:"每个错误都成为规则。"团队与 AI 合作的时间越长,AI 就越聪明。
这正是 diffray 构建的理念。今天,我们将向您展示它是如何在底层运作的。
问题:上下文污染扼杀审查质量
在讨论规则之前,我们需要了解 AI 代码审查的主要技术挑战——上下文污染。
Anthropic 的研究表明,LLM 像人类一样,随着上下文窗口的填充而失去焦点。修正不断累积,旁枝讨论堆叠,过时的工具输出仍然存在。结果是可预见的:
误报
AI 发现不存在的"问题"
幻觉
虚构的 bug 和不存在的模式
目标漂移
审查变得越来越不相关
JetBrains Research(2025年12月)量化了这一点:代理上下文增长如此之快以至于变得昂贵,但并没有带来显著更好的任务性能。更多上下文 ≠ 更好的结果。
解决方案:具有隔离上下文的专业子代理
Boris Cherny 使用子代理作为"最常见工作流程的自动化封装"。他的理念是:
"可靠性来自专业化加上约束"
他的代码审查命令不是使用一个全知的审查者,而是生成多个并行代理,各有不同的职责:
这个对抗层至关重要。次级代理通过结构化的怀疑主义质疑第一轮的发现,消除误报。
用 Cherny 的话说,结果是:"找到所有真正的问题,没有虚假的。"
技术原理
当主代理委托给子代理时,会生成一个全新的上下文窗口,仅包含任务描述和相关参数。子代理可以广泛探索——在搜索代码时消耗数万个 token——但只返回一个1,000-2,000 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 颠覆了这个过程。不是手动编写规则,您只需对审查提供反馈。
学习循环
步骤 1:您提供反馈
给 diffray 评论点了踩?回复说"这不是 bug,是故意的"?忽略了一个建议?diffray 都会捕获。
步骤 2:模式提取
diffray 分析:究竟哪里错了?是误报(代码正确)、不适用的上下文(规则在这里不适用),还是项目特定的约定(这是我们这里的做法)?
步骤 3:规则生成
基于模式,diffray 制定一条规则,指定范围(哪些文件/目录)、要抑制或执行什么、以及原因。规则与原始反馈关联以便追溯。
步骤 4:验证
在应用规则之前,diffray 会针对历史 PR 运行它。有多少评论会被抑制?其中有多少是实际的误报?只有当规则提高准确性时才会被应用。
diffray 中的规则类型
抑制规则
"在上下文 Y 中不标记 X" — 在遗留代码、测试文件或生成的代码中静默特定警告。
强制规则
"始终检查 Z" — 确保关键模式如 SQL 参数化或认证检查永不被遗漏。
上下文规则
"考虑具体情况" — 根据文件类型、装饰器或周围的代码模式调整优先级。
术语规则
"我们这样称呼它" — 教 diffray 您的领域词汇,使其更好地理解您的代码库。
实际示例:从烦恼到规则
想象一下:diffray 在您的 PR 上留下评论:
警告 性能:使用 any 会降低类型安全性。考虑显式类型。
您知道这是一个计划在下个季度重写的遗留模块。现在修复类型将是浪费时间。
您回复:"这是遗留代码,类型将在 Q2 重构时处理"
接下来发生什么:
src/legacy/,有一个带日期的 TODOsrc/legacy/** 生成带过期日期(Q2)的抑制规则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 变得更好。不是因为模型更新了,而是因为它从您的团队中学习。