别急着换模型:让 AI 少乱改代码,先写这 4 条规则

AI 写代码最烦人的问题,很多时候不是模型不够聪明,而是默认行为没有边界。Karpathy 点过的错误假设、过度复杂化、无关修改,可以用一份短的 CLAUDE.md 压住。

你让 AI 给列表页加一个排序字段。

它确实加了。

顺手重构了查询构造器,改了配置文件格式,还把旁边几段它看不懂的注释“清理”掉了。PR 打开以后,你已经不关心排序对不对了,你只想知道:这些 diff 里,到底哪些是需求,哪些是它自作主张?

AI 编程规则封面

这就是现在用 Cursor、Claude Code、Codex 写代码时最常遇到的情况。

不是它完全不会写。

恰恰相反,它太会写了。它会替你补全意图,替你做设计,替你把“加一个参数”理解成“顺便把这块代码整理成我喜欢的样子”。

所以很多返工,表面看是模型质量问题,实际是行为边界问题。

模型越强,这个问题越明显。因为它不只会执行命令,它还会主动发挥。

Karpathy 点中的,不是语法错误,而是“像一个急躁的 junior”

Andrej Karpathy 今年发过一条很长的 X 帖,聊自己最近大量使用 Claude Code 的体验。

那条帖子最有价值的地方,不是“AI 编程让效率提升多少”,而是他把模型现在的错误类型说得很准。

这些错误已经不是早期那种低级语法问题了。

更像一个有点急、有点自信、又很想表现的 junior dev:

它会替你做假设,然后不确认就一路跑下去。

它不太会管理自己的困惑。不主动问,不把矛盾摆出来,也不在该反驳的时候反驳。

它还喜欢把代码和 API 做复杂。100 行能解决的事,它能先搭一个 1000 行的结构,再等你提醒“其实不用这样”,然后立刻缩回 100 行。

更糟的是,它有时会改掉自己没真正理解的注释和代码,即使这些内容和当前任务没关系。

Karpathy 原帖没有把这些正式命名成“三大陷阱”。但放回真实开发场景,基本可以归成三类:

第一类,错误假设。

需求里有歧义,它不问你,直接选一个解释继续做。你说“加校验”,它默认校验规则;你说“优化查询”,它默认可以改返回结构;你说“修这个 bug”,它默认可以顺手改掉附近看起来不顺眼的代码。

第二类,过度复杂化。

AI 很擅长把小问题写成大工程。加一个字段,它抽一个配置层;改一个分支,它补一套策略模式;本来只要一个 if,它给你铺出一排 interface。

第三类,无关修改。

这最伤 code review。因为 review 的成本不是看代码行数,而是判断每一行改动有没有必要。AI 一旦顺手改格式、改注释、改相邻逻辑,你就得重新建立上下文。

这时候你骂一句“模型不行”,很爽,但解决不了问题。

真正要问的是:你有没有告诉它,哪些自由不能用?

那个接近 19 万 Star 的 CLAUDE.md,其实是在立规矩

后来,社区把 Karpathy 这些观察整理成一个很短的 CLAUDE.md 模板,仓库叫 multica-ai/andrej-karpathy-skills

截至 2026 年 7 月 4 日下午查询,这个仓库已经有约 18.7 万 GitHub Stars。

这个数字真正说明的,不是“大家找到了神奇 prompt”。

它说明另一个更朴素的事实:用 AI 写代码的人,都在被同一类问题折磨。

这份文件不是 Karpathy 本人写的。更准确地说,它是社区基于 Karpathy 的观察,压缩出来的一组 Claude Code 行为规则。

核心就四条:

  • Think Before Coding
  • Simplicity First
  • Surgical Changes
  • Goal-Driven Execution

翻成工程语言,就是:

动手前先暴露假设。

实现时先压住复杂度。

修改时只碰必须碰的地方。

完成时用可验证目标闭环。

CLAUDE.md 四条规则如何压住 AI 的默认坏习惯

这四条听起来不新鲜。

你带新人时,大概率也会说类似的话:不确定先问,别过度设计,别顺手改不相关代码,做完跑测试。

问题是,人类新人能在 code review 里慢慢学会这些默认规则。AI 不会自动继承你团队的工程常识。你不写,它就按自己的默认行为来。

CLAUDE.md 的价值就在这里。

它不是一次性 prompt,而是项目里的工作规约。Claude Code 官方文档也把它描述成特殊文件:每次会话开始时会读取,适合放构建命令、代码风格、工作流规则和常见坑。

换句话说,它更像你给一个新队友的 onboarding 简报。

不是教它“什么是好代码”,而是告诉它:在这个项目里,什么不要做。

第一条:先想再写,别静默猜

AI 最容易犯的错,不是没想法,而是太快有想法。

一个需求进来,它会马上补全缺失信息。

你说“这里加个权限校验”,它可能默认所有接口共用一套权限模型。你说“修一下分页”,它可能默认前端和后端都能改。你说“保持兼容”,它可能只想到 API 返回值,没想到数据库迁移和老客户端。

如果它猜对了,你会觉得很聪明。

如果它猜错了,返工会很贵。

所以第一条规则不是“多思考”,而是把思考暴露出来:

  • 有哪些假设?
  • 哪些地方有歧义?
  • 有没有两种实现方向?
  • 哪个选择会影响接口、数据、兼容性?

这比让 AI 写更长的解释有用。

你要压住的是“静默选择”。

