更新于 2025年9月22日
12 分钟
你不需要更多的注释,你需要更好的提示。一个平庸的 AI 代码审查和一个极其敏锐的代码审查之间的区别通常在于你如何提问。
你是一位资深的 [language/framework] 工程师,正在为 [project/domain] 审查代码。目标:[Bug fix | Performance | Readability | Security | DX | API consistency]约束:[Style guide, supported versions, memory/time limits, library constraints]上下文:- 运行时/环境:[Node 20, JVM 17, Python 3.11, iOS 17, 等]- 关键依赖项:[list]- 架构:[monolith, microservice, serverless, hexagonal, 等]- 相关接口/合约:[link or inline]任务:1) 审查以下代码以达到 [goals]。2) 识别具有证据的具体问题(行引用,复杂性估计,边缘情况)。3) 提出最小的、有针对性的差异。4) 提供最终的重构版本。5) 解释权衡和风险。代码:```[language]// 在这里粘贴代码为什么它有效:- 框架角色和目标。- 设置约束和上下文。- 强制证据和结构。- 产生差异 + 最终代码 + 测试。---## 常见场景的快速入门模板### 1) Bug 修复 + 安全网```text充当高级 [language] 工程师。审查正确性和隐藏的边缘情况。重点:竞争条件、null/None 处理、差一错误、输入验证、错误传播。提供:带有行引用的问题、最小差异以及带有测试的安全重构。目标:在不改变公共行为的情况下,降低时间和内存复杂度。提供:当前复杂度、建议复杂度、微优化与算法更改、以及要运行的基准。重构以提高清晰度:更好的命名、更小的函数、单一职责。添加文档字符串/JSDoc,简化控制流,删除死代码。保持公共 API 稳定。威胁模型:来自 [source] 的不受信任的输入。检查:注入、反序列化、SSRF、XSS、CSRF、authZ/authN、密钥处理。建议:安全库、验证模式和最小差异。我们正在从 [lib A] 迁移到 [lib B]。列出重大更改,提出适配器层,并提供带有测试的增量推出计划。环境:Python 3.11,FastAPI,Pydantic v2。合约:即使在部分失败的情况下,端点也必须返回 200,并带有 { data, meta }。约束:必须保持异步;不能添加新的重量级依赖项。1) 评论:列出具有证据的具体问题。2) 差异:修复的最小更改。3) 重构:干净、符合语言习惯的最终代码。4) 测试:涵盖快乐路径 + 3 个边缘情况的单元测试。提出 3 个重构选项:- 选项 A:最小更改- 选项 B:适度重新设计- 选项 C:完全重写对于每个选项:优点/缺点、复杂性、风险、迁移计划以及何时选择它。约束:相同的公共 API,<50ms p95,<10MB 额外内存,没有新的运行时依赖项。展示你的重构如何通过测量或推理来满足每个约束。你是一位资深的 Python 工程师。目标:正确性 + 性能。环境:Python 3.11、FastAPI、httpx、Pydantic v2。合约:永不在部分失败时引发异常。任务:审查和重构。提供评论 → 最小差异 → 最终重构 → 测试。代码:```pythonfrom fastapi import APIRouterimport httpxrouter = APIRouter@router.get("/users/{user_id}")async def get_user(user_id: str):async with httpx.AsyncClient as client:profile = await client.get(f")<a16>posts = await client.get(f")</a15>return {"data": {"profile": profile.json, "posts": posts.json}}此提示为 Grok 4 提供了工作、防护栏和输出形状 - 因此它的建议易于应用。---## 从原始建议到可发布的代码:迭代循环将 Grok 4 视为结对程序员。使用一个紧密的循环:1. 从最小的可重现代码和约束开始。2. 要求评论 + 有针对性的差异。12. 在本地应用差异;运行测试/基准测试。使用 {severity, category, rationale} 注释每个建议。如果行为可能更改,请包括前/后代码段和一个单步迁移计划。tsconfig 目标、Node/浏览器环境、捆绑器树摇和 ESLint/Prettier 规则。JSDoc/TSDoc 和区分的联合以获得更安全的类型。mypy 目标、pydantic v1 与 v2、同步与异步以及类型提示级别。hypothesis 请求 pytest fixtures 和属性测试。context.Context 传播和使用 %w 进行错误包装。proptest 案例。将输出作为从此存储库根目录开始的具有正确文件路径的统一差异返回。仅包括已更改的块。差异中没有评论。然后包括一个单独的注释部分。使用完全两个块进行响应:1) ```diff...changes...---## 强制执行非功能性需求 (NFR)如果你需要围绕延迟、内存或兼容性的保证,请将它们放入提示中,并要求 Grok 4 自我检查:```text非功能性需求:p95 延迟 +< 20ms 与基线相比,内存增量 < 5MB,零新的运行时依赖项,相同的公共 API。添加一个自我检查部分,确认每个非功能性需求,并提供粗略的推理或微基准测试想法。用一句话解释每个更改,并引用行或代码段。如果不确定,请提出澄清问题,而不是猜测。如果要求不明确,请在继续之前提出最多 3 个澄清问题。角色:资深 TypeScript 工程师。目标:在不更改公共 API 的情况下,提高可读性和运行时安全性。环境:Node 20、TypeScript 5.4、Zod 用于验证、ESLint Airbnb、strictNullChecks。约束:除了 Zod 之外没有新的运行时依赖项,没有重大更改,保持 O(n) 复杂度。任务:- 评论 → 差异 → 重构 → 测试 → 注释。- 使用 {severity, category, rationale} 标记问题。- 包括一个 Zod 模式用于输入验证和 4 个单元测试。代码:```tsexport function parseUser(raw: any) {if (!raw) return nullreturn {id: raw.id || '0',name: raw.name || 'Unknown',age: parseInt(raw.age),}}---## 让 Grok 4 尊重风格和架构使用具体规则锚定模型:```text风格:Airbnb TS。首选提前返回,避免深度嵌套,使用显式类型。架构:保持纯函数;没有副作用。在边界处进行输入验证。运行一个心理 ESLint 传递并列出你期望的违规行为,然后修复它们。对于每个更改,命名重构模式(例如,提取函数,引入参数对象)并解释何时在此代码库中应用它。仅使用存储库上下文。审查此 PR 中已更改的文件以达到 [goal]。使用严重性和基本原理内联注释发现。提出保留公共 API 和 NFR 的差异。仅包括接触已更改路径的测试。