Claude Code 架构 · Layer 1:长期上下文层(CLAUDE.md / Memory)
Layer 1:长期上下文层
在六层架构中的位置:最底层,告诉 Claude "你是谁、在哪个项目、有什么规矩"。每次对话自动加载,是 CC 的"性格设定"和"工作手册"。
前置阅读:
00-总览与主线地图.md(三条主线的关系)关联层:Layer 2(工具能力)和 Layer 3(Skills)都建立在 Layer 1 的基础上。Layer 1 定义"是什么",Layer 2 定义"能做什么",Layer 3 定义"怎么做"。
一、一句话理解
长期上下文 = 每次对话自动加载的背景信息。 包括 CLAUDE.md(全局/项目级规则)、Memory 文件(跨会话记忆)、rules 配置。
这是 CC 系统的地基。如果 Layer 1 写得好,CC 在任何会话中都知道该用什么技术栈、该遵守什么规矩、该注意什么偏好。如果写得差,你每个会话都要重复交代一遍"用 Streamlit 不用 React""Python 用 miniforge3"。
二、三层体系
你现在有一个清晰的三层上下文体系:
2.1 全局 CLAUDE.md(~/.claude/CLAUDE.md)
作用:所有项目、所有会话都会自动加载的通用规则。
目前内容:
| 区块 | 内容 | 估算 tokens |
|---|---|---|
| 核心规则 | 先描述方案再执行、列问题建议测试 | ~200 |
| 协作模式 | 教练+助手、多问多讨论多教 | ~300 |
| 行为规范 | 需求理解、决策格式、任务执行、重构操作 | ~500 |
| 技术栈规则 | Streamlit、Python miniforge3、pnpm | ~150 |
| 路径规范 | 标准路径表、已废弃路径 | ~300 |
| 短规则 | 包管理器、Skill 结构、文档存放等 | ~200 |
| 合计 | ~1.5-2K |
好的地方:
- 规则是"可执行的"而非解释性的。比如"技术栈用 Streamlit"直接告诉 CC 该做什么,而不是"我们有时候用 Streamlit 有时候用 React"
- 有"禁止行为"清单,明确什么不该做
- 路径规范统一,避免 CC 把文件写到错误的地方
写 CLAUDE.md 的原则:短、硬、可执行。
| 好规则 | 坏规则 | 为什么 |
|---|---|---|
| "技术栈用 Streamlit,不用 React" | "我们的技术栈比较灵活,通常用 Streamlit" | 好规则没有歧义,CC 不需要判断 |
| "任务超 5 分钟必须拆分" | "大任务建议拆分" | 好规则有量化标准 |
"Python 用 /Users/tianli/miniforge3/bin/python3" | "用系统 Python" | 好规则指定了绝对路径 |
经验法则:如果一条规则在 3 个以上的会话中都要用到,就该写进 CLAUDE.md。如果只在某个会话中用一次,别写进来——直接在会话中说就行。
2.2 项目级 CLAUDE.md
作用:某个项目特有的规则,只在该项目目录下启动 CC 时加载。
示例:你的 ~/Work/zdwp/CLAUDE.md 包含:
- PARA 目录结构规范
- Git 策略(commit 规则、分支命名)
- 水利行业特有的业务约束
全局 vs 项目级的分界线:
| 规则 | 放哪里 | 判断依据 |
|---|---|---|
| "用 Streamlit" | 全局 | 所有项目都适用 |
| "PARA 目录结构" | zdwp 项目级 | 只有水利项目用 PARA |
| "禁止 bullet point" | 全局(如果所有公文都要求)或项目级 | 看适用范围 |
| "投标单位名称禁止出现" | 项目级 | 每个项目的投标单位不同 |
2.3 Memory 文件
作用:跨会话的"记忆",CC 会自动读取。
你的 Memory 路径:~/.claude/projects/-Users-tianli/memory/MEMORY.md
目前内容:
- 工作追踪系统的设计决策
- 用户偏好(多用 Agent Teams、模型选择策略)
- OA 秘书系统的数据源和 AI 精简原则
- 系统状态(家目录空间)
- 对话导出工具路径
Memory 的特点:
- 由 CC 自动维护(CC 可以往里写)
- 适合放"关键决策"和"偏好"
- 不适合放"规则"(规则放 CLAUDE.md,更可控)
三、rules 目录的用法
除了 CLAUDE.md 和 Memory,CC 还支持 rules 目录来组织规则。
全局 rules:~/.claude/rules/
项目级 rules:项目目录/.claude/rules/
每个 .md 文件是一条或一组规则,CC 会自动加载该目录下的所有 .md 文件。
什么时候用 rules 目录而不是 CLAUDE.md?
| 场景 | 用 CLAUDE.md | 用 rules 目录 |
|---|---|---|
| 规则数量少(<20条) | 合适 | 没必要 |
| 规则数量多(>20条),需要分类管理 | 会变得很长 | 按主题拆分成多个文件 |
| 多人协作,不同人负责不同规则 | 容易冲突 | 各管各的文件 |
| 规则需要频繁启用/禁用 | 要手动注释 | 移出/移入目录即可 |
你的现状:目前规则量不大,CLAUDE.md 已经够用。如果将来规则膨胀到超过 3K tokens,可以考虑拆分到 rules 目录。
四、Compact Instructions
4.1 什么是 Compact Instructions
当对话变长、context 窗口接近满载时,CC 会自动"压缩"上下文——把长对话精简为摘要。
问题是:CC 压缩时不知道哪些信息对你最重要,可能把关键规则压缩掉。
Compact Instructions 就是告诉 CC:"压缩时必须保留以下内容"。
4.2 怎么写
在 CLAUDE.md 中加一段:
## Compact Instructions
压缩上下文时必须保留以下规则(按优先级排列):
1. 技术栈:Streamlit + Python miniforge3,禁止 React/Next.js
2. 协作模式:教练+助手,先描述方案等待批准再执行
3. 路径规范:全局配置 ~/.claude/,脚本库 ~/Dev/scripts/,水利公司 ~/Work/zdwp/
4. 任务管理:超 5 分钟必须拆分,多 agents 并行
5. 决策格式:必须写选项列表,标记推荐,说明理由
6. 4 维度框架(D1 来龙去脉、D2 乙方立场与措辞、D3 报告结构、D4 预判评审)
4.3 为什么重要
你的工作场景中经常有长会话——标书写作可能持续几个小时,中间多次 compact。如果 compact 后 CC 忘了"用 Streamlit 不用 React",你在后续讨论中让它做 Web 应用时它可能提议用 React,你又要纠正一遍。
Compact Instructions 避免了这种重复纠正。
五、我们的现状 vs 最佳实践
| 维度 | 我们现在 | 最佳实践 | 差距 |
|---|---|---|---|
| CLAUDE.md 长度 | ~2K tokens | 控制在 2.5K 以内 | 接近达标,注意不要膨胀 |
| 全局/项目分层 | 已做到 | 通用放全局,项目特有放项目目录 | 达标 |
| 规则是否可执行 | 基本做到 | 每条规则都是"CC 能直接执行的指令" | 达标 |
| Compact Instructions | 没有 | 告诉 CC 压缩时保留什么 | TODO |
| Memory 定期清理 | 没有机制 | 定期审计,删除过时记忆 | TODO |
| 区分硬规则/偏好 | 没有区分 | 用 MUST/SHOULD/MAY 标记优先级 | TODO,考虑加 |
| HANDOFF.md | 没有系统化 | 跨会话接力标准格式 | TODO |
六、常见误区
这层不该放什么:
- 大段背景介绍:比如"我是一名水利工程师,工作了 X 年......"——CC 不需要你的简历,只需要影响行为的规则
- 完整 API 文档:比如把 python-docx 的 API 贴进来——白白占用 tokens,CC 本来就知道这些
- 一次性指令:比如"今天帮我整理下载目录"——直接在对话中说,不要写进永久规则
- 重复内容:全局写了"用 Streamlit",项目级又写一遍——CC 两层都会读到
最容易犯的错:把 CLAUDE.md 当"笔记本"用,什么都往里塞。记住:CLAUDE.md 的每一行都在消耗 context 窗口。写进去的每条规则,都应该值得在每个会话中都被 CC 读到。
七、Token 成本意识
上下文窗口是有限的(约 200K tokens),Layer 1 的内容是"固定开销"——每个会话都会付出。
固定开销(每次会话):
├── 系统指令 ~8K
├── Skill 描述(25+ 个) ~5K
├── MCP 工具定义 ~2K
├── 全局 CLAUDE.md ~2K
├── 项目 CLAUDE.md ~1.5K
├── Memory 文件 ~1.5K
└── 合计 ~20K
实际工作可用空间:~180K
这意味着:
- CLAUDE.md 不是越多越好——2.5K tokens 是好上限
- 每加一个 MCP Server 约 4-6K tokens——不要随便加
- 你的"脚本 > Skill > CC 直接"三级优先级,本质上就是在节省 token
八、TODO
- 写 Compact Instructions(P0):在 CLAUDE.md 中加一段,列出压缩时必须保留的规则
- Memory 清理(P1):审计现有 Memory 文件,删除不再相关的内容(比如过时的"家目录空间"数据)
- 考虑规则优先级标记(P2):给 CLAUDE.md 规则加 MUST/SHOULD/MAY
- HANDOFF.md 模板(P2):标准化跨会话接力的格式
补充:上下文分层加载与 Token 经济学
以下内容合并自 tw93 Ch03(上下文工程)的独有段落。
上下文的三层分配
┌─────────────────────────────────────────────┐
│ 固定开销(每次会话自动加载) │
│ ├── 系统提示(系统指令) ~8K │
│ ├── CLAUDE.md(全局+项目级) ~3.5K │
│ ├── Memory 文件 ~1.5K │
│ ├── Skill 描述(25+ 个) ~5K │
│ └── MCP 工具定义 ~2K │
│ 合计 ~20K │
├─────────────────────────────────────────────┤
│ 半固定(连接时加载) │
│ └── MCP Server schema(每个 4-6K) │
├─────────────────────────────────────────────┤
│ 动态(随对话增长) │
│ └── 用户消息、CC 回复、工具调用输出... │
├─────────────────────────────────────────────┤
│ 实际可用空间 ~180K(3个 MCP 则降到 ~165K) │
└─────────────────────────────────────────────┘
MCP 的 Token 成本
| MCP 数量 | 固定 token 开销 | 占 200K 总量 |
|---|---|---|
| 0 个 | 0K | 0% |
| 1 个 | ~5K | 2.5% |
| 3 个 | ~15K | 7.5% |
| 5 个 | ~25K | 12.5% |
什么时候才该考虑 MCP:CC 反复忘记脚本用法、需要复杂认证/状态管理、需要非 Bash 协议。
"脚本 > Skill > CC 直接" 的 Token 对比
以"检查标书中有没有 bullet point"为例:
| 方式 | 消耗 |
|---|---|
脚本 report_quality_check.py | ~35 token |
| Skill 加载 + CC 按指引检查 | ~2,800 token |
| CC 直接读文件逐行扫描 | ~5,000+ token |
12 章标书每章多次检查时,差距放大到不可忽视。
分层加载核心策略
- 始终加载(CLAUDE.md)→ 精简
- 按需加载(Skills)→ 可以写详细
- 临时加载(工具输出)→ 控制长度,脚本输出 30 行以内
参考
00-总览与主线地图.md— 三条主线的全局视图Layer2-工具能力.md— Layer 2 工具层,建立在 Layer 1 之上Layer3-工作流Skills.md— Layer 3 工作流层,使用 Layer 1 的规则约束~/.claude/CLAUDE.md— 你的全局规则文件(实物)~/.claude/projects/-Users-tianli/memory/MEMORY.md— 你的 Memory 文件(实物)