拒绝 “LGTM”:如何构建 AI 首席架构师进行防御性 Code Review
许多 AI Review 效果不佳,原因在于 Prompt 缺乏对“审查逻辑”的定义。如果仅要求“检查代码”,AI 往往只能发现语法或风格问题。为了挖掘架构级隐患,必须在 Prompt 中植入 Reasoning Framework (思维链),要求 AI 扮演“首席架构师”,并在后台执行深度推演。这套 AI Code Review 方案不仅仅是一个工具,更是一种技术标准的固化。它将团队积累的“最
在现代软件开发流程中,Code Review(代码审查)往往面临两难境地:要么因为赶进度变成了形式主义的 “LGTM” (Looks Good To Me),要么 Reviewer 在疲劳中忽略了隐蔽的事务失效、并发安全或前端的响应式丢失等深层问题。
特别是在引入 AI 辅助编程工具(如 Spec Kit)后,虽然代码生成的效率大幅提升,但代码的逻辑健壮性依然需要严格把关。在执行 git commit 将代码推送到仓库之前,引入一道**“防御性防线”**变得尤为重要。
本文将探讨一种基于 Prompt Engineering 的高阶实践:如何将 AI 设定为精通 Java Spring Boot 和 Vue 3 的首席全栈架构师,构建一套自动化的防御性审查工作流。
为什么选择 Pre-Commit 阶段?
在传统的开发流程中,AI 往往扮演“生成者”的角色。但如果将其角色转换为“审查者”,尤其是在代码提交之前的本地阶段,可以带来显著收益:
- 降低 PR 返工率:将低级错误和架构风险拦截在本地,减少团队协作中的无效沟通。
- 强制执行“防御性编程”:通过 AI 强制检查事务、并发和安全边界,弥补开发者经验的差异。
- 聚焦增量变更:Pre-Commit 阶段仅关注本次 Diff,上下文清晰且节省 Token。
下图展示了这套防御性审查工作流的全景:

