andrej-karpathy-skills:CLAUDE.md 完整拆解
【免费下载链接】andrej-karpathy-skillsA single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills
让 AI 修一个空值崩溃,它顺手把注释、引号、类型注解全翻新,diff 比功能本身还大——这场景熟不熟悉?andrej-karpathy-skills 就是冲着它来的:把 Andrej Karpathy 对 LLM 编码陷阱的观察,压成一份 65 行的 CLAUDE.md,四组行为准则专治瞎假设、堆抽象、乱改不相干代码这三类毛病,diff 从此干净到只剩你要的改动。
拆出一份 65 行的 CLAUDE.md 📐
Karpathy 吐槽过 LLM 写代码的四种毛病:替用户瞎假设还不问、一百行能写完的活堆上千行、顺手改掉自己也没完全看懂的注释和代码、任务没有验收标准只能蒙。这个项目把吐槽翻成了行为文件:CLAUDE.md 全文 65 行,MIT 协议,丢进项目根目录即生效,给所有用 Claude Code 写代码的人兜底。
核心资产就这一个文件,其余都是镜像:skills/karpathy-guidelines/SKILL.md 是插件形态,EXAMPLES.md 是配套的案例与反模式集。
把四条原则拆成一条链 🔧
四条原则不是平铺的清单,而是按编码流程排好的:先管住输入,再管住产出,最后管住验收。
1. 编码前思考(把隐藏假设逼到台面上)
管的是"输入"。模型遇到歧义会默默选一个解释直接开干,困惑藏起来不说。准则要求:假设必须写出来,不确定就问;存在多种解释就都摆出来,不许默默挑一个;发现更简单的路,直说并顶回去。效果是澄清问题出现在动手之前,而不是踩坑之后。
2. 简洁优先(用解决问题的最小代码)
管的是"产出"。为算一个折扣写出抽象基类加策略模式,是 LLM 最爱的炫技。准则列了四道禁令:
- 不加没要的功能
- 不给单一用途的代码做抽象
- 不加没人要的配置与"灵活性"
- 不防不可能发生的场景
200 行能压到 50 行就重写。验收标准一句话——资深工程师会觉得过于复杂吗?是,就砍。
3. 外科手术式修改(只动必须动的行)
管的是"改动"。修 bug 的路上顺手翻新注释、引号、docstring,是 diff 变脏的头号原因。准则划线:不改进相邻代码,不重构没坏的东西,匹配现有风格哪怕自己不爱,发现无关死代码只提一嘴不删;自己这次改动弄出的孤儿导入才清理。判据一句话:每一行改动都应能直接追溯到那次请求。
4. 目标驱动执行(把指令翻译成可验证目标)
管的是"验收"。"修一下登录"这种任务没有终点线,模型只能边做边问。准则把命令式任务改写成测试先行的目标,多步骤任务列成"步骤 → 验证"清单:
1. 写复现测试 → 验证:测试失败(说明复现成功) 2. 实现修复 → 验证:该测试通过 3. 回归检查 → 验证:全量测试绿成功标准越强,模型越能独立循环推进,不用人一直盯着确认。
| 命令式说法 | 可验证目标 |
|---|---|
| "加个校验" | "为非法输入写测试,再让它通过" |
| "修这个 bug" | "写一个能复现它的测试,再让它通过" |
| "重构 X" | "确保重构前后测试都通过" |
对比同一个 bug 的两种 diff ✅
任务:修复空 email 导致校验器崩溃。
❌ 常见写法——修 bug 的路上顺手把整个函数翻新:
def validate_user(user_data): - # Check email format - if not user_data.get('email'): + """Validate user data.""" + email = user_data.get('email', '').strip() + if not email: raise ValueError("Email required") + username = user_data.get('username', '').strip()注释改了,docstring 加了,连 username 分支也被重写——而崩溃只发生在 email 那条路径上。
✅ 外科手术式:只碰崩溃路径。
def validate_user(user_data): # Check email format - if not user_data.get('email'): + email = user_data.get('email', '') + if not email or not email.strip(): raise ValueError("Email required")两处修复的第一刀几乎一样,差距全在"顺手"二字。判据很简单:diff 里每一行都要能回答"这一行是为什么改的",答不上来的就是夹带的。
60 秒把准则装进项目 🚀
$ git clone https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills $ cp andrej-karpathy-skills/CLAUDE.md 你的项目/CLAUDE.md $ cat andrej-karpathy-skills/CLAUDE.md >> CLAUDE.md # 已有 CLAUDE.md 的项目三行搞定:clone、新项目直拷、老项目追加。
按需进阶:在 Claude Code 里先加插件市场再安装插件,两步让准则跨项目生效,省去每个仓库手动拷贝;用 Cursor 的话,仓库里附了 CURSOR.md,同一套规则换个壳就能接上。
看出准则在起作用的四个信号 ✅
- diff 里只剩请求的改动,没有顺手的格式翻新与 docstring
- 实现之前先收到澄清问题(范围、格式、字段),而不是踩坑之后
- 代码第一次就保持简单,不用为过度抽象返工重写
- PR 干净,没有夹带的重构和"改进"
Karpathy 留下这个项目最有分量的一句话:"别告诉模型该做什么,给它成功标准,看它自己跑。" LLM 本来就擅长朝明确目标循环,这份 65 行的准则只是把"明确"两个字提前到了动手之前——下次 diff 比功能还大的时候,先想想是哪里没给它成功标准。
【免费下载链接】andrej-karpathy-skillsA single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考