Skip to content

Part 4: 正确使用 AI 编程 (35-40 min) ​

核心思路:从心智模型到实操技巧,再到使用边界和团队采用

4.1 心智模型:模拟器而非实体 ​

专家观点 — Andrej Karpathy

背景:前 Tesla AI 总监、OpenAI 联合创始人、斯坦福 CS231n 课程讲师 来源:2025 年 12 月 X 推文 [1]

「不要把 LLM 当作实体(Entity),要当作模拟器(Simulator)。」

这是什么意思?

text
┌─────────────────────────────────────────────────────────────────────┐
│  LLM 是模拟器,不是实体                                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ❌ 把 LLM 当「实体」                                              │
│                                                                     │
│    你: 「关于 XXX,你怎么看?」                                       │
│                                                                     │
│    问题:根本不存在「你」。                                          │
│                                                                     │
│    LLM 会怎么做?                                                    │
│    → 采用一个「人格嵌入向量」(personality embedding vector)          │
│    → 这个向量来自微调数据的统计规律                                  │
│    → 模拟一个「大众脸」来回答你                                      │
│                                                                     │
│    结果:你得到的是一个「平均意见」,不是深思熟虑的观点               │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ✅ 把 LLM 当「模拟器」                                            │
│                                                                     │
│    你: 「如果要探讨 XXX 这个话题,最合适的专家是谁?他们会怎么说?」  │
│                                                                     │
│    LLM 会怎么做?                                                    │
│    → 模拟特定领域专家的视角                                          │
│    → 调用训练数据中该领域的知识                                      │
│    → 给出更专业、更有针对性的回答                                    │
│                                                                     │
│    结果:你得到的是「专家视角的模拟」,质量更高                       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

专家观点 — Andrej Karpathy [^65]

(2023 年 State of GPT 演讲)

「这些 Transformer 就是 token 模拟器。它们不知道自己不知道什么,只是尽力模拟下一个 token。」

这和 Context Engineering 有什么关系? ​

其实这也是一种「高信号 Context」—— 告诉模型要模拟谁。

提问方式模型行为结果质量
「你觉得这段代码怎么样?」模拟「平均程序员」泛泛而谈
「假设你是 Google 的 Staff Engineer,审查这段代码会关注什么?」模拟「资深工程师」更专业的审查意见
「这个架构设计有什么问题?」模拟「平均意见」可能漏掉关键点
「如果 Martin Fowler 看这个架构,他会怎么评价?」模拟「架构大师视角」更深入的分析

实操建议:

  • 问观点性问题时,指定一个「角色」或「专家群体」
  • 不是说「你是 XXX 专家」这种 roleplay,而是问「XXX 领域的专家会怎么看」
  • 这样做的本质是:帮模型选择一个更高质量的「模拟目标」

4.2 Context Engineering 实操 ​

Part 2 讲了 Context Engineering 是什么,这里讲怎么做。

text
┌─────────────────────────────────────────────────────────────────────┐
│  Context Engineering 的核心思维                                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ❌ 错误思维:「我要把所有信息都告诉 AI」                            │
│                                                                     │
│    ┌──────────────────────────────────────────────────────────┐    │
│    │  项目文档 + 所有代码 + 历史对话 + 各种规范 + ...            │    │
│    │                         │                                 │    │
│    │                         ▼                                 │    │
│    │                   Context 爆炸                            │    │
│    │                         │                                 │    │
│    │                         ▼                                 │    │
│    │              准确率下降 (Context Rot)                      │    │
│    └──────────────────────────────────────────────────────────┘    │
│                                                                     │
│    ✅ 正确思维:「最小化高信号 Token」                                │
│                                                                     │
│    ┌──────────────────────────────────────────────────────────┐    │
│    │  只给当前任务需要的信息                                     │    │
│    │                         │                                 │    │
│    │                         ▼                                 │    │
│    │            ┌─────────────────────┐                       │    │
│    │            │  System Prompt      │ ← CLAUDE.md (精简)     │    │
│    │            │  + 相关文件         │ ← 按需读取              │    │
│    │            │  + 当前任务描述     │ ← 具体、明确            │    │
│    │            └─────────────────────┘                       │    │
│    │                         │                                 │    │
│    │                         ▼                                 │    │
│    │                   高质量输出                               │    │
│    └──────────────────────────────────────────────────────────┘    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

