10分钟学会andrej-karpathy-skills:快速入门教程
andrej-karpathy-skills是一个基于Andrej Karpathy对LLM编码陷阱观察而开发的项目,旨在通过一个CLAUDE.md文件来改善Claude Code的行为,帮助开发者避免常见的LLM编码错误,提升代码质量和开发效率。## 项目简介:为什么需要andrej-karpathy-skills?在使用LLM(大型语言模型)进行编码时,我们常常会遇到一些问题。Andr
10分钟学会andrej-karpathy-skills:快速入门教程
andrej-karpathy-skills是一个基于Andrej Karpathy对LLM编码陷阱观察而开发的项目,旨在通过一个CLAUDE.md文件来改善Claude Code的行为,帮助开发者避免常见的LLM编码错误,提升代码质量和开发效率。
项目简介:为什么需要andrej-karpathy-skills?
在使用LLM(大型语言模型)进行编码时,我们常常会遇到一些问题。Andrej Karpathy指出,模型会代表你做出错误的假设并继续运行,不会管理自己的困惑,不寻求澄清,不暴露不一致之处,不呈现权衡,在应该拒绝的时候不拒绝。它们还非常喜欢过度复杂化代码和API,膨胀抽象概念,不清理死代码,用1000行代码实现一个本可以用100行完成的臃肿结构,有时还会在不充分理解的情况下更改或删除与任务无关的注释和代码。
而andrej-karpathy-skills项目通过一个文件中的四个原则直接解决这些问题,帮助我们更好地利用LLM进行编码。
快速安装:两种简单方法
方法A:Claude Code插件(推荐)
从Claude Code内部,首先添加市场:
/plugin marketplace add forrestchang/andrej-karpathy-skills
然后安装插件:
/plugin install andrej-karpathy-skills@karpathy-skills
这会将指南作为Claude Code插件安装,使该技能在所有项目中可用。
方法B:CLAUDE.md(每个项目)
新项目:
curl -o CLAUDE.md https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md
现有项目(追加):
echo "" >> CLAUDE.md
curl https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md >> CLAUDE.md
四大核心原则:提升LLM编码质量的关键
1. Think Before Coding(编码前思考)
不要假设,不要隐藏困惑,展示权衡。LLM通常会默默地选择一种解释并继续。这一原则迫使明确推理:明确陈述假设,如果不确定,就询问;呈现多种解释,当存在歧义时不要默默地选择;在有必要时拒绝,如果存在更简单的方法,要说出来;当困惑时停止,说出不清楚的地方并寻求澄清。
2. Simplicity First(简洁优先)
用最少的代码解决问题,不要有投机成分。对抗过度工程化的倾向:不添加超出要求的功能;不为单一用途的代码创建抽象;不添加未被请求的“灵活性”或“可配置性”;不为不可能的场景添加错误处理;如果200行代码可以精简为50行,就重写它。检验标准是:资深工程师会认为这过于复杂吗?如果是,就简化。
3. Surgical Changes(精准修改)
只触碰必须修改的部分,只清理自己造成的混乱。编辑现有代码时:不要“改进”相邻的代码、注释或格式;不要重构没有损坏的东西;匹配现有的风格,即使你会用不同的方式;如果你注意到不相关的死代码,提及它,不要删除它。当你的更改产生了无用代码时:删除你的更改导致未使用的导入/变量/函数;除非被要求,否则不要删除预先存在的死代码。检验标准是:每一行更改都应直接追溯到用户的请求。
4. Goal-Driven Execution(目标驱动执行)
定义成功标准,循环直到验证通过。将命令式任务转换为可验证的目标,例如将“添加验证”转换为“为无效输入编写测试,然后使其通过”,将“修复错误”转换为“编写一个重现错误的测试,然后使其通过”,将“重构X”转换为“确保测试在重构前后都通过”。对于多步骤任务,陈述一个简要计划:
1. [步骤] → 验证:[检查]
2. [步骤] → 验证:[检查]
3. [步骤] → 验证:[检查]
强有力的成功标准让LLM能够独立循环,而弱标准(如“使其工作”)需要不断澄清。
实际应用示例:原则如何发挥作用
Think Before Coding示例
当用户请求“添加导出用户数据的功能”时,LLM通常会假设导出所有用户、文件位置、包含的字段等,而正确的做法是先明确假设,例如询问是导出所有用户还是筛选的子集、导出的格式是浏览器下载文件、带邮件通知的后台作业还是返回数据的API端点、要包含哪些用户字段以及通常有多少用户等。
Simplicity First示例
当用户请求“添加计算折扣的函数”时,LLM可能会过度设计,使用抽象类、枚举等创建复杂的结构,而简单的做法是编写一个直接计算折扣的函数,如:
def calculate_discount(amount: float, percent: float) -> float:
"""Calculate discount amount. percent should be 0-100."""
return amount * (percent / 100)
只有在实际需要多种折扣类型时再进行重构。
如何判断原则是否生效
如果看到以下情况,说明这些指南正在发挥作用:差异中不必要的更改更少,即只出现请求的更改;由于过度复杂化而导致的重写更少,代码第一次就很简单;澄清问题在实现之前提出,而不是在错误之后;PR干净、最小,没有随意的重构或“改进”。
自定义与权衡
这些指南旨在与特定于项目的指令合并,可以将它们添加到现有的CLAUDE.md或创建一个新的。对于特定于项目的规则,可以添加类似“使用TypeScript严格模式”“所有API端点必须有测试”等部分。需要注意的是,这些指南偏向于谨慎而非速度,对于琐碎的任务(简单的拼写错误修复、明显的单行代码),要运用判断力,并非每个更改都需要完全的严谨性,目标是减少非琐碎工作中的代价高昂的错误,而不是减慢简单任务的速度。
更多推荐




所有评论(0)