本教程面向已安装Claude Code但希望大幅提升协作效率的开发者。你将学会上下文工程(Context Engineering)的核心原理——不是写更好的Prompt,而是设计整个信息环境。教程覆盖CLAUDE.md三级配置体系、自动记忆系统、上下文压缩策略,以及一套完整的项目级上下文管理工作流。
适用人群:有1-3个月编程基础、已完成Claude Code安装的初学者和中级用户。
2025年9月,Anthropic发布了一篇里程碑式的工程博客《Effective Context Engineering for AI Agents》,核心观点非常明确:上下文的质量决定Agent的质量。
传统的提示工程(Prompt Engineering)关注的是"如何写好一条指令"。但在Claude Code这样的Agent式编码工具中,模型接收到的不仅是你的当前输入,还包括:
这些信息共同构成了"上下文窗口"(Context Window)。Claude Code当前支持200K标准Token和1M扩展Token的上下文窗口。上下文工程就是系统地管理所有这些信息源,确保模型在每一轮交互中都能看到最相关的信息。
graph TD
A[用户输入] --> G[上下文窗口]
B[CLAUDE.md指令] --> G
C[对话历史] --> G
D[工具调用结果] --> G
E[自动记忆文件] --> G
F[系统提示] --> G
G --> H[Claude模型推理]
H --> I[代码修改/回复]
style G fill:#f9f,stroke:#333,stroke-width:2px
style H fill:#bbf,stroke:#333,stroke-width:2px
如果你遇到过以下情况,说明需要学习上下文工程:
症状一:Claude"忘记"了之前的约定 你在对话开始时说"用TypeScript严格模式",过了20轮对话后Claude开始写纯JavaScript。原因是:对话太长触发了自动压缩(Compaction),约定被丢弃了。
症状二:Claude给出的回答越来越"泛" 前几轮回答非常精准,后面开始给出模板化、通用化的建议。原因是:上下文窗口被无关信息填充,关键信号被稀释。
症状三:Token消耗快速增长 一个简单的bug修复消耗了数万Token。原因是:上下文中堆积了大量已经不相关的历史对话和工具输出。
Anthropic官方总结的核心原则,可以简化为三个词:
| 原则 | 含义 | 对应策略 |
|---|---|---|
| 精准 | 只提供必要信息 | CLAUDE.md分层、精简指令 |
| 持久 | 关键信息不丢失 | 持久化文件、记忆系统 |
| 动态 | 随任务进展调整 | 压缩、清除、会话切换 |
Claude Code的CLAUDE.md系统采用三级层次结构,每一级有不同的作用域:
graph TB
subgraph 全局级
A["~/.claude/CLAUDE.md<br/>所有项目共享"]
end
subgraph 项目级
B["项目根目录/CLAUDE.md<br/>当前项目所有成员共享"]
C["项目根目录/.claude/CLAUDE.md<br/>(推荐位置,同上)"]
end
subgraph 目录级
D["src/CLAUDE.md<br/>仅特定子目录生效"]
E["tests/CLAUDE.md<br/>仅测试目录生效"]
end
A --> B
B --> D
B --> E
A -.->|加载优先级从上到下| B
B -.-> D
style A fill:#e1f5fe
style B fill:#fff3e0
style C fill:#fff3e0
style D fill:#e8f5e9
style E fill:#e8f5e9
加载规则: - 所有层级的CLAUDE.md都会被合并加载,不会互相覆盖 - 当指令冲突时,更具体的层级优先(目录级 > 项目级 > 全局级) - 每次会话启动时自动加载,无需手动操作
位置:~/.claude/CLAUDE.md
这是你的个人编码偏好,适用于所有项目。内容应该是跨项目通用的风格偏好:
# 全局编码偏好
## 语言
- 默认使用中文回复
- 代码注释使用英文
## 编码风格
- 使用2空格缩进
- 变量名使用camelCase,组件名使用PascalCase
- 优先使用函数式编程风格
- 避免使用any类型(TypeScript)
## Git规范
- 不要自动commit
- commit message使用英文
- 不要提交.env文件
## 通用规则
- 始终先读取文件再编辑
- 优先编辑现有文件而非创建新文件
- 修改代码后主动运行测试
创建命令:
# 方法一:直接创建
mkdir -p ~/.claude
cat > ~/.claude/CLAUDE.md << 'EOF'
# 全局编码偏好
- 默认使用中文回复
- 代码注释使用英文
- 使用2空格缩进
- 不要自动commit
- 始终先读取文件再编辑
EOF
# 方法二:在Claude Code会话中使用斜杠命令
# 直接在对话中输入:
# /memory
# 然后选择编辑全局指令
位置:项目根目录/CLAUDE.md 或 项目根目录/.claude/CLAUDE.md
这是团队共享的项目配置,应该提交到Git仓库中。它定义了项目特定的架构、技术栈和规范:
# 项目:电商平台后端
## 技术栈
- 运行时:Node.js 20 LTS
- 框架:Fastify 4.x(注意不是Express)
- 数据库:PostgreSQL 16 + Prisma ORM
- 缓存:Redis 7
- 测试:Vitest + Supertest
## 项目架构
src/ ├── routes/ # API路由定义 ├── services/ # 业务逻辑层 ├── repositories/ # 数据访问层 ├── middleware/ # 中间件 ├── utils/ # 工具函数 └── types/ # TypeScript类型定义
## 编码规范
- 每个API路由必须有对应的Schema验证(使用TypeBox)
- 错误处理使用自定义AppError类
- 数据库操作必须放在repository层
- 新增API必须编写集成测试
## 常用命令
- `npm run dev` — 启动开发服务器(端口3001)
- `npm test` — 运行所有测试
- `npm run test:watch` — 监听模式运行测试
- `npx prisma migrate dev` — 运行数据库迁移
- `npx prisma studio` — 打开数据库GUI
## 关键约定
- 不要直接修改prisma/schema.prisma,先讨论变更方案
- 所有时间使用UTC,前端负责时区转换
- API响应格式统一:{ success: boolean, data?: any, error?: string }
最佳实践: - 项目级CLAUDE.md控制在200行以内,过长会稀释关键信息 - 使用明确的标题和列表结构 - 包含具体的命令和路径,不要模糊描述 - 随项目演进持续更新
位置:项目子目录中的CLAUDE.md
这是最精细的配置级别,只在Claude Code操作该目录下的文件时生效。特别适合以下场景:
场景一:测试目录的特殊规则
# tests/ 目录规则
- 测试文件命名:`*.test.ts`
- 每个测试文件对应一个源文件
- 使用describe/it结构组织测试
- Mock外部依赖,不要调用真实API
- 测试数据库使用独立的test数据库
场景二:特定模块的复杂逻辑说明
# src/services/payment/ 目录规则
## 支付流程架构
本模块处理支付核心逻辑,涉及三个阶段:
1. 创建订单 → 验证库存 → 冻结金额
2. 调用支付网关 → 处理回调
3. 确认支付 → 更新库存 → 发送通知
## 重要约束
- 支付金额计算使用decimal.js,绝不用浮点数
- 所有金额单位为分(整数),前端转换为元
- 支付回调必须验证签名
- 不要修改订单状态机以外的状态转换逻辑
| 法则 | 说明 | 反面例子 | 正面例子 |
|---|---|---|---|
| 具体而非抽象 | 给出明确指令 | "写好代码" | "所有函数必须有单元测试" |
| 正面+负面 | 告诉Claude该做什么和不该做什么 | "注意性能" | "使用连接池,不要每次请求创建新连接" |
| 包含原因 | 解释为什么,帮助Claude理解上下文 | "用PostgreSQL" | "使用PostgreSQL因为需要JSON查询能力" |
| 分层组织 | 用标题分组,便于Claude定位 | 平铺所有规则 | 按技术栈/架构/规范/命令分组 |
| 保持精简 | 删除过时内容,避免信息噪音 | 1000行CLAUDE.md | 100行精炼的CLAUDE.md |
Claude Code有两套互补的记忆系统:
graph LR
subgraph 持久记忆
A["CLAUDE.md<br/>手动编写<br/>提交到Git"]
end
subgraph 自动记忆
B[".claude/memory/<br/>自动生成<br/>不提交到Git"]
end
A --> C[会话启动时加载]
B --> C
C --> D[Claude Code运行]
style A fill:#e1f5fe
style B fill:#fff9c4
| 特性 | CLAUDE.md | 自动记忆(Auto Memory) |
|---|---|---|
| 创建方式 | 手动编写 | Claude自动生成 |
| 位置 | 项目根目录 | .claude/memory/ 目录 |
| 版本控制 | 提交到Git | 加入.gitignore |
| 作用 | 主动指令和规范 | 被动学习的经验笔记 |
| 内容类型 | "你应该这样做" | "上次我学会了..." |
当你在对话中说了类似以下内容时,Claude Code会将信息存入记忆文件:
Claude Code会将这些学习内容保存到 .claude/memory/ 目录下的Markdown文件中。下次启动会话时自动加载。
查看当前记忆内容:
# 在Claude Code对话中使用斜杠命令
/memory
# 或直接查看文件
ls .claude/memory/
cat .claude/memory/*.md
实践一:定期审查记忆文件
# 每周检查一次记忆文件是否有冲突或过时内容
cat .claude/memory/*.md | less
如果发现过时或不准确的记忆,直接编辑对应文件即可。Claude Code会在下次会话中加载更新后的内容。
实践二:将重要记忆提升到CLAUDE.md
自动记忆是Claude自己写的笔记,格式可能不够规范。如果某条记忆非常重要,应该将其整理后写入项目级CLAUDE.md:
<!-- 从自动记忆提升到CLAUDE.md的示例 -->
## API设计规范
- RESTful路径使用kebab-case: `/user-profile`, `/order-history`
- 响应状态码严格遵循HTTP语义
- 分页参数统一使用 `?page=1&limit=20`
实践三:配置.gitignore
# 将自动记忆加入.gitignore(因为它是个人化的)
echo ".claude/memory/" >> .gitignore
# 但保留CLAUDE.md(它是团队共享的)
git add CLAUDE.md
/memory 是Claude Code内置的斜杠命令,用于管理记忆系统:
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看记忆 | /memory |
显示所有已加载的记忆文件内容 |
| 添加记忆 | 对话中说"记住..." | Claude自动保存到记忆文件 |
| 编辑记忆 | 手动编辑 .claude/memory/*.md |
直接修改Markdown文件 |
| 全局记忆 | 编辑 ~/.claude/CLAUDE.md |
跨项目生效 |
每次Claude Code会话,上下文窗口经历以下阶段:
graph LR
A[会话启动<br/>加载CLAUDE.md] --> B[任务执行<br/>上下文增长]
B --> C{上下文使用率}
C -->|< 60%| B
C -->|60-80%| D["建议手动/compact"]
C -->|> 80%| E["自动压缩触发"]
D --> F[压缩后继续]
E --> F
F --> B
style C fill:#fff9c4
style D fill:#ffe0b2
style E fill:#ffcdd2
Claude Code提供三个核心命令来管理上下文:
/compact — 智能压缩作用:对对话历史进行摘要压缩,保留关键信息,丢弃冗余细节。
最佳使用时机:上下文使用率达到60%时主动执行,不要等到90%以上。
# 在Claude Code对话中输入
/compact
# 带自定义压缩指令
/compact 请保留关于支付模块的所有讨论,丢弃CSS样式相关的对话
压缩后你会看到: - Claude输出一段摘要,说明保留了什么、丢弃了什么 - 上下文使用率显著下降 - CLAUDE.md中的指令不会被压缩(它们始终存在) - 自动记忆文件的内容也不会被压缩
/clear — 完全清除作用:清空整个对话历史,但保留CLAUDE.md和记忆文件。
最佳使用时机: - 切换到完全不同的任务 - 对话出现了严重错误需要"重启" - 上下文已经被无关信息严重污染
# 在Claude Code对话中输入
/clear
# 清除后开始新对话,CLAUDE.md中的指令仍然生效
/rewind — 回退对话作用:将对话回退到之前的某个状态,撤销后续的所有操作。
最佳使用时机: - Claude走错了方向,想回到决策点重新开始 - 之前的代码修改需要撤销
# 在Claude Code对话中输入
/rewind
# Claude会显示对话历史,让你选择回退到哪一步
Claude Code的压缩机制实际上包含五层策略,了解这些有助于你更好地管理上下文:
| 层级 | 策略 | 说明 | 你能控制的 |
|---|---|---|---|
| 第一层 | 对话摘要 | 将长对话压缩为关键要点 | 用 /compact 触发 |
| 第二层 | 工具输出裁剪 | 大文件只保留相关片段 | 在指令中明确需要哪些行 |
| 第三层 | 历史轮次合并 | 相邻轮次的相似内容合并 | 无法直接控制 |
| 第四层 | 早期对话丢弃 | 丢弃最早的不相关对话 | 用 /compact 带提示词 |
| 第五层 | 强制截断 | 最后手段,可能丢失重要信息 | 在80%前主动压缩避免 |
不同场景下应该使用不同的会话管理策略:
graph TD
A[开始新任务] --> B{任务复杂度}
B -->|简单<br/>修bug/小改动| C[单个会话<br/>完成后/clear]
B -->|中等<br/>新功能开发| D[单个会话<br/>定期/compact]
B -->|复杂<br/>架构重构| E[多会话策略<br/>分阶段/clear]
D --> F{上下文>60%}
F -->|是| G["/compact<br/>带保留提示"]
F -->|否| H[继续工作]
G --> H
E --> I[阶段1: 分析规划]
I --> J["/clear"]
J --> K[阶段2: 实现代码]
K --> L["/clear"]
L --> M[阶段3: 测试修复]
style C fill:#c8e6c9
style D fill:#fff9c4
style E fill:#ffccbc
复杂任务的多会话策略是一个关键技巧。以"重构用户认证系统"为例:
会话一(分析规划):
请分析当前认证系统的架构,列出所有需要修改的文件。
不要修改任何代码,只做分析。
完成后执行 /clear。
会话二(核心实现):
基于以下计划重构认证系统:
[粘贴会话一的分析结果]
请先修改核心认证模块 src/services/auth.ts
完成后执行 /clear。
会话三(测试修复):
认证系统重构已完成,现在需要:
1. 运行所有测试
2. 修复失败的测试
3. 补充新的集成测试
这样每个会话都保持紧凑的上下文,避免历史信息互相干扰。
不要让Claude自己搜索文件,直接告诉它看哪里:
# 低效方式(消耗大量上下文Token)
"帮我看看这个项目有什么问题"
# 高效方式(精准定位)
"请阅读 src/services/payment.ts 的第45-80行,这个函数有并发问题"
# 低效方式(可能触发上下文溢出)
"请重构整个认证系统,包括JWT、OAuth、session管理,然后写测试,最后更新文档"
# 高效方式(分阶段执行)
# 第一阶段
"请分析 src/auth/ 目录下所有文件的结构和依赖关系"
# 确认分析结果后
"请重构 auth.service.ts,将JWT逻辑抽取到独立的 jwt.service.ts"
# 逐个文件推进...
Claude Code支持在对话中使用特定语法来控制上下文加载:
# 指定只读取特定文件
"请只看 package.json 和 tsconfig.json,不要读取其他文件"
# 明确排除
"在搜索实现方式时,不要读取 node_modules 和 dist 目录"
# 使用Glob模式的精确指定
"请查看 src/routes/*.ts 中的所有路由定义"
在长会话中主动监控上下文使用情况:
# 查看当前上下文状态(在Claude Code对话中)
/status
# 当接近上限时,主动压缩并给出保留优先级
/compact 保留所有关于数据库schema的讨论,可以丢弃UI样式的讨论
在CLAUDE.md中加入以下类型的指令,可以大幅减少重复解释:
## 上下文管理规则
- 当我说"继续"时,继续上一次未完成的任务
- 当我说"下一个"时,进入计划中的下一个步骤
- 不需要重复你已经知道的信息,直接执行
- 修改文件前不需要展示完整文件内容,只展示变更部分
这些指令可以显著减少每一轮对话的Token消耗。
.claude/ 目录不仅仅是放CLAUDE.md,它是一个完整的配置中心:
.claude/
├── CLAUDE.md # 项目级指令(推荐放这里)
├── settings.json # Claude Code行为配置
├── memory/ # 自动记忆文件
├── commands/ # 自定义斜杠命令
├── skills/ # 项目级Skills
└── hooks/ # 事件钩子
settings.json示例:
{
"permissions": {
"allow": [
"Bash(npm test)",
"Bash(npm run lint)",
"Bash(git status)",
"Bash(git diff)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(npm publish)"
]
},
"autoCompact": true,
"compactThreshold": 0.6
}
假设你有一个Next.js全栈项目需要配置Claude Code的上下文工程。项目结构如下:
my-saas-app/
├── app/ # Next.js App Router
├── components/ # React组件
├── lib/ # 工具函数和共享逻辑
├── prisma/ # 数据库Schema和迁移
├── public/ # 静态资源
├── tests/ # 测试文件
├── package.json
├── next.config.ts
└── tsconfig.json
# 创建全局CLAUDE.md
mkdir -p ~/.claude
cat > ~/.claude/CLAUDE.md << 'EOF'
# 个人编码偏好
## 通用
- 默认使用中文回复
- 代码注释使用英文
- 使用2空格缩进(TypeScript/JavaScript)
- 优先使用ES模块语法(import/export)
- 变量名使用camelCase,类型/接口使用PascalCase
## Git
- 不要自动commit
- 不要自动git add
- commit message用英文,使用conventional commits格式
## 安全
- 不要提交.env、credentials等敏感文件
- SQL查询必须使用参数化,禁止字符串拼接
- 用户输入必须验证
EOF
cd my-saas-app
cat > CLAUDE.md << 'EOF'
# SaaS应用 - 项目配置
## 技术栈
- 框架:Next.js 15(App Router)
- 语言:TypeScript 5(strict模式)
- 样式:Tailwind CSS 4
- 数据库:PostgreSQL + Prisma 6
- 认证:NextAuth.js v5
- 测试:Vitest + Playwright
- 包管理:pnpm
## 架构约定
- app/目录按功能模块组织,每个模块有自己的page.tsx和layout.tsx
- 组件分为 ui/(通用)和 features/(业务)两个子目录
- lib/db.ts 导出Prisma客户端单例
- lib/auth.ts 导出NextAuth配置
- Server Actions放在对应的app/模块目录下
## 关键规则
- 新页面必须添加loading.tsx和error.tsx
- 数据库变更必须通过Prisma迁移(npx prisma migrate dev)
- API路由使用Route Handler(app/api/)
- 不要使用getServerSideProps或getStaticProps(那是Pages Router)
## 常用命令
- `pnpm dev` — 启动开发服务器
- `pnpm build` — 生产构建
- `pnpm test` — 运行单元测试
- `pnpm test:e2e` — 运行端到端测试
- `npx prisma studio` — 数据库管理界面
- `npx prisma generate` — 重新生成Prisma客户端
## 上下文管理
- 修改文件前先读取确认现有内容
- 修改代码后运行 `pnpm test` 验证
- 当对话超过30轮时提醒我执行 /compact
EOF
# 测试目录配置
mkdir -p tests
cat > tests/CLAUDE.md << 'EOF'
# 测试目录规则
## 单元测试
- 文件放在 tests/unit/ 下,镜像src/目录结构
- 使用 describe/it 结构
- Mock外部依赖(数据库、API调用)
- 每个测试文件对应一个源文件
## E2E测试
- 文件放在 tests/e2e/ 下
- 使用Playwright
- 测试关键用户流程:注册→登录→使用核心功能→登出
- 使用 page.goto('/') 而不是硬编码URL
## 命名
- 测试文件:`*.test.ts` 或 `*.spec.ts`
- 测试描述使用中文,便于团队理解
EOF
# Prisma目录配置
cat > prisma/CLAUDE.md << 'EOF'
# 数据库规则
## Schema约定
- 模型名使用PascalCase
- 字段名使用camelCase
- 每个模型必须有 createdAt 和 updatedAt 字段(使用 @updatedAt)
- 枚举类型定义在文件顶部
- 使用 @@map 指定表名(snake_case)
## 迁移规则
- 小改动可以直接 npx prisma migrate dev
- 大改动(删字段、改类型)先备份讨论
- 迁移后必须更新seed脚本
EOF
# 创建.gitignore条目(个人化的不提交)
cat >> .gitignore << 'EOF'
# Claude Code个人记忆
.claude/memory/
EOF
# 确保项目级配置被团队共享
git add CLAUDE.md tests/CLAUDE.md prisma/CLAUDE.md
启动Claude Code并验证:
claude
在对话中输入:
请总结你了解到的关于这个项目的所有信息
Claude应该能准确列出: - 技术栈(来自项目级CLAUDE.md) - 编码风格偏好(来自全局CLAUDE.md) - 测试规则(来自tests/CLAUDE.md) - 数据库规范(来自prisma/CLAUDE.md)
flowchart TB
Start[项目启动] --> A[创建全局~/.claude/CLAUDE.md]
A --> B[创建项目级CLAUDE.md]
B --> C[创建目录级CLAUDE.md]
C --> D[配置.gitignore]
D --> E[提交到Git仓库]
E --> F[开始日常开发]
F --> G{任务复杂度}
G -->|简单任务| H[单会话完成]
H --> I[完成后/clear]
G -->|中等任务| J[单会话推进]
J --> K{上下文>60%}
K -->|是| L["/compact 带保留提示"]
K -->|否| M[继续工作]
L --> M
M --> N{任务完成}
N -->|否| K
N -->|是| O[/clear 新任务]
G -->|复杂任务| P[拆分为3-5个子任务]
P --> Q[子任务1: 分析规划]
Q --> R[/clear]
R --> S[子任务2: 核心实现]
S --> T[/compact]
T --> U[子任务3: 测试修复]
U --> V[/clear]
V --> W[全部完成]
I --> X[项目结束]
O --> X
W --> X
style Start fill:#e8f5e9
style X fill:#e8f5e9
style L fill:#fff9c4
style R fill:#fff9c4
style T fill:#fff9c4
style V fill:#fff9c4
Claude Code在每次新会话启动时加载CLAUDE.md。如果你在会话进行中修改了CLAUDE.md,需要重启会话或执行 /clear 才能重新加载。
位置在 .claude/memory/ 目录下,文件名通常是 YYYY-MM-DD.md 格式。如果没有看到这个目录,说明Claude Code还没有生成自动记忆。
这通常说明该约定应该写入CLAUDE.md而不是只放在对话中。CLAUDE.md的内容不受压缩影响。将被压缩掉的重要信息写入CLAUDE.md:
## 重要约定(不要压缩丢弃)
- 支付模块必须使用decimal.js处理金额
- 所有API必须经过认证中间件
遵循"具体优先"原则。例如: - 全局CLAUDE.md说"使用2空格缩进" - 项目CLAUDE.md说"Python文件使用4空格缩进"
项目级指令覆盖全局级。但最好的做法是避免冲突,在全局级只放真正跨项目通用的规则。
推荐分三步走:
不会。/compact 和 /clear 只影响Claude Code的对话上下文,不会撤销已经写入磁盘的文件修改。如果需要撤销代码修改,应该使用 /rewind 或 git checkout。
掌握了基础的CLAUDE.md配置和记忆管理后,以下进阶方向值得探索:
.claude/commands/):将常见的上下文模式封装为可复用命令.claude/hooks/):在工具调用前后自动执行上下文管理操作claude -p):在CI/CD中实现自动化上下文管理这些进阶话题将在后续教程中逐一展开。
| 项目 | 说明 |
|---|---|
| 适合训练营类型 | AI辅助编程入门营、Claude Code实战营、团队AI工具推广培训 |
| 预计教学时长 | 3-4小时(含实操练习) |
| 实操环节建议 | 学员带自己的项目,现场配置三级CLAUDE.md,体验/compact和/clear的效果 |
| 前置知识 | 基本的终端操作、Git基础、任意编程语言入门 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
