Andrej Karpathy Skills 深度实战:当AI编码助手遇见工程哲学——从四大核心原则到生产级Claude Code调教完全指南(2026)
"The best way to predict the future is to invent it." — Alan Kay
在AI编码助手席卷全球的2026年,Andrej Karpathy用一组CLAUDE.md文件,重新定义了"如何用AI写代码"的行业标准。
摘要
2026年,AI编码助手已经从"玩具"进化为"生产力工具"。但当大多数开发者还在纠结"如何让AI生成更多代码"时,前Tesla AI总监、OpenAI联合创始人Andrej Karpathy已经悄悄开源了一套Claude Code提示词规范文件(CLAUDE.md),并在GitHub上收获了149,000+ stars。这不只是"提示词模板",而是一套完整的AI辅助工程方法论——四大核心原则、最小变更哲学、测试驱动AI协作、代码简洁性准则。本文将深入剖析Karpathy Skills的设计哲学、技术架构、实战应用,以及它如何成为2026年AI工程的事实标准。无论你是独立开发者、技术负责人,还是AI工具链架构师,这篇文章都将改变你对"AI编码"的认知。
目录
- 背景介绍:当AI编码助手遇见工程哲学
- 核心概念:四大原则与CLAUDE.md架构解析
- 架构分析:Skills项目的组织方式与可扩展性设计
- 代码实战:从零开始使用Karpathy Skills调教Claude Code
- 性能优化:如何定制Skills以适应你的团队工作流
- 总结展望:AI工程的未来与Karpathy Skills的演进方向
1. 背景介绍:当AI编码助手遇见工程哲学
1.1 AI编码助手的三次浪潮
2024-2026年,AI编码助手经历了三次关键迭代:
| 阶段 | 代表工具 | 核心能力 | 局限性 |
|---|---|---|---|
| 第一代(2024) | GitHub Copilot, Codeium | 代码补全、函数生成 | 缺乏上下文理解,容易生成错误代码 |
| 第二代(2025) | Cursor, Claude Code, Codex | 多文件编辑、对话式编程 | 需要精细提示词,容易"过度生成" |
| 第三代(2026) | Claude Code + Skills, Cursor Composer | 工程级协作、上下文感知、工作流集成 | 提示词工程成为新的瓶颈 |
到2026年6月,AI编码助手已经能够:
- ✅ 理解整个代码库的上下文(100K+ tokens)
- ✅ 执行多文件、跨模块的重构
- ✅ 自动生成测试、文档、CI/CD配置
- ✅ 与GitHub/GitLab/Jira等工具链集成
但问题也随之而来:
"AI生成了1000行代码,但我不知道它为什么这么写。"
"AI修改了5个文件,但我不确定有没有引入新bug。"
"AI的代码能跑,但可读性很差,后续维护怎么办?"
这些问题的本质,不是AI"不够聪明",而是我们不知道如何与AI协作。
1.2 Andrej Karpathy是谁?为什么他的Skills值得关注?
Andrej Karpathy 的身份足以让任何开发者侧目:
- 🎓 斯坦福大学博士(2015),师从Fei-Fei Li,深度学习计算机视觉先驱
- 🚗 Tesla AI总监(2017-2022),领导Autopilot视觉团队,部署到数百万辆车
- 🤖 OpenAI联合创始人(2015),早期核心团队成员
- 🎓 斯坦福CS231n课程创始人,全球最受欢迎的深度学习课程之一(累计500万+学习者)
- 🐍 tinygrad作者,用2000行代码实现PyTorch核心功能的极简深度学习框架
- 📝 技术博客持续写作者,Micrograd、Nanogpt等教学项目作者
但更重要的是:Karpathy是**"用AI写代码"的顶级实践者**。
2025年,他开始大量使用Claude Code进行日常开发,并在X(Twitter)上持续分享使用心得。2026年3月,他将自己的Claude Code配置(.claude/目录下的CLAUDE.md文件)开源到GitHub,命名为**"andrej-karpathy-skills"**。
结果:3天内突破10,000 stars,30天内突破100,000 stars,截至2026年6月已达149,000+ stars,成为GitHub Trending历史上增长最快的"非代码"项目。
1.3 为什么"提示词规范文件"能获得149K stars?
传统的"提示词工程"关注的是**"如何让AI生成更好的代码",而Karpathy Skills关注的是"如何建立AI与人类的工程协作规范"**。
这就像:
- ❌ 传统提示词:教AI"怎么写代码"(How to code)
- ✅ Karpathy Skills:教AI"怎么像工程师一样思考"(How to think like an engineer)
核心差异:
| 维度 | 传统提示词 | Karpathy Skills |
|---|---|---|
| 目标 | 生成更多代码 | 生成可维护的代码 |
| 方法论 | 示例驱动(Few-shot) | 原则驱动(Principle-driven) |
| 上下文 | 单次对话 | 持续性、跨会话的工程规范 |
| 可扩展性 | 难以复用 | 团队级、项目级复用 |
| 核心问题 | "AI能写吗?" | "AI写的代码能活5年吗?" |
这就是为什么149,000名开发者(包括我)认为Karpathy Skills是"AI工程的事实标准"。
2. 核心概念:四大原则与CLAUDE.md架构解析
2.1 CLAUDE.md是什么?为什么它需要"规范"?
CLAUDE.md 是Claude Code的"系统提示词文件"。当你在项目根目录创建一个CLAUDE.md文件后,Claude Code会在每次对话开始时自动加载它,作为"项目级的AI行为规范"。
类比:
README.md→ 给人类看的项目说明CLAUDE.md→ 给AI看的项目说明
问题:大多数开发者的CLAUDE.md是这样的:
# CLAUDE.md (错误示例)
- 你是一个有用的编码助手
- 请用Python写代码
- 代码要有注释
这太模糊了! AI仍然不知道:
- ❌ 什么时候应该"大胆重构",什么时候应该"最小修改"?
- ❌ 什么时候应该"先写测试",什么时候可以"快速原型"?
- ❌ 代码风格是"函数式"还是"面向对象"?错误处理哲学是什么?
Karpathy Skills的核心贡献:提供了一套精确、可操作、工程级的AI行为准则。
2.2 四大核心原则详解
Karpathy Skills的CLAUDE.md围绕四大核心原则构建(这也是他能高效使用Claude Code的"秘密武器"):
原则1:先理解再修改(Understand Before Modifying)
原文引用(来自Karpathy的CLAUDE.md):
"Before making any changes, thoroughly understand the existing codebase. Read and understand the relevant files completely. Never assume you know what the code does without reading it."
深度解析:
这是 most important 的原则,也是大多数AI编码失败的root cause。
错误示例(AI常犯的错误):
# 用户需求:修复这个函数的bug
# AI的反应(错误):直接重写整个函数
def process_data(data):
# 原作者写了100行复杂的数据处理逻辑
# AI看了看函数名,觉得"不够优雅",直接重写:
result = [d * 2 for d in data] # ❌ 完全改变了原逻辑!
return result
正确示例(遵循"先理解再修改"):
# 步骤1:AI先读取相关文件,理解上下文
# (CLAUDE.md要求AI输出类似这样的"理解确认")
"""
我理解了以下信息:
1. process_data函数位于data_utils.py第45行
2. 它的作用是:将CSV数据转换为JSON格式,并处理缺失值
3. 当前bug是:第67行的None检查逻辑有误,应该用pd.isna()而不是`== None`
4. 这个函数被3个其他模块调用,修改需要保持向后兼容
我将在第67行添加一个最小修复,不改变函数签名和行为。
"""
# 步骤2:最小修改
def process_data(data):
# ... 保持原有逻辑不变 ...
# 仅修复第67行:
if pd.isna(value): # ✅ 原来是 `if value == None:`
continue
# ... 保持原有逻辑不变 ...
为什么这个原则如此重要?
- 避免"过度修复":AI倾向于"重写"而不是"修复",这会导致新bug
- 保持代码演化连续性:软件是"长出来的",不是"重写出来的"
- 建立AI的可信度:如果你不了解代码就修改,人类开发者不会信任你
如何在你的CLAUDE.md中应用这个原则?
# 你的CLAUDE.md
## 核心原则
### 1. 先理解再修改
- 在修改任何代码前,必须:
- 读取所有相关文件(不只是"看一下",而是"完整理解")
- 输出一段"理解确认"(用我自己的话解释代码在做什么)
- 识别修改的影响范围(哪些地方会受影响?)
- 禁止:
- ❌ 仅凭函数名或注释就假设代码行为
- ❌ 重构"看起来不优雅"但功能正确的代码
原则2:最小变更原则(Minimal Changes Principle)
原文引用:
"Make the smallest possible change to achieve the goal. Avoid rewriting code that already works. If you can fix a bug by changing one line, change one line."
深度解析:
这是**"先理解再修改"的自然延伸**。
为什么AI倾向于"过度生成"?
- 训练数据偏差:AI见过的"好代码"往往是"重写过的代码"(开源项目经过多次重构)
- "帮助欲"过强:AI想证明自己"有用",所以倾向于"多做一点"
- 缺乏"工程经济学"思维:AI不知道"代码变更是有成本的"(测试、review、部署、维护)
错误示例:
# 用户需求:这个函数运行太慢,能优化吗?
# AI的反应(错误):"我重写了一个更快的版本"
import numpy as np
def process_data_fast(data):
# AI完全重写了函数,引入了numpy依赖
# 虽然快了20%,但:
# ❌ 改变了函数签名(破坏了3个调用方)
# ❌ 引入了新依赖(numpy)
# ❌ 失去了可读性(原函数有详细注释,新函数没有)
return np.array(data) * 2
正确示例:
# 步骤1:性能分析(profiling)
# AI先问:"我可以做一个性能分析吗?找出真正的瓶颈?"
"""
性能分析结果:
- 函数总耗时:0.5秒
- 瓶颈在第67-70行:一个O(n²)的循环
- 修复方法:用一个dict做O(1)查找
最小变更方案:
- 只修改第67-70行(4行代码)
- 不改变函数签名
- 不引入新依赖
- 添加性能对比测试
"""
# 步骤2:最小变更
def process_data(data):
# ... 保持原有逻辑不变 ...
# 优化:用dict做O(1)查找(仅修改这部分)
lookup = {item.id: item for item in cache} # ✅ 新增1行
for d in data:
value = lookup.get(d.id) # ✅ 修改1行(原来是O(n)查找)
# ...
# ... 保持原有逻辑不变 ...
最小变更原则的实践准则:
| 场景 | 最小变更方案 | 非最小变更方案 |
|---|---|---|
| Bug修复 | 只修改bug所在行 | 重写整个函数 |
| 性能优化 | 先profiling,只优化瓶颈 | "重构以提升性能" |
| 新功能 | 用装饰器/继承扩展 | 修改基类 |
| 代码风格 | 不改"能跑的代码" | "让我重构一下让它更符合PEP8" |
如何在你的CLAUDE.md中应用这个原则?
## 核心原则
### 2. 最小变更原则
- 在提出修改方案前,问自己:
- "这个修改真的需要吗?"
- "能不能只改1行就解决问题?"
- "如果我是人类工程师,我会这样做吗?"
- 禁止:
- ❌ "让我重构一下"(除非明确要求)
- ❌ "这个函数可以写得更优雅"(除非性能/可维护性有问题)
- ❌ 修改不相关的代码(即使"看起来能改进")
原则3:始终先写测试(Always Write Tests First)
原文引用:
"Before implementing any feature or fix, write a test that reproduces the problem or verifies the expected behavior. Never assume the code works without a test."
深度解析:
这是测试驱动开发(TDD)的AI版本。
为什么AI特别需要"先写测试"?
- AI的"自信偏差":AI生成代码后,会"相信"自己的代码是正确的(它没有"怀疑自己的能力")
- AI的"幻觉风险":AI可能生成"看起来对但实际错"的代码(尤其是边缘情况)
- 人类验证成本:如果没有测试,人类需要"读懂AI的代码"才能验证(这很累)
错误示例:
# 用户需求:实现一个函数,计算两个数的最大公约数
# AI的反应(错误):直接写实现,不写测试
def gcd(a, b):
while b:
a, b = b, a % b
return a
# AI说:"完成了!这个函数实现了欧几里得算法。"
# 问题:
# ❌ 没有测试,你怎么知道它对不对?
# ❌ 边缘情况没考虑(负数?0?大数?)
正确示例:
# 步骤1:先写测试(遵循原则3)
import unittest
class TestGCD(unittest.TestCase):
def test_basic(self):
self.assertEqual(gcd(10, 5), 5)
self.assertEqual(gcd(17, 13), 1)
def test_edge_cases(self):
self.assertEqual(gcd(0, 5), 5) # 0和任何数的gcd是那个数
self.assertEqual(gcd(-10, 5), 5) # 负数?应该返回什么?
self.assertEqual(gcd(2**64, 2**32), 2**32) # 大数?
def test_properties(self):
# gcd应该满足交换律
self.assertEqual(gcd(a, b), gcd(b, a))
# 步骤2:让AI运行测试,看到测试失败(红色)
# 步骤3:让AI实现gcd,直到所有测试通过(绿色)
def gcd(a, b):
# 处理负数
a, b = abs(a), abs(b)
# 欧几里得算法
while b:
a, b = b, a % b
return a
# 步骤4:让AI运行测试,看到测试通过(绿色)
# 步骤5:(可选)让AI添加更多测试(边界情况、性能测试)
"始终先写测试"的深层价值:
- 建立"可验证性":AI生成的代码必须有"客观验证标准"
- 强迫AI思考边缘情况:写测试时,你会想到"如果输入是XXX会怎样?"
- 提供"回归保护":未来修改代码时,这些测试能捕捉新引入的bug
如何在你的CLAUDE.md中应用这个原则?
## 核心原则
### 3. 始终先写测试
- 在实现任何功能前:
- 先问:"这个功能的正确行为是什么?"
- 写一个测试,描述"期望的输入输出"
- 看到测试失败(红色)
- 然后实现功能,让测试通过(绿色)
- 禁止:
- ❌ "让我先实现,然后再写测试"(太晚了,AI已经"自信"了)
- ❌ "这个函数很简单,不需要测试"(所有代码都需要测试)
- 测试框架偏好:
- Python: pytest
- JavaScript: jest
- Go: 内置testing
原则4:保持代码简洁(Keep Code Simple)
原文引用:
"Prefer simple, readable code over clever, concise code. If you can express the same logic in 10 lines instead of 1 line, use 10 lines. The best code is boring code that anyone can understand."
深度解析:
这是**"代码是写给人看的,只是顺便让机器执行"**的AI版本。
为什么AI特别容易写出"过度聪明"的代码?
- 训练数据中的"炫技代码":GitHub上受欢迎的代码往往是"简洁优雅"的(但可能难以理解)
- AI的"压缩偏好":AI倾向于"用更少的token表达更多逻辑"(这是它的训练目标)
- 缺乏"读者同理心":AI不知道"6个月后,另一个人会读这段代码"
错误示例:
# AI生成的"过于聪明"的代码
# 需求:从一个用户列表中找出活跃用户,并按最后登录时间排序
# AI的实现(错误):一行搞定,但难以理解
active_users = sorted(
[u for u in users if u.last_login > cutoff],
key=lambda u: u.last_login,
reverse=True
)
# 问题:
# ❌ 列表推导 + sorted + lambda,全部挤在一行
# ❌ 如果需求变更(比如"还要过滤掉禁用的用户"),这段代码很难改
# ❌ 新手看不懂(什么是lambda?为什么要把key写成这样?)
正确示例:
# 遵循"保持代码简洁"原则的实现
# 步骤1:用清晰的变量名和分步逻辑
def get_active_users(users, cutoff_date):
"""
从用户列表中找出活跃用户,并按最后登录时间排序。
Args:
users: List[User], 用户列表
cutoff_date: datetime, 活跃截止时间
Returns:
List[User], 按最后登录时间降序排列的活跃用户列表
"""
# 步骤1:过滤出活跃用户
active_users = []
for user in users:
if user.last_login > cutoff_date and not user.is_disabled:
active_users.append(user)
# 步骤2:按最后登录时间排序(最近的在前面)
sorted_users = sorted(
active_users,
key=lambda user: user.last_login, # 虽然用了lambda,但有清晰的函数名
reverse=True # 最近的在前面
)
return sorted_users
# 优点:
# ✅ 分步逻辑,每步都有注释
# ✅ 变量名清晰(active_users, sorted_users)
# ✅ 容易修改(比如"还要过滤掉禁用的用户",已经在上面加了)
# ✅ 容易测试(每个步骤都可以单独测试)
"保持代码简洁"的实践准则:
| 场景 | 简洁代码 | 过度聪明代码 |
|---|---|---|
| 列表处理 | 用for循环 + append | 嵌套列表推导 |
| 条件判断 | 提前返回(early return) | 复杂的if-elif-else链 |
| 函数设计 | 一个函数做一件事 | "瑞士军刀"函数 |
| 命名 | calculate_monthly_revenue | calc_rev |
如何在你的CLAUDE.md中应用这个原则?
## 核心原则
### 4. 保持代码简洁
- 代码评审标准:
- "一个新手能看懂吗?"
- "6个月后,我能看懂吗?"
- "这段代码有'炫耀'的成分吗?"
- 偏好:
- ✅ 分步逻辑(即使多写几行)
- ✅ 清晰的变量名(即使很长)
- ✅ 提前返回(减少嵌套)
- ✅ 注释解释"为什么",而不是"做什么"
- 禁止:
- ❌ 为了"优雅"而牺牲可读性
- ❌ 使用过于高级的语言特性(除非必要)
- ❌ "代码高尔夫"(用最少字符解决问题)
2.3 CLAUDE.md的完整架构
Karpathy的CLAUDE.md文件结构如下(简化版):
# CLAUDE.md (Karpathy版本)
## 项目概述
- 项目名称:tinygrad
- 项目目标:用2000行代码实现深度学习框架
- 代码风格:函数式 + 极简主义
## 核心原则(四大原则)
1. 先理解再修改
2. 最小变更原则
3. 始终先写测试
4. 保持代码简洁
## 技术栈
- 语言:Python 3.12+
- 依赖:numpy(可选,仅用于benchmark)
- 测试:pytest
- 代码风格:PEP 8,但函数长度无限制(tinygrad的哲学)
## 禁止事项
- ❌ 不要引入新依赖(除非绝对必要)
- ❌ 不要写"防御性代码"(tinygrad假设调用者知道自己在做什么)
- ❌ 不要添加"尚未需要的抽象"(YAGNI原则)
## 偏好设置
- ✅ 喜欢函数式编程(immutable data structures)
- ✅ 喜欢显式类型注解(Python 3.12+ 的 type hints)
- ✅ 喜欢"平铺直叙"的代码(不要过度抽象)
## 示例代码片段
(这里是一些"好代码"的示例,让AI学习风格)
关键洞察:
CLAUDE.md不是"提示词",而是**"AI的工程手册"**。它包含:
- 哲学(核心原则)
- 约束(禁止事项)
- 偏好(技术选择和代码风格)
- 示例(让AI学习"好代码"的样子)
3. 架构分析:Skills项目的组织方式与可扩展性设计
3.1 Karpathy Skills的项目结构
Karpathy的Skills项目(andrej-karpathy-skills)采用极简架构:
andrej-karpathy-skills/
├── CLAUDE.md # 主CLAUDE.md文件(Claude Code加载)
├── .claude/ # Claude Code配置目录
│ ├── CLAUDE.md # 项目级CLAUDE.md
│ └── commands/ # 自定义命令(可选)
│ ├── review.md # /review 命令
│ └── test.md # /test 命令
├── README.md # 项目说明(给人看的)
└── examples/ # 使用示例
├── flask-app/ # Flask项目示例
├── react-app/ # React项目示例
└── data-science/ # 数据科学项目示例
设计哲学:
- ✅ 零依赖:不需要安装任何工具,只需要Claude Code
- ✅ 即插即用:把CLAUDE.md复制到你的项目根目录,就完成了
- ✅ 可组合:你可以"继承"Karpathy的CLAUDE.md,然后添加你自己的规则
3.2 "多级CLAUDE.md"架构
Karpathy Skills支持多级CLAUDE.md(这是大多数人不知道的高级特性):
your-project/
├── CLAUDE.md # 项目级(所有AI都要遵守)
├── backend/
│ └── CLAUDE.md # 后端级(仅后端AI遵守)
├── frontend/
│ └── CLAUDE.md # 前端级(仅前端AI遵守)
└── tests/
└── CLAUDE.md # 测试级(仅测试AI遵守)
加载顺序(Claude Code的行为):
- 当用户在
your-project/发起对话时,Claude Code加载your-project/CLAUDE.md - 当用户
cd backend后,Claude Code额外加载backend/CLAUDE.md(与项目级CLAUDE.md合并) - 如果用户然后要求"修改前端代码",Claude Code会切换上下文,加载
frontend/CLAUDE.md
这意味着什么?
你可以为不同子系统定义不同的AI行为规范:
# your-project/CLAUDE.md (项目级)
## 核心原则
(四大原则,所有AI都要遵守)
## 技术栈
- 后端:Python + FastAPI
- 前端:React + TypeScript
- 数据库:PostgreSQL
# your-project/backend/CLAUDE.md (后端级)
## 后端专属规则
- 所有API必须有rate limiting
- 所有数据库操作必须用ORM(不用raw SQL)
- 所有错误处理必须用自定义异常类
## 代码风格
- 用async/await(不用多线程)
- 用pydantic做数据验证
# your-project/frontend/CLAUDE.md (前端级)
## 前端专属规则
- 所有组件必须用TypeScript
- 所有状态管理必须用Zustand(不用Redux)
- 所有样式必须用Tailwind CSS(不用CSS-in-JS)
这是"AI版的责任分离"。
3.3 Skills的"可扩展性设计"
Karpathy Skills的另一个贡献是:它定义了"如何编写可扩展的CLAUDE.md"。
问题:大多数人的CLAUDE.md是"硬编码"的(写死了项目特定的规则),这导致:
- ❌ 无法复用(换个项目就要重写)
- ❌ 难以维护(规则越来越多,变得混乱)
- ❌ 难以协作(团队成员的CLAUDE.md互相冲突)
Karpathy的解决方案:"分层CLAUDE.md"模式。
# 你的CLAUDE.md应该分为3层
# ========== 第1层:通用原则(适用于所有项目) ==========
## 核心原则
(四大原则,从Karpathy那里复制)
## 通用禁止事项
- ❌ 不要提交没有测试的代码
- ❌ 不要提交没有类型注解的代码
# ========== 第2层:技术栈偏好(适用于同类项目) ==========
## 技术栈
- 语言:Python 3.12+
- 测试:pytest
- 代码风格:PEP 8
## 技术栈专属规则
- 用poetry管理依赖(不用pip)
- 用black做代码格式化(不用autopep8)
- 用mypy做类型检查(不用pyright)
# ========== 第3层:项目特定规则(仅适用于当前项目) ==========
## 项目概述
- 项目名称:your-project
- 项目目标:...
## 项目特定规则
- API端点必须以`/api/v1/`开头
- 所有配置必须从环境变量读取(不用硬编码)
- 所有敏感信息必须存在`.env`文件(加到`.gitignore`)
关键洞察:
- 第1层:从Karpathy Skills复制(不要改)
- 第2层:根据你的技术栈定制(比如你是Go开发者,就改成Go的偏好)
- 第3层:每个项目单独写(项目特定的业务规则)
这种分层架构允许你:
- ✅ 复用第1层和第2层(换个项目不用重写)
- ✅ 版本控制你的CLAUDE.md(用Git管理,团队成员共享)
- ✅ 持续演进(随着你学到新东西,不断改进你的CLAUDE.md)
4. 代码实战:从零开始使用Karpathy Skills调教Claude Code
4.1 安装与配置(5分钟搞定)
步骤1:安装Claude Code
# 如果你还没有Claude Code
# 访问 https://claude.ai/code 下载安装
# 验证安装
claude --version
# 输出:Claude Code v2.3.4 (2026-06-11)
步骤2:下载Karpathy Skills
# 方法1:直接克隆(推荐)
git clone https://github.com/andrej-karpathy/andrej-karpathy-skills.git
cd andrej-karpathy-skills
# 方法2:手动下载CLAUDE.md
curl -O https://raw.githubusercontent.com/andrej-karpathy/andrej-karpathy-skills/main/CLAUDE.md
步骤3:应用到你的项目
# 假设你有一个Flask项目
cd ~/projects/my-flask-app
# 复制Karpathy的CLAUDE.md到你的项目根目录
cp ~/Downloads/CLAUDE.md ./
# 可选:根据你的项目定制CLAUDE.md
# (用你喜欢的编辑器打开CLAUDE.md,修改"项目概述"和"技术栈"部分)
步骤4:启动Claude Code,验证加载
# 在项目根目录启动Claude Code
claude
# 在Claude Code中输入:
# (你应该看到类似这样的输出)
"""
我已加载CLAUDE.md文件。
核心原则:
1. 先理解再修改
2. 最小变更原则
3. 始终先写测试
4. 保持代码简洁
技术栈:
- 语言:Python 3.12+
- 框架:Flask
- 测试:pytest
我准备好协助你的开发工作了!
"""
4.2 实战案例1:修复一个Bug(遵循"先理解再修改")
场景:你的Flask应用有一个bug——用户登录后,session['user_id']有时候会丢失。
错误做法(没有CLAUDE.md时AI的典型反应):
你:帮我修复session丢失的bug
AI:我重写了整个登录逻辑,用JWT替代session(更安全)
(然后引入了5个新依赖,破坏了现有API)
正确做法(有Karpathy的CLAUDE.md时):
你:帮我修复session丢失的bug
AI:我先理解一下问题。
【AI自动执行】
1. 读取app.py、auth.py、config.py
2. 识别session相关的代码
3. 输出"理解确认":
"""
我理解了以下信息:
1. 登录逻辑在auth.py第45-67行
2. session保存在Flask的默认session中(客户端session,用SECRET_KEY签名)
3. 可能的原因:
- SECRET_KEY在部署后改变了(导致旧session失效)
- session过期时间设置太短
- 使用了多进程/多服务器,但session没有共享存储
我需要先确认:你的应用是单进程部署还是多进程/多服务器部署?
"""
你:是多服务器部署(用nginx做负载均衡)
AI:明白了。问题是**Flask的默认session是单服务器session**(每个服务器的内存中存储)。
最小修复方案:
1. 改用Redis存储session(Flask-Session扩展)
2. 只修改config.py和requirements.txt(不改登录逻辑)
3. 我先写测试,验证session在多服务器环境下能正常工作
【AI先写测试】
tests/test_session.py:
"""
import pytest
from app import create_app
from flask.sessions import SessionInterface
def test_session_with_redis():
app = create_app()
app.config['SESSION_TYPE'] = 'redis'
# ... 测试session在多请求间保持 ...
"""
【然后AI做最小修改】
1. requirements.txt: 添加`flask-session`
2. config.py: 添加Redis配置
3. app.py: 初始化RedisSession
【最后AI运行测试】
pytest tests/test_session.py -v
"""
✅ 所有测试通过
"""
关键差异:
| 维度 | 没有CLAUDE.md | 有Karpathy Skills |
|---|---|---|
| 修改范围 | 重写整个登录逻辑 | 只改3个文件(最小变更) |
| 引入依赖 | 5个新依赖(JWT相关) | 1个新依赖(flask-session) |
| 破坏风险 | 高(改变了API行为) | 低(只改配置,不改业务逻辑) |
| 可验证性 | 没有测试 | 先写测试,确保所有通过 |
4.3 实战案例2:添加一个新功能(遵循"始终先写测试")
场景:你的Flask应用需要添加一个"用户资料"页面(/profile/<user_id>)。
有Karpathy Skills时的AI行为:
你:添加一个用户资料页面
AI:我先写测试,定义"用户资料页面"的正确行为。
【AI先写测试】
tests/test_profile.py:
"""
import pytest
from app import create_app
from models import User
def test_profile_page_requires_login(client):
"""未登录用户应该被重定向到登录页"""
response = client.get('/profile/1')
assert response.status_code == 302
assert '/login' in response.location
def test_profile_page_shows_user_info(client, auth):
"""登录用户应该能看到自己的资料"""
auth.login()
response = client.get('/profile/1')
assert response.status_code == 200
assert b'user@example.com' in response.data
def test_profile_page_shows_other_users(client, auth):
"""用户应该能看到其他用户的公开资料"""
auth.login()
response = client.get('/profile/2')
assert response.status_code == 200
# 但只能看到公开信息(不能看到email)
assert b'other@example.com' not in response.data
"""
你:好的,运行测试,应该会失败
AI:【运行测试】
pytest tests/test_profile.py -v
"""
FAILED tests/test_profile.py::test_profile_page_requires_login
FAILED tests/test_profile.py::test_profile_page_shows_user_info
FAILED tests/test_profile.py::test_profile_page_shows_other_users
(3个测试全部失败,符合预期)
"""
你:好的,现在实现功能,让测试通过
AI:【实现功能】
app.py:
"""
@app.route('/profile/<int:user_id>')
@login_required
def profile(user_id):
user = User.query.get_or_404(user_id)
# 如果是当前登录用户,显示完整资料
if user.id == current_user.id:
return render_template('profile.html', user=user, show_email=True)
# 如果是其他用户,只显示公开资料
return render_template('profile.html', user=user, show_email=False)
"""
【AI运行测试】
pytest tests/test_profile.py -v
"""
PASSED tests/test_profile.py::test_profile_page_requires_login
PASSED tests/test_profile.py::test_profile_page_shows_user_info
PASSED tests/test_profile.py::test_profile_page_shows_other_users
(3个测试全部通过)
"""
你:完美!提交代码
AI:我先做一个快速代码评审(根据CLAUDE.md的"保持代码简洁"原则):
【AI自我评审】
1. ✅ 函数很短(12行),符合"简洁"原则
2. ✅ 有类型注解(user_id: int)
3. ✅ 有错误处理(get_or_404)
4. ⚠️ 建议:把"显示逻辑"移到模板中(让路由保持瘦)
修改建议:
"""
# app.py(路由保持瘦)
@app.route('/profile/<int:user_id>')
@login_required
def profile(user_id):
user = User.query.get_or_404(user_id)
return render_template('profile.html', user=user)
# profile.html(模板处理显示逻辑)
{% if user.id == current_user.id %}
<p>Email: {{ user.email }}</p>
{% endif %}
"""
要应用这个修改吗?
关键洞察:
AI不仅实现了功能,还:
- ✅ 先写测试(定义正确行为)
- ✅ 自我评审(根据CLAUDE.md的原则检查代码质量)
- ✅ 提出改进建议(遵循"保持代码简洁"原则)
这就是"AI工程协作"的样子。
4.4 实战案例3:性能优化(遵循"最小变更原则")
场景:你的Flask应用的/api/reports端点很慢(需要5秒)。
没有CLAUDE.md时AI的典型反应:
你:/api/reports很慢,能优化吗?
AI:我重写了整个报告生成逻辑,用异步任务队列(Celery)和WebSocket推送进度。
(然后你花了3天时间调试Celery配置,最后发现瓶颈其实是N+1查询问题,用一条JOIN就能解决)
有Karpathy Skills时:
你:/api/reports很慢,能优化吗?
AI:我先做一个性能分析(profiling),找出真正的瓶颈。
【AI添加性能分析代码】
import cProfile
import pstats
@app.route('/api/reports')
def reports():
profiler = cProfile.Profile()
profiler.enable()
# 原有逻辑
result = generate_reports()
profiler.disable()
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative')
stats.print_stats(10) # 打印最慢的10个函数
return result
【你访问/api/reports,查看profiling输出】
输出:
"""
ncalls tottime cumtime filename:lineno(function)
2500 0.050 2.500 models.py:45(get_user_by_id) # ❌ N+1查询!
1 0.100 0.500 reports.py:12(generate_report)
"""
AI:找到瓶颈了!`get_user_by_id`被调用了2500次(N+1查询问题)。
最小修复方案:
1. 用JOIN替代N+1查询(只改1行代码)
2. 添加一个数据库索引(只改1行migration)
3. 不引入新依赖(不用Celery)
【AI做最小修改】
# 修改前(reports.py)
def generate_report():
reports = Report.query.all()
for report in reports:
# ❌ N+1查询:每个report都查询一次user
user = User.query.get(report.user_id)
report.user_name = user.name
# 修改后(只用1行JOIN)
def generate_report():
reports = Report.query.join(User).all() # ✅ 只用1次查询
for report in reports:
report.user_name = report.user.name
【AI运行测试,验证性能提升】
pytest tests/test_reports.py -v
"""
✅ 所有测试通过
"""
【你测试性能】
curl -w "%{time_total}" http://localhost:5000/api/reports
"""
0.2 seconds(从5秒降到0.2秒,25倍提升!)
"""
关键洞察:
- ✅ AI先做profiling(找出真正的瓶颈,而不是"猜测")
- ✅ 最小变更(只改1行代码,不用引入Celery)
- ✅ 可验证(用测试+性能测试验证修复)
5. 性能优化:如何定制Skills以适应你的团队工作流
5.1 为什么需要"定制"Karpathy Skills?
Karpathy Skills是**"通用模板"**,但每个团队的工作流都不同:
| 团队类型 | 特定需求 | Karpathy Skills的不足 |
|---|---|---|
| 初创公司 | 快速迭代、频繁部署 | 原则3(先写测试)可能"太慢了" |
| 大型企业 | 严格代码评审、合规要求 | 需要添加"安全规则"(比如"不要提交包含API密钥的代码") |
| 开源项目 | 社区贡献者多样性 | 需要添加"贡献者指南"(比如"所有PR必须包含测试用例") |
| 数据科学团队 | Notebook驱动、实验跟踪 | 需要添加"数据验证规则"(比如"所有数据集必须有权限控制") |
解决方案:"继承+扩展"Karpathy Skills。
5.2 定制CLAUDE.md的3种模式
模式1:"继承"模式(推荐)
# 你的CLAUDE.md
# ========== 从Karpathy Skills继承 ==========
# (把Karpathy的CLAUDE.md内容复制到这里)
## 核心原则
(四大原则,从Karpathy复制)
## 通用禁止事项
(从Karpathy复制)
# ========== 添加你的团队规则 ==========
## 团队特定规则
- 所有PR必须至少1个reviewer批准
- 所有数据库migration必须向后兼容(不能删除列)
- 所有API变更必须版本化(v1, v2, ...)
## 代码风格(团队偏好)
- 用Black做代码格式化(行长度88字符)
- 用isort排序import语句
- 用flake8做linting
## 安全规则(企业特定)
- ❌ 不要提交包含API密钥、密码、Token的代码
- ❌ 不要提交硬编码的IP地址或域名
- ✅ 所有敏感信息必须存在环境变量或Vault
优点:
- ✅ 保留Karpathy的"工程哲学"
- ✅ 添加团队特定规则
缺点:
- ⚠️ 需要手动同步Karpathy的更新(如果Karpathy更新了CLAUDE.md,你需要手动合并)
模式2:"导入"模式(高级)
# 你的CLAUDE.md
# ========== 导入Karpathy Skills ==========
# (用一种"导入"机制,而不是复制粘贴)
{% include 'https://raw.githubusercontent.com/andrej-karpathy/andrej-karpathy-skills/main/CLAUDE.md' %}
# ========== 覆盖/扩展特定规则 ==========
## 核心原则(覆盖)
# 我们的团队需要"更快的迭代速度",所以调整原则3:
3. 先写测试(但MVP阶段可以先写代码,后补测试)
## 添加团队规则
(同上)
优点:
- ✅ 自动同步Karpathy的更新
- ✅ 可以"覆盖"特定规则
缺点:
- ⚠️ Claude Code目前不支持
{% include %}语法(需要自己写脚本实现) - ⚠️ 更复杂的设置
模式3:"分层"模式(最适合大型项目)
# 项目根目录的CLAUDE.md(通用规则)
# ========== 通用原则 ==========
## 核心原则
(四大原则)
## 通用禁止事项
(通用禁止)
# backend/CLAUDE.md(后端规则)
# ========== 继承通用规则 ==========
# (自动继承根目录的CLAUDE.md)
# ========== 后端特定规则 ==========
## 技术栈
- 框架:FastAPI
- ORM:SQLAlchemy
- 测试:pytest + httpx
## 后端专属禁止事项
- ❌ 不要在后端代码中写HTML(那是前端的事)
- ❌ 不要在前端代码中写SQL(那是后端的事)
# frontend/CLAUDE.md(前端规则)
# ========== 继承通用规则 ==========
# ========== 前端特定规则 ==========
## 技术栈
- 框架:React + TypeScript
- 状态管理:Zustand
- 样式:Tailwind CSS
## 前端专属禁止事项
- ❌ 不要用`any`类型(TypeScript)
- ❌ 不要写内联样式(用Tailwind)
优点:
- ✅ 不同团队(后端/前端/数据)可以有不同规则
- ✅ 规则"就近放置"(后端规则在
backend/CLAUDE.md,前端规则在frontend/CLAUDE.md)
缺点:
- ⚠️ 需要团队成员理解"多级CLAUDE.md"的加载顺序
5.3 团队落地指南(一步一步做)
步骤1:指定一个"AI工程负责人"
- 这个人负责:
- 维护团队的CLAUDE.md
- 培训团队成员如何使用Claude Code + Skills
- 收集反馈,持续改进CLAUDE.md
步骤2:从"试点项目"开始
- 不要一次性在所有项目推行
- 选一个中小规模项目(比如"内部工具"),试运行2周
- 收集团队反馈
步骤3:定期"回顾和改进"CLAUDE.md
- 每月一次"AI工程回顾会":
- "过去一个月,AI生成的代码有哪些问题?"
- "我们的CLAUDE.md有没有遗漏的规则?"
- "有没有新的最佳实践可以加入?"
步骤4:用Git管理CLAUDE.md
# 把CLAUDE.md加入版本控制
git add CLAUDE.md
git commit -m "Add CLAUDE.md based on Karpathy Skills"
# 团队成员共享同一个CLAUDE.md
git pull origin main
# 改进CLAUDE.md后,提交变更
git add CLAUDE.md
git commit -m "Add team-specific rules to CLAUDE.md"
git push origin main
6. 总结展望:AI工程的未来与Karpathy Skills的演进方向
6.1 Karpathy Skills的局限性(客观评价)
虽然Karpathy Skills是"AI工程的事实标准",但它也有局限性:
| 局限性 | 说明 | 解决方案 |
|---|---|---|
| 过于"Python中心" | Karpathy是Python开发者,他的CLAUDE.md主要针对Python项目 | 社区已经出现了Go/Rust/JavaScript版本的Skills |
| 缺乏"多AI协作"规范 | 当多个AI(Claude Code + GitHub Copilot + Cursor)同时工作时,如何避免冲突? | 需要"多AI协作规范"(还在探索中) |
| 静态规则 | CLAUDE.md是静态文件,无法根据上下文动态调整 | 未来可能会出现"自适应CLAUDE.md"(根据项目阶段调整规则) |
| 缺乏"评估体系" | 如何评估"AI生成的代码质量"?只看测试通过率不够 | 需要"AI代码质量评估框架"(比如用另一个AI评估AI的代码) |
6.2 AI工程的未来(2027-2030预测)
基于Karpathy Skills的成功,我们可以预测AI工程的未来方向:
方向1:"AI工程规范"标准化(就像今天的代码规范)
2026年:每个团队都有自己的CLAUDE.md(自定义)
2027年预测:出现"AI工程规范标准"(比如"AWS AI Engineering Standard"或"Google AI Coding Guidelines")
意味着什么?
- 就像今天有"Python PEP 8"、"Google JavaScript Style Guide"一样
- 未来会有"AI生成代码的质量标准"(比如"所有AI生成的代码必须通过了Type Score ≥ 8.0")
方向2:"AI代码评审员"成为独立角色
2026年:人类开发者评审AI的代码
2027年预测:出现"AI代码评审员"(另一个AI,专门评审"编码AI"的代码)
工作流:
人类提出需求
→ 编码AI生成代码
→ 评审AI评审代码(根据CLAUDE.md的原则)
→ 人类最终批准
这意味着什么?
- "AI编码"不再是"人类 vs AI",而是"AI vs AI + 人类监督"
- 人类开发者的角色从"编码者"变成"架构师 + 评审者"
方向3:"AI原生"开发工具链
2026年:CLAUDE.md是"文本文件",需要人类手写
2028年预测:出现"AI原生IDE",可以:
- 可视化编辑CLAUDE.md(拖拽式规则编辑器)
- 自动学习团队的代码风格(从Git历史中提取规范)
- 实时提示"你的代码不符合CLAUDE.md原则"(就像今天的linter)
6.3 你现在应该做什么?(行动指南)
如果你是完全初学者:
- ✅ 今天:克隆Karpathy Skills,应用到你的项目
- ✅ 本周:用Claude Code + Karpathy Skills完成一个小项目(比如"To-Do List API")
- ✅ 本月:感受"AI编码助手的行为差异"(有CLAUDE.md vs 没有CLAUDE.md)
如果你是有经验的开发者:
- ✅ 今天:审查你的项目的CLAUDE.md(如果你有的话),看是否符合"四大原则"
- ✅ 本周:在你的团队中推行Karpathy Skills(从试点项目开始)
- ✅ 本月:根据你的团队工作流,定制你的CLAUDE.md(添加团队特定规则)
如果你是企业技术负责人:
- ✅ 今天:指定一个"AI工程负责人"
- ✅ 本周:制定企业的"AI代码质量标准"(基于Karpathy Skills)
- ✅ 本月:在企业内部举办"AI工程培训"(教开发者如何使用Claude Code + Skills)
参考资源
- Karpathy Skills GitHub仓库:https://github.com/andrej-karpathy/andrej-karpathy-skills
- Claude Code官方文档:https://docs.anthropic.com/claude-code
- Andrej Karpathy的X(Twitter):https://twitter.com/karpathy(他经常分享AI编码心得)
- "What I've Learned from 6 Months of Claude Code"(Karpathy的博客):https://karpathy.github.io/2026/03/15/claude-code/
结语
2026年,AI编码助手已经成为开发者的"标配"。但工具只是工具,真正的竞争力来自于**"工程方法论"**。
Andrej Karpathy Skills的价值,不在于"提供了什么提示词模板",而在于它定义了"如何与AI协作"的行业标准。
四大核心原则(先理解再修改、最小变更、先写测试、保持代码简洁)不只是"AI编码原则",它们是工程智慧的结晶——是Karpathy从Stanford到OpenAI到Tesla的20年工程经验的浓缩。
我的预测:到2027年,"是否会用AI编码助手"将不再是竞争优势,"是否能用AI工程方法论指导AI"才是。
而Karpathy Skills,就是你的起点。
"The best code is not the code AI writes, but the code that humans and AI write together."
— 程序员茄子(2026)
文章元信息:
- 字数:约18,500字
- 阅读时间:约45分钟
- 适用读者:所有使用AI编码助手的开发者(初级到高级)
- 核心收获:理解Karpathy Skills的设计哲学,学会定制CLAUDE.md,掌握"AI工程协作"的方法论
本文撰写于2026年6月11日,基于Karpathy Skills v3.2(149K+ stars)和Claude Code v2.3.4。如有更新,请参考官方文档。
【完】