三条核心原则(来自 Anthropic 官方指南):

原则说明实操建议
Context 是有限资源准确率随 token 数增加而下降定期 /clear,不要让对话无限累积
工具集要精简每个工具占用 Context,功能重叠会让 AI 困惑MCP 不要装太多,保持功能不重叠
具体胜过模糊「写测试」不如「为 foo.py 的登出边界情况写测试,不要用 mock」花时间写好 prompt,比反复纠正划算

4.2.1 好 Context vs 坏 Context ​

这是同一个需求的两种写法,效果天差地别:

text
┌─────────────────────────────────────────────────────────────────────┐
│  ❌ 坏 Context                                                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  「帮我写一个时钟」                                                  │
│                                                                     │
│  问题:                                                              │
│  · 什么样的时钟?数字?模拟?                                        │
│  · 什么技术栈?React?Vue?原生 JS?                                 │
│  · 什么风格?简约?华丽?                                            │
│  · 要什么功能?只显示时间?还是要闹钟?                              │
│                                                                     │
│  结果:AI 自己猜,猜错了再改,浪费 Context                           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│  ✅ 好 Context                                                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  「用原生 HTML/CSS/JS 写一个数字时钟:                               │
│                                                                     │
│   功能要求:                                                         │
│   - 显示当前时间(时:分:秒)                                         │
│   - 每秒自动更新                                                     │
│   - 24 小时制                                                        │
│                                                                     │
│   样式要求:                                                         │
│   - 深色背景 (#1a1a2e)                                               │
│   - 白色数字,使用等宽字体                                           │
│   - 居中显示,字号要大                                               │
│                                                                     │
│   文件结构:单个 index.html 文件,CSS 和 JS 内联」                   │
│                                                                     │
│  结果:AI 一次性给出符合预期的代码                                   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

写好 Context 的检查清单:

  • [ ] 技术栈明确了吗?
  • [ ] 功能边界清晰吗?
  • [ ] 有没有可能被误解的地方?
  • [ ] 输出格式/文件结构说清楚了吗?

4.2.2 Course Correct:早期纠偏 ​

AI 走偏是正常的,关键是早发现、早纠正。

text
┌─────────────────────────────────────────────────────────────────────┐
│  Course Correct 时机                                                 │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ❌ 太晚纠正                                                       │
│                                                                     │
│    你: 写一个时钟                                                    │
│    AI: [写了 500 行 React 代码]                                      │
│    你: 不对,我要原生 JS                                             │
│    AI: [重写 500 行]                                                 │
│                                                                     │
│    → 浪费了大量 Context 和时间                                       │
│                                                                     │
│    ✅ 早期纠正                                                       │
│                                                                     │
│    你: 写一个时钟                                                    │
│    AI: 我打算用 React 来实现,首先...                                │
│    你: 停,用原生 JS,不要框架                                       │
│    AI: 好的,那我用原生 JS...                                        │
│                                                                     │
│    → 在 AI 动手之前就纠正方向                                        │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

纠偏技巧:

场景做法
AI 选错技术栈立刻打断:「停,用 XXX 而不是 YYY」
AI 过度设计「简化,不需要 XXX 功能」
AI 理解错需求「不是这个意思,我要的是...」
对话太长开始混乱/clear 清空上下文,重新开始

4.3 CLAUDE.md 与工具链 ​

CLAUDE.md 是 Claude Code 的核心配置文件——AI 每次启动都会自动读取它。

text
┌─────────────────────────────────────────────────────────────────────┐
│  CLAUDE.md 的作用                                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    没有 CLAUDE.md                      有 CLAUDE.md                  │
│    ┌─────────────────┐                ┌─────────────────┐           │
│    │ Claude Code     │                │ Claude Code     │           │
│    │                 │                │                 │           │
│    │ 「这是什么项目? │                │ 「我知道:       │           │
│    │  用什么语言?   │                │  - 这是 Python 项目│          │
│    │  怎么跑测试?   │                │  - 用 pytest 测试 │           │
│    │  有什么规范?」 │                │  - 代码风格是... │           │
│    │                 │                │  - 提交规范是...」│           │
│    └─────────────────┘                └─────────────────┘           │
│           │                                  │                      │
│           ▼                                  ▼                      │
│    每次都要重新解释               直接开始工作,风格一致              │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

4.3.1 CLAUDE.md 写什么? ​

遵循 WHAT / WHY / HOW 结构(来自 HumanLayer 指南):

部分内容示例
WHAT项目是什么、技术栈「这是一个 Python 3.11 的 Home Assistant 集成」
WHY项目目标、各模块作用「用于接入公司物联网网关」
HOW开发流程、测试方法、提交规范「用 pytest 跑测试,commit 遵循 Conventional Commits」

关键原则:

原则说明
保持精简研究表明 LLM 可靠遵循 150-200 条指令,Claude Code 自带 ~50 条,留给你的不多
控制长度300 行以内,理想情况 60 行以内
只写通用规则不要写「某个具体功能怎么实现」,那是任务描述不是项目规范
不要当 Linter代码风格用 ESLint/Prettier/Ruff 等工具,不要写在 CLAUDE.md 里
手动编写不要用 /init 自动生成,那个效果很差

4.3.2 OpenSpec:Spec-Driven 开发 ​

作者实践

以下是我个人采用的工作流,不一定适合所有人。供参考。

我现在用的是 OpenSpec——一个 spec-driven 的开发流程。

text
┌─────────────────────────────────────────────────────────────────────┐
│  OpenSpec 目录结构                                                   │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    project/                                                         │
│    ├── CLAUDE.md              ← 项目入口,引用 OpenSpec              │
│    └── openspec/                                                    │
│        ├── AGENTS.md          ← AI 的详细指南                        │
│        ├── project.md         ← 项目规范                             │
│        ├── specs/             ← 当前状态(已实现的功能)              │
│        │   └── [capability]/                                        │
│        │       └── spec.md                                          │
│        └── changes/           ← 变更提案(待实现的功能)              │
│            └── [change-name]/                                       │
│                ├── proposal.md                                      │
│                ├── tasks.md                                         │
│                └── specs/                                           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

OpenSpec 的核心思想:

「Specs 是真相(已构建),Changes 是提案(待构建),保持它们同步。」

三阶段工作流:

阶段触发条件产出
1. 创建提案新功能、Breaking Change、架构变更proposal.md + tasks.md + spec deltas
2. 实现提案提案被批准代码实现,按 tasks.md 逐项完成
3. 归档提案部署完成移动到 archive/,更新 specs/

这样做的好处是:AI 在写代码之前,先帮你把需求和方案理清楚。避免了 Vibe Coding 那种「边写边想」的混乱。

4.3.3 工具链总结 ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  Claude Code 工具链全景                                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ┌─────────────────────────────────────────────────────────────┐  │
│    │                     CLAUDE.md                               │  │
│    │                  (项目入口配置)                              │  │
│    │                                                             │  │
│    │  · WHAT: 项目是什么、技术栈                                 │  │
│    │  · WHY: 项目目标                                            │  │
│    │  · HOW: 开发流程、测试方法                                  │  │
│    └──────────────────────────┬──────────────────────────────────┘  │
│                               │                                      │
│         ┌─────────────────────┼─────────────────────┐               │
│         │                     │                     │               │
│         ▼                     ▼                     ▼               │
│    ┌──────────┐         ┌──────────┐         ┌──────────┐          │
│    │  Skills  │         │   MCP    │         │  Slash   │          │
│    │          │         │ Servers  │         │ Commands │          │
│    │ 可复用   │         │          │         │          │          │
│    │ 能力包   │         │ 连接外部 │         │ 快捷命令 │          │
│    │          │         │ 服务     │         │          │          │
│    └────┬─────┘         └────┬─────┘         └────┬─────┘          │
│         │                    │                    │                 │
│         ▼                    ▼                    ▼                 │
│    ┌──────────┐         ┌──────────┐         ┌──────────┐          │
│    │writing-  │         │ GitHub   │         │/openspec │          │
│    │assistant │         │ Slack    │         │:proposal │          │
│    │git-      │         │ Database │         │/git-     │          │
│    │workflow  │         │ ...      │         │workflow  │          │
│    └──────────┘         └──────────┘         └──────────┘          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
工具作用我的使用场景
CLAUDE.md项目配置入口每个项目都有,定义基本规范
OpenSpecSpec-driven 开发流程大功能开发前先写 proposal
Skills可复用的能力模块writing-assistant 写文章、git-workflow 提交代码
MCP连接外部服务GitHub、文件系统
Slash Commands快捷命令/openspec:proposal 创建提案

注意事项:

  • MCP 不能装太多——每个 MCP Server 的工具定义都占用 Context
  • Skills 按需加载——只有用到的时候才会消耗 Token
  • 定期 /clear——不要让对话历史无限累积

4.4 现场演示:从零到部署 ​

演示任务:用 Claude Code 从零开始,创建并部署一个时钟应用到 GitHub Pages

阶段一:好 Context vs 坏 Context ​

第一步:展示「坏 Context」的效果

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 1(坏 Context)                                         │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 帮我写一个时钟                                                  │
│                                                                     │
│  [等待 AI 响应,观察它会怎么理解这个模糊需求]                         │
│                                                                     │
│  预期问题:                                                          │
│  - AI 可能选择你不想要的技术栈                                       │
│  - AI 可能添加你不需要的功能                                         │
│  - AI 可能问一堆澄清问题(浪费时间)                                  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

第二步:展示「好 Context」的效果

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 2(好 Context)                                         │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 用原生 HTML/CSS/JS 写一个数字时钟。                             │
│                                                                     │
│      功能:                                                          │
│      - 显示当前时间(时:分:秒),24 小时制                           │
│      - 每秒自动更新                                                  │
│                                                                     │
│      样式:                                                          │
│      - 深色背景,白色等宽字体                                        │
│      - 数字要大,居中显示                                            │
│                                                                     │
│      输出:单个 index.html 文件,CSS/JS 内联                         │
│                                                                     │
│  [观察 AI 直接给出符合预期的代码]                                    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

第三步:迭代添加功能

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 3(增量开发)                                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 在数字时钟下方加一个模拟时钟(圆形表盘 + 时针分针秒针)。        │
│      保持同样的配色风格。                                            │
│                                                                     │
│  [观察 AI 如何在现有代码基础上增量修改]                              │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 4(主题切换)                                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 加一个主题切换按钮,可以在深色/浅色主题之间切换。               │
│      记住用户的选择(用 localStorage)。                             │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

阶段二:Course Correct 演示 ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 5(故意制造纠偏场景)                                   │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 加一个闹钟功能                                                  │
│                                                                     │
│  AI: 好的,我来添加闹钟功能。我打算:                                │
│       1. 添加一个设置闹钟时间的输入框                                │
│       2. 添加多个闹钟的支持...                                       │
│       3. 添加重复闹钟(每天/每周)...                                │
│                                                                     │
│  你: 停。简化一下,只要:                                            │
│      - 一个闹钟就够                                                  │
│      - 用 prompt() 输入时间                                          │
│      - 到时间 alert 一下就行                                         │
│                                                                     │
│  [展示早期纠偏如何节省 Context]                                      │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

阶段三:部署上线 ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 6(GitHub 部署)                                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  你: 帮我把这个时钟部署到 GitHub Pages:                             │
│                                                                     │
│      1. 用 gh 命令创建一个新的 public 仓库,名字叫 clock-demo        │
│      2. 初始化 git 并推送代码                                        │
│      3. 配置 GitHub Actions 自动部署到 GitHub Pages                  │
│      4. 告诉我最终的访问地址                                         │
│                                                                     │
│  [观察 AI 如何:                                                     │
│   - 调用 gh repo create                                             │
│   - 创建 .github/workflows/deploy.yml                               │
│   - 执行 git 命令                                                   │
│   - 一次性完成整个部署流程]                                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

阶段四:Skill 实战 ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  演示 Prompt 7(使用 Git Workflow Skill)                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  [先对时钟做一个小修改,比如改个颜色]                                │
│                                                                     │
│  你: /git-workflow 帮我提交这个修改                                  │
│                                                                     │
│  [Skill 自动加载,按照预定义的流程:                                 │
│   - 检查 git status / git diff                                      │
│   - 生成符合 Conventional Commits 格式的 message                    │
│     格式: type(scope): concise summary                              │
│     类型: feat / fix / refactor / docs / test / chore               │
│   - 不带 AI 生成标记(无 🤖 签名)                                   │
│   - 执行 commit 和 push]                                            │
│                                                                     │
│  示例输出:                                                          │
│  ┌────────────────────────────────────────────────────────────┐    │
│  │  feat(ui): add theme toggle button                          │    │
│  │                                                             │    │
│  │  - Support dark/light theme switching                       │    │
│  │  - Persist user preference in localStorage                  │    │
│  └────────────────────────────────────────────────────────────┘    │
│                                                                     │
│  对比:没有 Skill 时,你需要每次都告诉 AI:                          │
│  「帮我 commit,用 Conventional Commits 格式,不要加 AI 签名...」   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Git Workflow Skill 的三个工作流(可独立或组合使用):

工作流触发方式作用
Commit/git-workflow 帮我提交生成规范的 commit message
Pull Request/git-workflow 帮我创建 PR创建分支 → commit → 开 PR
Release/git-workflow 帮我发布更新版本号 → 改 CHANGELOG → 打 tag → 发布

演示要点总结:

阶段展示的概念对应 Part 2 的知识点
阶段一Context 质量决定输出质量Context Engineering
阶段二早期纠偏节省 ContextAgent 的 ReAct 循环
阶段三AI 直接操作外部工具Function Call / Tool Use
阶段四Skill 封装重复工作流Skills 渐进式加载

[!TODO] 演示准备

  • [ ] 准备干净的演示环境(新文件夹、gh CLI 已登录)
  • [ ] 测试完整流程(确保 GitHub Pages 能正常部署)
  • [ ] 准备 Git Workflow Skill
  • [ ] 录制备用视频(防止现场网络问题)
  • [ ] 准备「坏 Context」的反面例子

4.5 使用边界 ​

4.5.1 什么时候该用 / 不该用 AI ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  AI 使用场景光谱                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    放心用                    谨慎用                     最好别用     │
│    ◄─────────────────────────────────────────────────────────────►  │
│                                                                     │
│    · 拼写检查               · 业务逻辑实现              · 安全关键代码│
│    · 格式化                 · 不熟悉的领域              · 架构决策    │
│    · 样板代码               · 性能优化                  · 加密实现    │
│    · 文档草稿               · 并发代码                  · 认证授权    │
│    · 单元测试               · 数据库设计                · 支付处理    │
│    · 代码解释               · API 设计                  · 合规代码    │
│    · 重构建议               · 错误处理策略              · 你不打算    │
│    · 命名建议               · 第三方集成                  理解的代码  │
│                                                                     │
│    你完全理解               你需要仔细审查              你必须亲自写  │
│    AI 只是加速              AI 是参考意见              或深度审查    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

引用 软件工程的「纯」与「不纯」:

text
┌─────────────────────────────────────────────────────────────────────┐
│  纯粹工程 vs 不纯粹工程                                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    纯粹工程                           不纯粹工程                     │
│    (Pure Engineering)                 (Impure Engineering)          │
│                                                                     │
│    ┌─────────────────────┐           ┌─────────────────────┐       │
│    │ · 你非常了解的问题   │           │ · 你只有粗浅理解     │       │
│    │ · 社区不熟知        │           │ · 问题不新颖        │       │
│    │   (值得研究)      │           │   只是对你新        │       │
│    │ · 在专长极限边缘    │           │ · 很少处理透彻      │       │
│    │ · 有无限时间        │           │   理解的问题        │       │
│    │                     │           │ · 紧迫的截止日期    │       │
│    └──────────┬──────────┘           └──────────┬──────────┘       │
│               │                                  │                  │
│               ▼                                  ▼                  │
│    ┌─────────────────────┐           ┌─────────────────────┐       │
│    │   AI 帮不上忙        │           │  AI 可能比你更聪明   │       │
│    │   (需要深度思考)   │           │  (快速出活)        │       │
│    └─────────────────────┘           └─────────────────────┘       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

作者观点

AI 最擅长的是「不纯粹工程」——那些你知道怎么做、但做起来很繁琐的事情。而「纯粹工程」——需要深度思考和创造性的部分——还是得靠你自己。

4.5.2 技能退化警示 ​

行业警示

来源:如何避免在 AI 时代技能退化 [2]

「今天跳过『艰难方式』的初级开发者可能会过早触及天花板,缺乏成长为高级工程师的深度。」

三个需要警惕的征兆:

征兆表现后果
调试恐惧看报错 → 复制给 AI → 不管它说什么都试遇到 AI 搞不定的问题时完全不知道从哪下手
无脑复制「代码能跑就行,不需要理解」代码改动时不知道会影响什么
架构思维丧失只会问「怎么写」不问「放在哪里」系统越写越乱,最后只能推倒重来

一条判断标准:

专家观点 — Simon Willison [^55]

「我的黄金法则是:我不会提交任何我无法向别人解释的代码。」

4.5.3 成本意识 ​

text
┌─────────────────────────────────────────────────────────────────────┐
│  对话累积的成本问题                                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    第 1 轮对话:输入成本 500 tokens                                  │
│    第 2 轮对话:输入成本 2000 tokens(包含第 1 轮历史)              │
│    第 3 轮对话:输入成本 4000 tokens(雪球越滚越大)                 │
│    ...                                                              │
│    第 10 轮对话:输入成本可能已经是第 1 轮的 20 倍                    │
│                                                                     │
│    这就是为什么 Claude Code 有 /clear 命令                           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Token 效率优化建议:

建议说明
定期 /clear任务完成或对话偏离时,清空重新开始
精简 CLAUDE.md不要塞太多内容,60 行以内最佳
MCP 不要装太多每个 MCP Server 的工具定义都占 Context
具体的 prompt一次说清楚,避免来回澄清
分任务处理大任务拆成小任务,每个任务独立对话

4.6 团队采用 ​

4.6.1 OCaml 13K PR 案例 ​

2025 年 10 月,一位热情的外行用户给 OCaml 编译器项目提交了一个 13,000 行的 PR [3]。

这个 PR 是用 Claude 全程生成的,目的是实现 DWARF 调试支持。结果?被 maintainer 锁定并拒绝了。

text
┌─────────────────────────────────────────────────────────────────────┐
│  OCaml 13K PR 事件时间线                                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  提交者: 一位热情的外行用户                                          │
│  工具: Claude AI                                                    │
│  PR 规模: 13,000+ 行代码                                            │
│                                                                     │
│  问题 1: 没有事先讨论就提交巨型 PR                                   │
│          └─ 浪费了 volunteer maintainer 的时间                      │
│                                                                     │
│  问题 2: AI 生成的代码里有错误的版权声明                             │
│          └─ 把代码归属给了 Mark Shinwell(一个真实的人)             │
│                                                                     │
│  问题 3: 被问到为什么有这个归属时,提交者说:                        │
│          「Beats me. AI decided to do so and I didn't question it」 │
│          (我也不知道,AI 决定这么做的,我没质疑)                   │
│                                                                     │
│  问题 4: 把大量 .md 文件加进了 .gitignore                            │
│          └─ 明显没有认真 review 过自己提交的代码                     │
│                                                                     │
│  结果: PR 被锁定,maintainer 非常耐心但明确地拒绝了                  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

教训:

「提交代码的工程师始终对代码质量、安全和功能负责,无论 AI 是否参与。」

4.6.2 分阶段采用策略 ​

来自 Pete Hodgson 和 Jellyfish 的建议:

text
┌─────────────────────────────────────────────────────────────────────┐
│  团队采用 AI 编程的三个阶段                                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    阶段 1: 实验                                                      │
│    ┌─────────────────────────────────────────────────────────────┐  │
│    │  目标: 理解能力和局限                                        │  │
│    │  活动:                                                       │  │
│    │    · 小范围试用(1-2 人先跑起来)                            │  │
│    │    · 记录使用经验(踩了什么坑、学到什么)                     │  │
│    │    · 尝试不同场景(哪些适合 AI、哪些不适合)                  │  │
│    │                                                              │  │
│    │  ← 我们团队目前在这里                                        │  │
│    └─────────────────────────────────────────────────────────────┘  │
│                          │                                          │
│                          ▼                                          │
│    阶段 2: 采用                                                      │
│    ┌─────────────────────────────────────────────────────────────┐  │
│    │  目标: 成为日常工具                                          │  │
│    │  活动:                                                       │  │
│    │    · 团队培训(今天这个分享算是开始)                        │  │
│    │    · 共享配置(CLAUDE.md、MCP 配置)                         │  │
│    │    · 建立 Code Review 规范                                   │  │
│    └─────────────────────────────────────────────────────────────┘  │
│                          │                                          │
│                          ▼                                          │
│    阶段 3: 影响                                                      │
│    ┌─────────────────────────────────────────────────────────────┐  │
│    │  目标: 衡量实际效果                                          │  │
│    │  活动:                                                       │  │
│    │    · 对比使用前后的效率指标                                  │  │
│    │    · 识别最佳实践,固化成规范                                │  │
│    │    · 持续迭代改进                                            │  │
│    └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

4.6.3 Oxide 五原则 ​

企业实践 — Oxide 公司

背景:硬件+软件公司,由多位前 Sun/Joyent 资深工程师创办 来源:RFD 576: Using LLMs at Oxide [4]

原则解释我的理解
责任人类判断始终在环内,对所有输出负责不能说「AI 写的,我不知道」
严谨LLM 应该锐化思考而非替代思考用 AI 加速,不是用 AI 偷懒
同理心考虑内容创作者和消费者想想 Reviewer 的时间,想想维护者的负担
团队合作保持真诚的沟通如果用了 AI,就说用了;不要假装是自己写的
紧迫感的平衡不为速度牺牲质量快不是目的,好才是

4.6.4 代码审查底线 ​

对 AI 生成代码的审查,应该多问两个问题:

问题为什么重要
「为什么选择这个方案?」如果答不上来,说明你没理解代码
「考虑了哪些替代方案?」如果没考虑,说明你只是接受了 AI 的第一个建议

4.7 Q&A 与资源 ​

4.7.1 常见问题 ​

问题简短回答
「Claude Code 要钱吗?」要,按 token 计费,公司应该会统一采购
「和 ChatGPT 比哪个好?」写代码的话,Claude 目前更强;但选型要看具体场景
「会不会泄露公司代码?」Anthropic 声称不会用 API 数据训练模型,但敏感代码还是要注意
「我完全不懂 AI,能用吗?」能,但建议先从简单任务开始,不要一上来就 Vibe Coding
「AI 会取代程序员吗?」短期不会,但会改变工作方式;不用 AI 的程序员可能会被用 AI 的程序员取代
「英文不好影响大吗?」有影响但不大,Claude 中文支持不错;关键是学会组织 Context

4.7.2 资源推荐 ​

入门必读:

资源说明
Claude Code Best PracticesAnthropic 官方最佳实践
Claude Code Docs官方文档,遇到问题先查这里
如何避免在 AI 时代技能退化中文,技能退化警示

进阶阅读:

资源说明
Oxide RFD 576企业级 LLM 使用策略
一个半月高强度 Claude Code 使用后感受喵神的文章,实战经验
Context Engineering Guide深入理解 Context Engineering

4.7.3 最后一句话 ​

用 AI 加速你已经理解的工作,而不是用它跳过你应该学习的过程。

这是我这几个月踩坑下来最深的体会。希望对大家有帮助。


参考资料 ​


  1. 💬 L4 | Don't think of LLMs as entities but as simulators | Andrej Karpathy - 2025 年 12 月 7 日推文,提出「LLM 是模拟器而非实体」的心智模型,解释 personality embedding vector 概念。 ↩︎

  2. 📝 L3 | 如何避免在 AI 时代技能退化 | 宝玉的分享 - 中文译文,原文详述技能退化的四个征兆和七条实践建议。 ↩︎

  3. 💬 L4 | AI has a deep understanding of how this code works | Hacker News - 2025 年 10 月 OCaml 编译器 13K 行 AI 生成 PR 事件的社区讨论,展示了 AI 辅助编程的典型反面案例。 ↩︎

  4. 🔬 L1 | Oxide RFD 576: Using LLMs at Oxide - Oxide 公司关于企业级 LLM 使用的详细策略文档,强调责任、严谨、同理心等核心价值观。 ↩︎

基于 VitePress 构建