把 18 个文件塞进一个 prompt 会导致注意力稀释——模型在一个文件里夸 async/await,在另一个文件里批评完全一样的用法。修复:拆成逐文件的本地 pass(一致的深度)加一个独立的跨文件集成 pass(捕获接口不匹配)。
注意力稀释问题
18 文件的单 pass 审查产出矛盾反馈:async/await 在 auth.ts 被夸为”干净的现代做法”,在 payment.ts 被标为”不必要的复杂度——用回调”。两个文件用的是完全相同的模式。模型的评估标准在审查过程中漂移了。
这是注意力稀释的标志:早期文件和晚期文件得到不同的对待,评估标准随着上下文增长而偏移,模型失去了对自己标准的追踪。
阶段 1:逐文件本地分析
对每个修改的文件独立审查本地问题:bug、安全漏洞、性能问题、风格违规。每个文件得到聚焦且一致的关注。单文件问题的检测率:95%。
没有注意力稀释,因为每次审查只聚焦一个文件。模型对每个文件应用一致的标准,不受无关代码的干扰。
阶段 2:跨文件集成分析
一个独立的 pass 检查文件之间的关系:
- 接口兼容性:函数签名变更是否匹配它们的调用方
- 数据流:格式变更是否在流水线中传播
- 共享状态:并发访问模式是否保持安全
关键案例:auth 模块改了 token 格式,payment 模块还期望旧格式。逐文件审查分别批准了两个——每个文件”内部一致”。只有集成 pass 能捕获这个不匹配。
集成 pass 设计
给集成 pass 提供:
- 逐文件发现摘要 — 已审查内容的上下文
- 接口定义 — 所有修改文件的函数签名、类型导出、API 契约
- 显式的跨文件范围 — 指令检查数据流、接口兼容性、共享状态。不检查已被逐文件 pass 覆盖的本地问题。
不要在一个 prompt 里重新审查所有文件——那会重新引入注意力稀释。集成 pass 需要的是接口摘要,不是完整文件内容。
替代的分解策略
除了逐文件 + 跨文件,还有两种有效方法:
按关注点 pass:一个 pass 跨所有文件做安全,一个做性能,一个做风格。每个 pass 对一个维度应用一致的标准。
按模块分组:根据模块依赖把文件分成 3-4 个一组。审查每组,然后检查组间接口。保持上下文可控的同时捕获模块内部关系。
代价高昂的跨文件遗漏
逐文件审查捕获 95% 的本地问题,但在结构上无法捕获跨文件问题。一个生产事故:auth token 格式改了,payment 模块还期望旧格式,两个变更分别被批准。集成 pass 本可以通过检查 auth 和 payment 接口间的数据流来捕获这个问题。
逐文件干净的文件仍然可能有跨文件问题。一个没有本地 bug 的文件可能导出了一个被另一个文件错误调用的函数——bug 在交互中。
一句话总结: 单 pass 审查因注意力稀释产出矛盾发现——拆成逐文件 pass(95% 本地检测率、一致深度)加跨文件集成 pass(捕获接口不匹配、数据流断裂、共享状态问题)。