上下文代码审查
抱歉,我只看到了来源链接,缺少需要翻译的正文内容。请提供要翻译的完整文本,我会按照要求将其翻译成简体中文并保留原有的格式。
Source: …
Contextual AI Code Reviews
AI 代码审查之所以失败,并不是因为 AI 本身弱,而是因为我们在没有上下文的情况下提出了错误的问题。
如果让 AI 在没有上下文的情况下审查你的代码,你会得到一份理想化的检查清单:
- “考虑在这里添加空值检查”
- “这个方法名可以更具描述性”
- “安全性:验证用户输入”
- “考虑使用依赖注入”
其中有些可能是合理的,但大多数都是噪音。AI 并不知道该服务运行在受保护的内部环境中,性能比可读性更重要,或者“命名不一致”是团队有意保留的旧有约定。
没有上下文,AI 只能依据抽象的理想进行审查。有了上下文,AI 才能依据你的实际需求进行审查。这一问题在审查人为编写的遗留代码时尤为突出——即在引入 AI 辅助之前编写的代码。
遗留代码库通常存在:
- 不一致的命名空间约定
- 随机演化的类名
- 团队从未文档化的隐式约定
- 团队有意识接受的技术债务
AI 会把这些全部视为“需要修复的问题”,但其中许多其实是已被认可的权衡,而非疏忽。如果编译器能够捕获某个问题,就把它排除在 AI 审查之外。每一个用于“缺少分号”或“未使用变量”的 token,都是没有用于有意义分析的 token——你的 linter 和 IDE 已经处理了这些问题。
审查视角
指定您希望 AI 使用的视角;否则它会标记在您上下文中并非问题的事项。
| 视角 | 常见问题 |
|---|---|
| 逻辑检查 | 代码是否按预期工作? |
| 安全检查 | 是否存在漏洞?输入验证是否充分? |
| 性能检查 | 资源使用是否最佳?算法复杂度是多少? |
| 线程安全 | 是否可能出现竞争条件、死锁或共享状态问题? |
| 框架符合性 | 是否遵循框架的模式? |
| 架构适配 | 是否适配现有结构? |
在三层认证之后运行的服务不需要输入消毒警告。每天运行一次的批处理作业不需要微秒级的优化建议。
为 AI 提供上下文
在 AI 能够有效审查之前,它需要了解:
- 该服务在架构中的位置在哪里?
- 哪些安全边界对其进行保护?
- 性能要求是什么?
- 它连接了哪些外部接口?
示例上下文
This service runs in an internal VPC with no external exposure.
It processes batch data nightly; latency is not critical.
Input comes from a validated upstream service.
对于已知框架(ASP.NET、Spring、Rails),AI 拥有丰富的训练数据。对于自定义架构,AI 无法一次性完整把握其结构。在这种情况下:
- 人工管理范围——审查按层逐步进行。
- 检查新增/更改是否符合既定结构。
- 不要指望 AI 能从单个文件中理解你的整个自定义框架;需要逐步构建理解。
系统审查流程
- 加载系统上下文 – 位置、约束、接口。
- 加载结构上下文 – 架构、约定。
- 基线 – 确认现有问题并标记为已知。
- 定义审查视角 – 逻辑、安全、性能等。
- 根据定义的标准审查新更改。
这不是提示;它是提示之前的准备阶段。
与质量模型对齐(ISO 25010)
选择与您审查相关的特性;不要每次都检查所有项目。
| 特性 | 检查重点 |
|---|---|
| 功能正确性 | 是否满足需求? |
| 性能效率 | 资源使用,响应时间 |
| 兼容性 | 共存性,互操作性 |
| 可用性 | API 清晰度,错误信息 |
| 可靠性 | 容错性,可恢复性 |
| 安全性 | 机密性,完整性 |
| 可维护性 | 模块化,可测试性 |
| 可移植性 | 适应性,可安装性 |
基线分析后的决策制定
- 如果周围的代码高度不一致,对新添加的代码要求严格一致性可能会产生摩擦且没有价值。
- 如果一致性很重要,接受基线债务,但确保新代码不会使情况恶化。
此判断属于人为决策,不能完全交由 AI 处理。
方法 vs. 结果
| 方法 | 结果 |
|---|---|
| “审查此代码”(无上下文) | 理想化的噪声 |
| 有上下文的审查(带定义视角) | 相关发现 |
关键要点
- 排除编译器可检查的问题;让 linter 处理它们。
- 明确界定审查视角。
- 在提示前加载系统和结构上下文。
- 建立已知技术债务的基线。
- 使用质量特性(例如 ISO 25010)作为聚焦检查清单。
通过提供上下文,AI 从一个吹毛求疵的批评者转变为有用的审阅者。此洞见是 Beyond Prompt Engineering 系列的一部分,探讨结构性和文化性方法如何在 AI 辅助开发中超越纯粹的提示优化。