AI 驱动开发的 SOP 体系与踩坑总结——从 Anthropic 到社区的最佳实践
核心结论:AI 驱动开发的成熟方法论本质上只做三件事——把"人要长期记住的"落地成文件、把"想清楚"和"动手改"拆成不同阶段、把能自动化的纪律交给工具而非自查。
问题背景
AI 写代码有一个和人类工程师不同的失效模式:没有连续记忆,只有当次上下文。 每次会话都是一次"失忆后重建理解"。项目小的时候无所谓,扫一遍代码就能重建全貌。项目一旦变大,三件事会同时失控:
- 上下文装不下全貌——AI 只能看到局部,基于局部认知做出全局不一致的改动:重复实现已有功能、破坏未注意到的约定、引入循环依赖。
- 没有显式记录设计理由——AI 改代码时看不到历史决策的原因,要么盲目遵从旧代码(哪怕已过时),要么随意推翻(哪怕当时是刻意的权衡)。
- 文档与代码各自漂移——没人规定"什么内容写在哪、写完怎么维护",文档要么不写,要么写了没人更新,很快变成噪音甚至误导。
这三个问题的根因是同一个:不同的内容有不同的变化速率,但被随意混在一起维护。 架构决策和临时笔记放在同一个文件里,用同样的方式增删改——漂移必然发生。
业界对此的收敛解法是:按变化速率分层存放,各用各的写操作语义。下面逐层展开。
Anthropic 官方体系:CLAUDE.md 三层记忆 + Plan-then-Execute
Anthropic 是目前对 AI 驱动开发方法论输出最系统的厂商。核心资料来自两份文档:工程博客 “How to use Claude Code effectively”(2025-04-17)和 “Building Effective Agents”(2025-01)。
工程博客六大推荐
| 推荐 | 核心要点 |
|---|---|
| Plan, then execute | 不要直接让 AI 写代码,先要求制定计划,人审核确认后再执行 |
| 用 CLAUDE.md 建立持久上下文 | CLAUDE.md 是给 AI 的工作指令,不是项目文档;包含可执行约束,而非描述性说明 |
| 给 AI 正确的工具 | 用 MCP(Model Context Protocol,一种让 AI 调用外部工具/数据源的标准协议)扩展能力边界,对接内部系统 |
| 小步迭代 | 大任务拆成可验证的小步骤,每步完成后立即跑测试验证 |
| 无头模式做 CI | 非交互模式可嵌入 GitHub Actions,自动化代码审查 |
| 用 Hooks 自定义工作流 | PreToolUse / PostToolUse hooks 在 AI 执行命令前后插入自定义逻辑 |
“Plan, then execute” 是贯穿所有推荐的总纲。Anthropic 明确说:不要让 AI 一次性从需求跳到代码,而是在每个关键决策点插入人类审核。这不是对 AI 能力的不信任——而是因为 AI 的理解和人的理解之间的落差,正是后期返工的主要来源。
五种 Agent 模式
“Building Effective Agents” 定义了五种从简单到复杂的 Agent 架构:
- Prompt Chaining——任务 A 的输出作为任务 B 的输入,每步中间可插入人工审核点。适用于有明确依赖链的流水线任务。
- Routing——先分类,再路由到专门处理路径。适用于多类型请求分流(bug 走修复流、feature 走设计流、question 走知识库)。
- Parallelization——多个独立子任务并行执行后汇总。适用于可拆分的批量任务(如同时审查多个文件)。
- Orchestrator-Workers——一个中央编排器动态分解任务,分配给 worker agent。适用于不确定复杂度的任务,编排器根据中间结果决定下一步。
- Evaluator-Optimizer——生成→评估→改进循环。代码场景:生成代码→跑测试→根据失败修复→再测试。
核心原则只有一条:Start simple, add complexity only when needed. 从最简单的方案起步,只有简单方案不够时才增加复杂度。不要一开始就构建全自主 Agent。
CLAUDE.md 三层记忆规范
这是 Anthropic 对"AI 怎么记住之前做过什么"的官方答案。来源:docs.anthropic.com/en/docs/claude-code/memory。
| 层级 | 文件位置 | 作用域 | 用途 |
|---|---|---|---|
| User Memory | ~/.claude/CLAUDE.md |
所有项目 | 个人偏好、通用风格 |
| Project Memory | 项目根/CLAUDE.md |
整个项目 | 项目约定、架构决策、代码规范 |
| Directory Memory | 子目录/CLAUDE.md |
当前目录及子目录 | 目录特定指令 |
加载优先级:User → Project → Directory,后者覆盖前者的冲突项。对于 monorepo 项目,可以在 backend/CLAUDE.md 写 Python 规范,在 frontend/CLAUDE.md 写 TypeScript 规范。
CLAUDE.md 的核心定位:它是给 AI 的工作指令,不是项目文档。Anthropic 对此给出了六条写作原则——
- 指令式而非解释式:“所有公共函数加 type hints"优于"我们的项目重视类型安全”。
- 具体优于笼统:“ruff check --fix,行长 120,忽略 E501"优于"遵循 PEP 8”。
- 包含反面约束:不仅说做什么,还说不做什么——“永远不要修改 database/migrations/ 下的文件”。
- 记录决策原因:“SQLite 而非 PostgreSQL:单机部署无需分布式”——AI 理解原因后才能做出合理的判断,而不是盲目遵从或随意推翻。
- 与 lint 工具配合不重复:ruff 已强制的格式规则不用在 CLAUDE.md 重复;聚焦 lint 无法检查的语义约定。
- 持续更新:过时的 CLAUDE.md 比没有更危险——AI 会严格遵循已废弃的指令。
推荐的内容结构模板:
# 项目名称——一句话描述
## 技术栈
- 语言/框架/关键依赖及版本
## 项目结构
- 简要目录布局,每个顶层目录一行说明
## 开发规范
- 可执行的代码风格规则(具体,不笼统)
- 命名约定
- 错误处理模式
- 反面约束("不要做 X")
## 测试要求
- 测试框架和运行命令
- 覆盖率期望
- 测试风格约定
## 关键架构决策
- 决策 + 原因(不只是"用了什么",还要"为什么")
## 已知限制 / 待改进
- 当前技术债
- 不应修改的区域
## 构建与部署
- 开发/测试/部署的具体命令
## 提交规范
- commit message 格式
- PR 流程
Claude Code 还内置了几个关键 slash command:
| 命令 | 作用 |
|---|---|
/init |
自动扫描项目结构,生成初版 CLAUDE.md |
/memory |
打开 CLAUDE.md 编辑 |
/compact |
压缩对话历史,保留关键上下文(上下文窗口快满时使用) |
CLAUDE.md 是如何解决"AI 记不住"的? 本质上它把"人要长期记住的东西"落地成文件,让 AI 每次新会话都能自动加载。不需要 AI 记住——只需要它读文件。三层分级则解决了"全塞一个文件会臃肿"的问题:个人偏好放 user 级,项目约定放 project 级,目录特化放 directory 级。
社区与工具生态:Cursor / Copilot / Aider 的差异化实践
Anthropic 的体系是目前最完整的,但不是唯一的。其他主流 AI 开发工具各有自己的指令文件规范和 Agent 模式,核心理念高度一致,差异化在于实现路径。
指令文件格式对照
| 工具 | 指令文件 | 格式特色 |
|---|---|---|
| Claude Code | CLAUDE.md(三层:user / project / directory) |
最先提出,事实标准 |
| Cursor | .cursor/rules/(目录结构,支持 glob 匹配) |
2025-Q2 从单文件 .cursorrules 升级为分规则文件 |
| GitHub Copilot | .github/copilot-instructions.md |
支持 Enterprise 级全局指令部署 |
| Windsurf | .windsurfrules |
上下文感知更自动化,但可控性稍弱 |
| Aider | .aider.conf.yml |
配置型,含 lint/test 命令实现自动验证闭环 |
| OpenCode | AGENTS.md |
工具无关、通用命名 |
Cursor:分级信任的 Agent 模式
Cursor 定义了三种从低信任到高信任的交互模式:
- Chat(不改动代码)——问答、探索,风险最低
- Edit(对话 + 内联编辑,逐个确认 diff)——定向修改,风险可控
- Agent(自主执行:读写文件、运行终端、搜索代码)——复杂多步任务,风险最高
Cursor 的规则目录在 2025 年 Q2 做了一次重要升级——从单一 .cursorrules 文件变为 .cursor/rules/ 目录:
.cursor/rules/
general.mdc # 所有模式加载
agent.mdc # Agent 模式专用
test-writing.mdc # 按 glob 匹配文件类型加载
每个 .mdc 文件支持 frontmatter(YAML 格式的元数据头),可按文件类型自动匹配规则:
---
globs: ["**/*.py"]
description: Python standards
alwaysApply: false
---
# Python Standards
- Use type hints for all function signatures
- Follow ruff formatting rules
此外,Cursor 的 @-mention 机制(@file / @folder / @web / @docs)显式解决了"上下文轰炸"问题——不给 AI 整个项目,只给相关文件。
Aider:自动验证闭环
Aider 是开源终端 AI 编程工具,在验证闭环上做得最彻底:
- 自动 lint + test 循环——修改代码后自动运行 lint 和 test,失败则自动修复再重试,直到通过
- Architect 模式——先设计后实现的两阶段模式,和 Anthropic 的 “Plan then execute” 理念完全一致
- 自动仓库映射——分析 git repo 构建代码地图,AI 能自动感知项目结构而不必手动提供上下文
Aider 的自动验证闭环是目前最成熟的"AI 自检"实现。 其他工具需要手动配置才能达到类似效果。
GitHub Copilot:企业级指令部署
Copilot Agent Mode(2025 年在 VS Code 中推出)支持多文件编辑 + 终端命令执行 + 迭代修复(测试失败后自动修改代码并重试)。其差异化在于 .github/copilot-instructions.md 支持 Enterprise 级全局指令——管理员可以在 GitHub Enterprise 层面设置对所有仓库生效的规则,适合团队规范化管理。
AGENTS.md vs CLAUDE.md:通用标准之争
为什么会出现 AGENTS.md
CLAUDE.md 是最先提出且采用最广的指令文件格式,但它的名字绑定了 Claude / Claude Code。对于使用 Cursor、Copilot、Aider 等工具的团队,这个文件名天然让人感到不适——一个项目不应该为某个特定 AI 工具的指令文件命名。
AGENTS.md 出现的三个核心动因:
- 工具无关性——不绑定特定厂商,任何 AI 工具都能读取
- 多 Agent 共存——一个项目可能同时用 Claude Code 写后端 + Cursor 写前端,需要一份通用指令文件
- 未来兼容——“AGENTS” 指"AI 代理"这个概念,不绑定特定产品
语义差异
实际上两者内容格式完全相同,核心差异只在文件名的语义暗示。
兼容策略
推荐方案:内容写一份,文件名做兼容。以 AGENTS.md 为主文件,同时在根目录创建符号链接让 Claude Code 自动加载:
# Linux / macOS
ln -s AGENTS.md CLAUDE.md
# Windows(管理员权限)
mklink CLAUDE.md AGENTS.md
这样 Claude Code 启动时自动读 CLAUDE.md(实际指向 AGENTS.md),其他工具读 AGENTS.md,内容始终一致,无需维护两份。
八大反模式:社区踩坑收敛
随着 AI 编码工具的大规模使用,社区已经收敛出一批高频反模式。这些不是某个工具特有的问题,而是 AI 写代码的通用失效模式。
反模式 1:全自主幻觉(The Autonomy Illusion)
认为可以让 AI 完全自主完成一个大型功能。
后果:产出看似正常但细节错误的代码,排查比从头写还费时。AI 擅长"看起来对"——变量名合理、逻辑通顺、甚至有注释——但在边界条件、并发安全、业务语义上可能全面出错。
正确做法:人类在每个关键决策点审核,AI 是"副驾驶"不是"自动驾驶"。
反模式 2:上下文轰炸(Context Flooding)
把整个代码库塞给 AI,指望它自己找到相关代码。
后果:AI 在噪声中迷失,关注不相关代码,输出质量随上下文膨胀而下降。研究显示,超过一定程度后,更多的上下文反而降低 AI 的输出质量。
正确做法:只给相关文件、函数定义、接口说明。10 行精准上下文胜过 1000 行噪声。Cursor 的 @-mention 机制和 Claude Code 的 subagent(独立上下文的子代理,只返回结论不污染主对话)模式都是为解决这个问题设计的。
反模式 3:盲目信任不验证(Blind Trust)
AI 生成的代码不跑测试就直接提交。
后果:引入隐蔽 bug、类型错误、安全漏洞。AI 生成的代码"看起来对"的概率远高于"实际正确"的概率。
正确做法:每步修改后立即运行测试套件,人工审查核心逻辑。Aider 的自动 lint+test 循环是这方面最成熟的实践——修改后自动验证,失败则自动修复,形成闭环。
反模式 4:一次性大需求(The Monolithic Prompt)
“帮我重构整个认证模块”——一个 prompt 包含所有期望。
后果:AI 只完成部分、遗漏边界情况、错误时难以定位。大 prompt 还会导致 AI 在后半段"注意力衰减"——前面的指令被严格遵循,后面的被弱化或忽略。
正确做法:拆分为多个小步骤,每步可验证。Anthropic 的 “Plan, then execute” 和 “小步迭代” 两条推荐都指向同一个方向。
反模式 5:指令文件写成文档(Documentation, not Instructions)
CLAUDE.md / .cursorrules 写了长篇项目介绍、背景故事、设计理念。
后果:AI 把 token 花在理解散文上,关键约束反而被淹没在叙述中。一个 300 行的 CLAUDE.md 里只有 30 行是可执行指令,其余 270 行是噪音。
正确做法:只写可执行指令。“所有 API 端点必须有 input validation”,而非"我们的项目重视安全性"。Anthropic 的六条写作原则第一条就是"指令式而非解释式"。
反模式 6:指令文件不更新(Stale Memory)
CLAUDE.md 写了一次再也不更新。
后果:AI 严格遵循已废弃的规范——旧的目录结构、已移除的依赖、过时的命令。指令文件过时比没有更危险:没有指令文件时 AI 至少会读代码推断;有过时指令文件时 AI 会优先遵循文件,哪怕文件已经错了。
正确做法:每当项目有重大变更,同步更新指令文件。架构决策变了、目录结构改了、依赖换了——都要同步。可以在 CI 中加一个检查:如果 git diff 里涉及了 CLAUDE.md 提到的文件/命令/路径,提醒更新。
反模式 7:测试后补(Tests as Afterthought)
先让 AI 写完功能,最后再补测试。
后果:AI 倾向于写"为代码服务"的测试(测实现细节)而非"验证需求"的测试(测行为)。这样的测试在重构时大面积失败,形成假安全感。
正确做法:先定义测试用例和验收条件,再让 AI 实现。测试是需求的可执行规格,不是代码的附属品。Anthropic 推荐"小步迭代"中的"每步完成后跑测试",也隐含了测试先行的思路。
反模式 8:抄袭但不理解(Copy-Paste Without Understanding)
AI 生成的代码能跑但不理解原理,出问题时无法调试。
后果:技术债快速积累,系统变成黑盒。AI 生成的代码不是问题——不理解它才是问题。
正确做法:要求 AI 解释关键设计决策,人工确保理解后再采纳。对于核心模块(认证、数据一致性、并发控制),即使 AI 生成了可运行代码,也要逐行审查。
收敛共识:五条工程师该记住的原则
不分工具,社区已经收敛到这些共识:
原则 1:Human-in-the-Loop 是特性不是缺陷
所有主流工具的最新版本都在增加"审核点"而非减少。Claude Code 的 --allowedTools 显式控制权限,Cursor Edit 模式需要逐个确认 diff,Aider 的 architect 模式把规划和实现拆成两步。这不是对 AI 能力的限制——这是工程纪律。
原则 2:测试是 AI 编码的"地面真相"
没有 test suite 的项目让 AI 编码等于盲飞——无法验证输出是否正确,只能靠人工读代码判断。好的测试套件让 AI 能自我验证,极大提高输出质量和迭代速度。Aider 的自动 lint+test 循环就是建立在这个原则上。
原则 3:上下文精准度大于上下文数量
10 行精准上下文胜过 1000 行噪声。Anthropic 官方推荐"只给 Claude 它需要知道的"。Cursor 的 @-mention、Aider 的 /add、Claude Code 的 subagent 模式——都是为了让上下文更精准而非更多。
原则 4:AI 擅长确定性任务,不擅长模糊需求
“写一个符合规范的 CRUD 端点”——AI 做得很好,因为输入和输出都可明确定义。“重新设计整个用户交互流程”——AI 不擅长,因为这需要人类做取舍和价值判断。正确做法:人类做高层设计和取舍,AI 做具体实现。
原则 5:迭代优于一次性完美
Write → Test → Review → Fix → Test 闭环比试图一次写对高效得多。允许 AI 犯小错,通过测试快速发现和修复。Anthropic 的 “小步迭代” 和 Aider 的自动修复循环都体现了这个原则。
总结
没有 SOP 的写法:
- 对 AI 说"帮我做这个功能",不做规划直接开写
- AI 产出的代码不验证就提交,全靠事后人工 debug
- 项目约定只存在脑子里(或对话历史里),下次换会话全丢
- 文档和代码各走各的路,过段时间两者互相矛盾
- 结果:项目越大越失控,AI 的每次介入都可能引入新的不一致
有 SOP 的写法:
- 先出计划等确认,每步可验证后再走下一步
- 每步修改后立即跑测试,有自动验证闭环就不会漏检
- 项目约定落地成 CLAUDE.md / AGENTS.md,AI 每次启动自动加载
- 不同变化速率的内容物理隔离——架构决策 append-only、需求文档是快照、临时笔记随便写
- 结果:项目规模增长不会导致失控,AI 的每次介入都建立在已知的约束之上
AI 驱动开发 SOP 的本质:不靠 AI 记忆,靠文件落地;不确定先规划,每步可验证;能自动化的纪律交给工具,不靠自查。