一个简单判断:如果这个问题拿给同事,他会先问两句再动手,那 AI 也应该先问两句。

第二条:简洁优先,别替未来写代码

AI 很容易过度设计,因为它没有维护痛感。

它不需要半年后回来读这段代码,也不会在下次事故里被人拉起来解释为什么这里多了三层抽象。

所以它会倾向于“看起来更完整”的方案。

更多配置,更多接口,更多扩展点,更多错误处理。

但真实项目里,复杂度不是免费的。

单次使用的抽象,没人敢删。过早抽出来的 interface,后来会反过来绑住实现。为了“灵活”加的配置,最后变成排查问题时多一层不确定性。

Simplicity First 这条规则要压住的,就是这种漂亮但没必要的复杂度。

不要加需求之外的功能。

不要为了一个调用点抽象。

不要为了“不排除未来可能”加配置。

如果 200 行能缩成 50 行,先缩。

这不是反对设计。

这是提醒 AI:工程里的好设计,很多时候不是把所有可能性都提前铺好,而是把当前问题解决得足够清楚,给未来留下可改空间。

第三条:精准修改,别把 review 变成考古

AI 写代码最伤人的一类 diff,是“顺手”。

顺手格式化一个文件。

顺手改一段注释。

顺手重命名一个变量。

顺手把它认为没用的逻辑删掉。

这些改动单独看,可能都说得过去。但放进一个 PR 里,reviewer 会崩溃。

因为他要判断的不再是“排序功能对不对”,而是“这 17 个文件里,每一处变化是不是都和排序有关”。

这就是 Surgical Changes 的意义。

只碰必须碰的地方。

不要改相邻代码。

不要清理和任务无关的历史包袱。

如果发现无关死代码,可以说出来,但不要替我删。

最硬的一句规则是:每一行改动,都应该能追溯到用户请求。

这句话适合直接放进你的项目 CLAUDE.md

它会让 AI 少做很多“好心的坏事”。

第四条:目标驱动,用验证闭环代替“看起来完成”

我见过不少团队给 AI 的任务是这样的:

“修一下这个 bug。”

“加一下校验。”

“优化一下这里。”

这类话对人类同事也不算好需求,对 AI 更糟。因为它不知道什么时候该停,只能停在“看起来完成”。

Claude Code 官方最佳实践里有个很重要的建议:给 Claude 一种验证工作的方式。

测试、构建、lint、复现脚本、截图对比,都可以。

关键是让它能得到一个通过或失败的信号。

所以 Goal-Driven Execution 不只是“目标驱动”这种漂亮话。它要把模糊任务改成可验证任务:

  • “加校验”改成:先写无效输入测试,再让测试通过。
  • “修 bug”改成:先写一个能复现 bug 的测试,再修到测试通过。
  • “重构这块”改成:重构前后测试都通过,公共接口不变。

有了这个闭环,AI 才能自己迭代。

否则你就是那个验证循环。它写一点,你看一眼;它错一次,你纠一次。最后不是 AI 帮你省时间,而是你在给 AI 当 QA。

怎么放进项目里

如果是新项目,可以直接用 README 里的命令下载:

1
2
curl -o CLAUDE.md \
  https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md

如果项目里已经有 CLAUDE.md,不要直接覆盖。

先读一遍,再追加或合并:

1
2
3
echo "" >> CLAUDE.md
curl https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md \
  >> CLAUDE.md

但我更建议你不要盲目复制完就结束。

这份模板真正值得学的,是它的结构:它不写“请写高质量代码”这种废话,而是把坏行为一个个压住。

你自己的项目也应该这么写。

不要写:

1
2
3
- Write clean and maintainable code.
- Follow best practices.
- Avoid bugs.

这类话太空,AI 也知道应该“写好代码”。

应该写得更具体:

1
2
3
4
5
- Before editing, name assumptions if the request is ambiguous.
- Do not refactor adjacent code unless the task asks for it.
- Every changed line must trace to the user request.
- For bug fixes, add or run a reproduction test before claiming done.
- Run `go test ./...` before finishing backend changes.

这才是 AI 真的会用上的上下文。

CLAUDE.md 不需要很长。Anthropic 的文档也提醒过,它应该短、清楚、广泛适用。太长的规则文件会把真正重要的东西埋掉。

一个好标准是:删掉这一行,AI 会不会更容易犯错?

如果不会,就删。

它不是安全机制,只是行为约束

这里要压住另一个误解。

CLAUDE.md 不是保险丝。

它不能保证 AI 不误删文件,不能替代权限控制,也不能替代 CI 和 code review。

对生产数据库、密钥、迁移脚本、不可逆操作,你还是需要 hooks、权限、审批、测试环境和人工确认。

规则文件解决的是另一层问题:让 AI 的默认行为更接近一个靠谱工程师的默认动作。

它让 AI 少猜一点,少设计一点,少顺手一点,多验证一点。

这已经很有价值了。

因为 AI 编程最可怕的地方,往往不是它写错一行代码。写错可以测出来,可以 review 出来。

更可怕的是它把错误藏在一堆“看起来也合理”的改动里,让你不知道从哪里开始审。

最后带走这句话

下次 AI 又把一个小需求写成大工程,别只急着换模型。

先看你的项目有没有告诉它四件事:

不确定时先暴露假设。

实现时先选简单方案。

修改时只碰任务范围。

完成时必须有验证信号。

AI 编程的关键,不是让模型更自由,而是让它知道哪些自由不能用。