andrej-karpathy-skills实操避坑指南:4条规则让AI不再乱改你的代码
【免费下载链接】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
andrej-karpathy-skills 是把 Karpathy 对 LLM 编码陷阱的观察,浓缩成一份 CLAUDE.md 行为规则文件的项目。如果你的 AI 曾悄悄做出假设就把功能写完、100 行能解决的事给你 1000 行、或"顺手"改了你没让它动的代码,这份文件是对症的。
😤 AI 背叛你的 3 种常见姿势
你大概没少遇到:AI 自作主张加类型注解、把单引号统一成双引号,还"顺手"润色了旁边的注释;或者你只让它算个折扣,它回你一个策略模式加配置类。
别慌,这不是你的运气问题。Karpathy 的原话很直接:模型会替你做出错误假设,然后不验证就一路跑下去;不管理自己的困惑,不寻求澄清,不展示权衡;特别喜欢搞复杂代码和 API,1000 行本 100 行就够;哪怕与任务无关,也会顺手改掉它并不充分理解的注释和代码。
对应到你最常踩的 3 类错误行为:
- 悄悄假设:只说"加个导出功能",它自己选定格式、字段、范围,一路做完;
- 过度工程:抽象提前建好,需求从没提过,没人用;
- 误伤:修个 bug,相邻代码的格式、注释、风格全变了,没法 review。
这个项目把这些问题压成 4 条规则,装进一份 CLAUDE.md。它不是工具,只是 AI 写代码前先读的一份行为契约。
⚡ 先看对比:30 行折扣代码 vs 3 行
让它"加一个折扣计算函数",它经常交出这样的东西:
❌ 典型的过度实现(摘自 EXAMPLES.md):
from abc import ABC, abstractmethod class DiscountStrategy(ABC): @abstractmethod def calculate(self, amount: float) -> float: pass class PercentageDiscount(DiscountStrategy): def __init__(self, percentage: float): self.percentage = percentage def calculate(self, amount: float) -> float: return amount * (self.percentage / 100) # ……省略无关部分:FixedDiscount、DiscountConfig、 # DiscountCalculator 及上下限校验,还有 30 多行注意:设计本身没有错,策略模式、配置对象、上限校验,全是教科书做法。问题在时机:这些抽象对应的需求根本没出现过。
✅ 应该长这样:
def calculate_discount(amount: float, percent: float) -> float: """计算折扣金额,percent 应在 0-100 之间。""" return amount * (percent / 100) # 使用 discount = calculate_discount(100.0, 10.0) # 优惠 10 美元好的代码是简单解决今天的问题,而不是提前解决明天的问题。真到了需要多种折扣类型的那天再重构,加一个函数的成本远低于拆一套抽象。
🧭 4 条规则,三段落地:想清楚、改准、验证过
4 条规则对应你和 AI 协作的三个阶段。
认知层:编码前思考
"不要假设,不要隐藏困惑,把权衡摆到台面上"——这是排第一的规则。
要求是:明确列出假设;存在多种解释时逐条列出,而不是默默选一条;有更简单的做法就说;不懂就停下,说出哪里不懂。
加上这条规则后,你说"让搜索更快",AI 应该回你:
"更快"可能是三件事:① 响应时间低于 100ms,加索引和缓存;② 扛更多并发,上异步;③ 感知更快,渐进加载。各自工作量不同,你最在意哪个?
而不是默默写 200 行优化代码。
操作层:简单优先 + 外科手术式修改
操作层两条,一内一外:
- 简单优先(对内):不实现没要求的功能,不做单次使用的抽象,不为不可能的场景写错误处理;200 行能压到 50 行就重写。
- 外科手术式修改(对外):不碰相邻代码,匹配现有风格,发现无关死代码只提一句、不删。标准是:每一行改动都能追溯回你的请求。
EXAMPLES.md 里"修 bug"的例子很典型,任务是修复空邮件导致崩溃:
❌ AI 常见的返回:
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") - # Basic email validation - if '@' not in user_data['email']: + if '@' not in email or '.' not in email.split('@')[1]: raise ValueError("Invalid 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 里真正的修复只有几行,其余全是附带的"改进"。review 时你得逐行分辨哪些是修复、哪些是自我发挥,成本立刻爆炸。
验证层:目标驱动执行
LLM 特别擅长"循环直到达成明确目标"。这条规则要求把任务翻译成可验证的目标:
- "加校验" → 为无效输入写测试,然后让它通过;
- "修 bug" → 先写一个能复现 bug 的测试,再让它通过;
- "重构 X" → 保证重构前后测试都通过。
多步任务则要求先给出计划,每步带验证方式:
1. 单端点加内存限流 → 验证:100 次请求只有前 10 次通过 2. 抽成中间件 → 验证:其他端点测试不回归 3. 换 Redis → 验证:重启后计数不丢失弱目标("让它能跑")需要你不停确认;强目标让 AI 自己循环。这就是杠杆。
🧪 3 个高频场景 × 各自该盯什么
只记一条决策路径的话,记这个:
规则落到你最高的三个场景:
| 场景 | 最容易翻车点 | 规则逼 AI 做什么 | 一句话自查 |
|---|---|---|---|
| 写新功能 | 假设蔓延、投机性功能 | 列出假设,只做被要求的事 | 每行代码是否来自我明确提出的需求? |
| 修 Bug | 不复现就改、改完说不清 | 先写复现测试,修完确认无回归 | diff 里是否只有与本 bug 相关的行? |
| 改老代码 | 顺手重构、风格漂移 | 匹配现有风格,只清理本次产生的孤儿代码 | 每处改动能否追溯到请求? |
🔌 上手:给 CLAUDE.md 追加规则的正确姿势
仓库很小,核心就 4 个文件:
- CLAUDE.md:主规则文件,你要装的就是它;
- EXAMPLES.md:每条规则的正反代码对比;
- skills/karpathy-guidelines/SKILL.md:同样内容打包成的可复用技能;
- CURSOR.md:Cursor 规则接入说明。
方式 A:Claude Code 插件,一次安装、所有项目可用:
/plugin marketplace add forrestchang/andrej-karpathy-skills /plugin install andrej-karpathy-skills@karpathy-skills方式 B:按项目安装,适合任何读根目录指令文件的工具:
git clone https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills cp andrej-karpathy-skills/CLAUDE.md 你的项目根目录/已有 CLAUDE.md 就追加进去,规则文件本来就是设计来与项目专属规则合并的。用 Cursor 的话,把仓库里的.cursor/rules/karpathy-guidelines.mdc拷进项目即可,它带alwaysApply: true,开箱生效。
🚧 什么时候不用较真
这套规则整体偏向谨慎而非速度:目标是非平凡任务上少犯昂贵错误,不是拖慢简单任务。
这几种情况可以松一松:
- 修拼写、改一行明显的笔误;
- 绿地项目,没有存量风格需要匹配;
- 你本来就希望 AI 把多种架构方案列出来给你挑。
怎么确认规则生效了?看三个可观察信号:diff 里与请求无关的改动变少、因过度复杂而返工变少、澄清问题出现在实现之前而不是出错之后。
下一步:clone 这个仓库,把 CLAUDE.md 放进你的项目根目录,然后在下一个任务里看 AI 先问你什么。
【免费下载链接】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),仅供参考