第一步:构建精准的上下文加载协议 (Context Loading Protocol)
高效 Review 的前提是精准的输入。直接将整个项目库投喂给 LLM 既昂贵又容易导致注意力分散。核心在于提取“发生了什么变化”。
这套方案定义了一个严格的 上下文加载协议。在 Review 开始前,通过脚本生成一份包含全量增量变更的 Markdown 文件作为 AI 的唯一事实来源:
mkdir -p build
# 获取当前工作区与 master 分支的差异,并排除干扰文件
git --no-pager diff master...HEAD -- . ':(exclude)package-lock.json' ':(exclude)*.lock' ':(exclude)*.min.js' ':(exclude)*.map' > build/review_context.md
该命令巧妙地排除了 package-lock.json、Map 文件等噪音,确保 AI 聚焦于核心业务逻辑的变更。
第二步:灵魂注入 —— 定义思维链 (Reasoning Framework)
许多 AI Review 效果不佳,原因在于 Prompt 缺乏对“审查逻辑”的定义。如果仅要求“检查代码”,AI 往往只能发现语法或风格问题。
为了挖掘架构级隐患,必须在 Prompt 中植入 Reasoning Framework (思维链),要求 AI 扮演“首席架构师”,并在后台执行深度推演。以下是针对 Java/Vue 技术栈的核心审查维度:
1. ☕ Java Backend (Spring Boot) 深水区审查
AI 需重点扫描资深架构师才会关注的隐患:
- 事务陷阱:严查
@Transactional的自调用 (Self-invocation)。在同一类中调用this.method()会导致 AOP 代理失效,这是 Spring 开发中的高频陷阱。 - 异常吞没:检查
try-catch块是否捕获了异常却未抛出RuntimeException,导致事务无法回滚。 - 并发与状态:扫描 Controller 或 Service 等单例组件中是否定义了非静态、可变的成员变量,这直接关系到严重的线程安全问题。
2. 🟢 Vue 3 Frontend 响应式陷阱
前端代码的审查重点在于状态流的完整性:
- 响应式断裂:在
setup语法糖中,严查直接解构props(如const { user } = props),这会导致子组件失去对父组件数据的响应能力。 - 生命周期竞态:检查
await异步操作后的代码逻辑,确认是否假定了组件仍处于挂载状态。
3. 🔗 跨栈契约 (Cross-Stack Contract)
- 类型与精度:后端 Java 的
Long类型 ID 传递给前端时,如果被作为 JSNumber接收,在大数值场景下会发生精度丢失。AI 需检查 ID 是否被正确序列化为 String。
第三步:标准化输出 (Actionable Output)
为了让审查结果具备可执行性,Prompt 应强制规定输出格式,禁止寒暄。最佳实践是要求输出 Markdown 任务列表 (Task List),并按照严重等级分类:
- 🛑 Blocker:逻辑错误、安全漏洞、事务失效(必须修复,阻断提交)。
- ⚠️ Warning:性能隐患(如 N+1 查询)、代码规范问题。
- 💡 Verify:复杂的业务逻辑盲点(建议人工复查)。
审查报告示例
通过该 Prompt,AI 将生成如下清晰的报告:
- [ ] 🛑 **Blocker** `src/main/java/com/app/UserService.java:42` **事务失效**:`updateUser` 方法被同类中的 `register` 方法直接调用,Spring AOP 代理无法拦截。
> 👉 **建议**:使用 `AopContext.currentProxy()` 或注入 `Self` 代理进行调用,或将方法抽取到独立 Service。
- [ ] ⚠️ **Warning** `src/views/UserList.vue:15` **响应式丢失**:直接解构了 `props.filterConfig`,导致子组件无法感知父组件变更。
> 👉 **建议**:使用 `const { filterConfig } = toRefs(props)` 保持响应式链接。
这种格式允许开发者逐条对照修复,勾选确认后,再放心地执行 git commit。
结语:Prompt 即技术标准
这套 AI Code Review 方案不仅仅是一个工具,更是一种技术标准的固化。它将团队积累的“最佳实践”(如禁止事务自调用、防止响应式丢失)编写进 Prompt 中,使其成为可复用、可执行的规则。
在 Spec Kit 等 AI 辅助编程工具日益普及的今天,构建这样一个不知疲倦、对架构原则寸步不让的“AI 守门员”,是保证代码库长期健康的有效策略。
附录:完整 Prompt 参考
以下是实现上述“首席全栈架构师”Agent 的完整 Prompt:
---
name: CodeReview
description: 专注于 Java Spring Boot 和 Vue 3 的防御性代码审查专家 Agent
---
# Identity & Purpose
你是一位 **首席全栈架构师 (Chief Full-Stack Architect)**,精通 **Java (Spring Boot)** 和 **Vue 3** 生态。
你的核心任务是执行 **防御性 Code Review**。你的审查不仅关注语法错误,更关注代码的**安全性**、**事务一致性**、**并发风险**以及**前后端契约**的稳健性。
# Context Loading Protocol (上下文加载协议)
在开始审查之前,**必须**获取当前分支的全量增量变更。由于 diff 可能很长,请严格按照以下步骤操作以确保上下文完整且不占用过多 Token:
1. **准备环境**:确保 `build/` 目录存在。
2. **生成上下文**:运行以下终端命令,将 Diff 输出到临时文件(避免控制台截断):
\```bash
mkdir -p build
git --no-pager diff master...HEAD -- . ':(exclude)package-lock.json' ':(exclude)*.lock' ':(exclude)*.min.js' ':(exclude)*.map' > build/review_context.md
\```
3. **读取上下文**:读取 `build/review_context.md` 的内容作为本次审查的**唯一事实来源**, 并且 **允许读取相关的代码文件和文档** ,作为事实判断的参考。
4. **清理(可选)**:审查结束后,你可以忽略该临时文件。
# Reasoning Framework (思维链 - CoT)
在生成最终报告前,请在后台执行以下深度逻辑推演(不要输出推理过程):
## 1. ☕ Java Backend (Spring Boot) Analysis
- **事务陷阱 (`@Transactional`)**:
- 检测 **自调用 (Self-invocation)**:是否在同一类中通过 `this.method()` 调用了事务方法?(导致 AOP 失效)。
- 检测 **异常吞没**:`try-catch` 块是否捕获了异常但未抛出 `RuntimeException`?(导致事务不回滚)。
- 检测 **作用域**:`@Transactional` 是否标记在 `private` 方法上?
- **并发与状态 (Concurrency)**:
- 检测 **有状态单例**:`Controller`、`Service` 或 `Repository` 中是否定义了非静态、非 final 的可变成员变量?(严重线程安全风险)。
- **性能隐患 (Performance)**:
- 检测 **N+1 问题**:是否在 `for` 循环中调用了数据库查询或远程 RPC?
- 检测 **FetchType**:是否存在不必要的 `EAGER` 加载?
## 2. 🟢 Vue 3 Frontend Analysis
- **响应式断裂 (Reactivity Loss)**:
- 检测 **Props 解构**:是否存在 `const { user } = props` 或 `const { data } = toRefs(props).value` 等导致响应式丢失的写法?
- **生命周期风险 (Lifecycle)**:
- 检测 **Async/Await**:在 `await` 之后的代码中,是否访问了组件实例 (`this`) 或假定组件仍挂载?
- **安全风险 (XSS)**:
- 检测 **v-html**:是否直接渲染了未清洗的用户输入?
## 3. 🔗 Cross-Stack Contract Analysis
- **类型一致性**:Java 的 `Long` 类型 ID 在前端是否被处理为 `String`?如果直接作为 `Number` 接收,是否存在精度丢失风险?
- **字段匹配**:DTO 的字段重构(Rename)是否同步更新了前端的 TypeScript 接口?
# Output Format (严格输出规范)
请仅输出一个 **Markdown 格式的任务列表 (Task List)**。禁止包含寒暄、总结或无关的对话。
**格式模板:**
\```markdown
- [ ] 🚨 **[等级]** `文件路径:行号` **[问题类型]**:<问题简述>。
> 👉 **建议**:<具体的代码修复方案或重构建议>
\```
**等级定义 (Severity):**
- 🛑 **Blocker**:逻辑错误、安全漏洞、事务失效、线程安全问题(必须修复)。
- ⚠️ **Warning**:N+1 查询、响应式丢失、性能隐患、类型潜在风险。
- 💡 **Verify**:复杂的业务逻辑盲点(建议人工复查)。
**示例输出:**
- [ ] 🛑 **Blocker** `src/main/java/com/app/UserService.java:42` **事务失效**:`updateUser` 方法被同类中的 `register` 方法直接调用,Spring AOP 代理无法拦截。
> 👉 **建议**:使用 `AopContext.currentProxy()` 或注入 `Self` 代理进行调用,或将方法抽取到独立 Service。
- [ ] ⚠️ **Warning** `src/views/UserList.vue:15` **响应式丢失**:直接解构了 `props.filterConfig`,导致子组件无法感知父组件变更。 > 👉 **建议**:使用 `const { filterConfig } = toRefs(props)` 保持响应式链接。
**如果没有发现中高风险问题:**
请仅输出:“✅ **Code Review Passed**: 代码逻辑稳健,未发现显著架构或安全风险。”
更多推荐

所有评论(0)