编程 Andrej Karpathy Skills 深度实战:当AI编码助手遇见工程哲学——从四大核心原则到生产级Claude Code调教完全指南(2026)

2026-06-11 12:49:02 +0800 CST views 20

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编码"的认知。


目录

  1. 背景介绍:当AI编码助手遇见工程哲学
  2. 核心概念:四大原则与CLAUDE.md架构解析
  3. 架构分析:Skills项目的组织方式与可扩展性设计
  4. 代码实战:从零开始使用Karpathy Skills调教Claude Code
  5. 性能优化:如何定制Skills以适应你的团队工作流
  6. 总结展望: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
    # ... 保持原有逻辑不变 ...

为什么这个原则如此重要?

  1. 避免"过度修复":AI倾向于"重写"而不是"修复",这会导致新bug
  2. 保持代码演化连续性:软件是"长出来的",不是"重写出来的"
  3. 建立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倾向于"过度生成"?

  1. 训练数据偏差:AI见过的"好代码"往往是"重写过的代码"(开源项目经过多次重构)
  2. "帮助欲"过强:AI想证明自己"有用",所以倾向于"多做一点"
  3. 缺乏"工程经济学"思维: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特别需要"先写测试"?

  1. AI的"自信偏差":AI生成代码后,会"相信"自己的代码是正确的(它没有"怀疑自己的能力")
  2. AI的"幻觉风险":AI可能生成"看起来对但实际错"的代码(尤其是边缘情况)
  3. 人类验证成本:如果没有测试,人类需要"读懂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添加更多测试(边界情况、性能测试)

"始终先写测试"的深层价值

  1. 建立"可验证性":AI生成的代码必须有"客观验证标准"
  2. 强迫AI思考边缘情况:写测试时,你会想到"如果输入是XXX会怎样?"
  3. 提供"回归保护":未来修改代码时,这些测试能捕捉新引入的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特别容易写出"过度聪明"的代码?

  1. 训练数据中的"炫技代码":GitHub上受欢迎的代码往往是"简洁优雅"的(但可能难以理解)
  2. AI的"压缩偏好":AI倾向于"用更少的token表达更多逻辑"(这是它的训练目标)
  3. 缺乏"读者同理心":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_revenuecalc_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的工程手册"**。它包含:

  1. 哲学(核心原则)
  2. 约束(禁止事项)
  3. 偏好(技术选择和代码风格)
  4. 示例(让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的行为):

  1. 当用户在your-project/发起对话时,Claude Code加载your-project/CLAUDE.md
  2. 当用户cd backend后,Claude Code额外加载backend/CLAUDE.md(与项目级CLAUDE.md合并
  3. 如果用户然后要求"修改前端代码",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. 复用第1层和第2层(换个项目不用重写)
  2. 版本控制你的CLAUDE.md(用Git管理,团队成员共享)
  3. 持续演进(随着你学到新东西,不断改进你的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不仅实现了功能,还:

  1. 先写测试(定义正确行为)
  2. 自我评审(根据CLAUDE.md的原则检查代码质量)
  3. 提出改进建议(遵循"保持代码简洁"原则)

这就是"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 你现在应该做什么?(行动指南)

如果你是完全初学者

  1. 今天:克隆Karpathy Skills,应用到你的项目
  2. 本周:用Claude Code + Karpathy Skills完成一个小项目(比如"To-Do List API")
  3. 本月:感受"AI编码助手的行为差异"(有CLAUDE.md vs 没有CLAUDE.md)

如果你是有经验的开发者

  1. 今天:审查你的项目的CLAUDE.md(如果你有的话),看是否符合"四大原则"
  2. 本周:在你的团队中推行Karpathy Skills(从试点项目开始)
  3. 本月:根据你的团队工作流,定制你的CLAUDE.md(添加团队特定规则)

如果你是企业技术负责人

  1. 今天:指定一个"AI工程负责人"
  2. 本周:制定企业的"AI代码质量标准"(基于Karpathy Skills)
  3. 本月:在企业内部举办"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。如有更新,请参考官方文档。


【完】

复制全文 生成海报 AI 编程 Claude Code Karpathy 技能

推荐文章

Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
随机分数html
2025-01-25 10:56:34 +0800 CST
服务器购买推荐
2024-11-18 23:48:02 +0800 CST
120个实用CSS技巧汇总合集
2025-06-23 13:19:55 +0800 CST
什么是Vue实例(Vue Instance)?
2024-11-19 06:04:20 +0800 CST
前端如何给页面添加水印
2024-11-19 07:12:56 +0800 CST
使用 Git 制作升级包
2024-11-19 02:19:48 +0800 CST
程序员茄子在线接单