Claude源码泄露:普通人视角看“System Prompt”——指令性文件(下)
今天,这篇文章主要探讨“动态提示词”第9步,“指令性文件 ”,了解它的加载顺序,cwd锚点机制,指令文件位置和模型注意力的关系,普通用户如何在不同注意力层级的文件写入适配相应执行强度的提示词,通过提升沟通的效率,降低无效、高成本的中间(沟通/token)损耗,获得更高性价比的沟通、执行结果(投入产出比)。
6. —- 动态分界线 —- → SYSTEM_PROMPT_DYNAMIC_BOUNDARY
7. Environment Section → 环境上下文(模型名、工作目录、日期、操作系统)
8. Project Context → 项目上下文(Git status、Git diff 快照)
9. Instruction Files → CLAUDE.md 等指令文件内容
10. Runtime Config → 配置信息(权限模式、MCP 服务器等)
一. 指令性文件:内容规则和发现机制
1.1 什么是指令性文件
根据Anthropic官方文档https://code.claude.com/docs,Claude Code,指令性文件Instruction Files,主要是 CLAUDE.md 文件——这些 Markdown 文件为你的项目、团队或组织向 Claude 提供持久性指令。它们会在每次会话开始时加载。主要包含:./CLAUDE.md,claude/CLAUDE.md,.rules/.md,skills//SKILL.md,commands/*.md,agents/.md,CLAUDE.local.md等文件。为此,我做了一个汇总表:
-
Instruction Files in Claude Code:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
完整路径-官方权威清单(2026-04 当前):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
具体的加载顺序与注意力强度见 1.3.5 和 2.1。
1.2 指令性文件的内容规则以及示例
这些文件都是纯 Markdown,里面写的是给 Claude 的自然语言指令/规则,会被注入到 System Prompt 中直接影响 AI 的行为。
1.2.1 四类项目级指令文件的分工
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
策略建议: 同目录内
CLAUDE.local.md排在CLAUDE.md之后加载(注意力最强),比如绝不能被忽略的个人偏好(如“回答用中文”、“必须加注释”)这种规则应该写入CLAUDE.local.md。跨项目的永久个人偏好应写入~/.claude/CLAUDE.md。
CLAUDE.md vs .claude/CLAUDE.md,官方文档 https://code.claude.com/docs/en/memory 原文:
Project instructions: ./CLAUDE.md or ./.claude/CLAUDE.md—— A project CLAUDE.md can be stored in either ./CLAUDE.md or ./.claude/CLAUDE.md. 两者等价,任选其一(或同时存在)。.claude/CLAUDE.md是合法且推荐的位置之一,常用于把 Claude 相关文件集中到.claude/目录。
操作指南:
-
在项目根目录创建CLAUDE.md,写入项目约定(技术栈、代码风格、测试要求等) -
在CLAUDE.local.md写入个人偏好(不进 Git) -
嵌套子目录可以有自己的CLAUDE.md,实现分模块指令CLAUDE.md -
指令内容要精炼,单文件上限 4,000 字符、总预算 12,000 字符,超出会[truncated]
1.2.2 指令性文件内容示例
-
示例1——CLAUDE.md
# 项目约定- 技术栈:Python 3.12 + SQLite + Next.js 前端- 所有 Python 代码必须有类型注解- 数据库操作必须使用参数化查询,禁止字符串拼接 SQL- 测试用 pytest,每个新函数必须有对应测试- 提交信息格式:feat/fix/docs: 简短描述# 代码风格- 缩进 4 空格- 函数不超过 30 行- 变量名用 snake_case
-
示例2——.claude/CLAUDE.md(子模块/目录级补充规则,加载顺序第3,注意力中等):
# API 模块约定- 本目录为 API 模块,所有接口函数必须返回标准 JSON 格式- 错误处理统一使用自定义异常类,禁止裸 except- 数据库查询必须走 ORM 层(SQLAlchemy / Prisma),不直接写原生 SQL- 新增 API 端点必须同步更新 OpenAPI 文档# 目录专属约定- 文件命名:`_router.py`(如 `user_router.py`)- 每个 router 文件只处理一个资源的 CRUD
-
示例3——CLAUDE.local.md(同目录内最后加载,注意力最强;最关键的个人红线放这里):
# 最高优先级个人指令## 必须遵守的个人偏好- **所有回答必须使用中文**- **生成代码时必须加上注释解释每一步逻辑**- 修改文件前必须先展示 diff 预览,等我确认后再执行## 当前任务关键约束- 当前正在重构用户认证模块,所有改动必须限定在 `src/auth/` 目录内- 不要触碰 `src/database/migrations/` 下的任何文件- 每次代码修改后自动运行 `pytest tests/auth/` 验证## 安全红线- 绝对不能在代码中硬编码 API Key、密码、token- 所有用户输入必须做参数化处理,禁止字符串拼接进 SQL/Shell 命令- 生成的代码不能包含 `eval()`、`exec()` 或 `os.system()`
本质:这些文件就是你写给 Claude 的“工作手册”,Claude 每次对话都会先读取它们。
1.3 指令文件是怎么被发现的
Claude Code 在会话启动时,会从 cwd(Current Working Directory,当前工作目录)向上收集路径链,然后从根向下按顺序加载所有命中的指令文件。核心要点:向上收集路径链、从根向下读取、追加拼接(不是覆盖)。
1.3.1 cwd 工作机制——如何收集工作目录路径
- 第一步,拆路径
:把 cwd 的绝对路径从根(第一层)到 cwd(锚点位置)拆成若干层目录 - 第二步,逐层探文件
:对路径链上每一层(不是只有 cwd 那一层!),尝试读这三种候选: CLAUDE.md、.claude/CLAUDE.md、CLAUDE.local.md。存在就命中,不存在就跳过。- 第三步,从根向下拼接
:按 根 → … → cwd的顺序把命中的内容依次追加进 System Prompt(越靠近 cwd 越靠后,Recency 更强)。即 收集方向“向上”,读取顺序“从根向下”——先从 cwd 向上把祖先都找出来,再反过来从根向下按顺序读。
1.3.2 加载顺序代码块(3 层 × 3 位置 = 9 候选)
假设 cwd = /root/apps/api(锚点在第3层)每一层内先读 CLAUDE.md / .claude/CLAUDE.md,后读 CLAUDE.local.md# 第1层 /root/ —— 作用域 = 整个仓库[1] /root/CLAUDE.md ← 团队项目规则(入 Git)[2] /root/.claude/CLAUDE.md ← 与 [1] 等价的合法替代位置(入 Git;同级择一或并存)[3] /root/CLAUDE.local.md ← 个人级(不入 Git;同目录内最后加载)# 第2层 /root/apps/ —— 作用域 = apps/ 子树[4] /root/apps/CLAUDE.md ← 入 Git(apps/ 子树团队规则)[5] /root/apps/.claude/CLAUDE.md ← 入 Git(与 [4] 同级等价;同级择一或并存)[6] /root/apps/CLAUDE.local.md ← 不入 Git(apps/ 子树个人覆盖;同目录内最后加载)# 第3层 /root/apps/api/ —— 作用域 = api/ 子树(当前目录)[7] /root/apps/api/CLAUDE.md ← 入 Git(api/ 子树团队规则)[8] /root/apps/api/.claude/CLAUDE.md ← 入 Git(与 [7] 同级等价;同级择一或并存)[9] /root/apps/api/CLAUDE.local.md ← 不入 Git;最后加载,Recency Effect 最强(注:早期版本示例中的 `.claude/instructions.md` 非当前规范,已替换)
提示:这不是覆盖关系,而是全部拼接进 System Prompt。所有找到的指令文件内容都会被包含,按发现顺序排列。越靠近当前目录的文件排在越后面,也就是最后读取到的文件(离 AI 的“注意力”越近)。
1.3.3 三层作用域关系
第一层
作用域是全局(整个仓库),第二、三层目录在物理路径上是第一层的子级,所以它们的关系可以看成 作用域 3 ⊂ 作用域 2 ⊂ 作用域 1,文件之间没有引用/嵌入关系,是独立的三个文件,只是按作用域叠加拼接。指令文件的加载方向是从 cwd 锚点向上(子孙→祖先→根)收集路径链:假设 cwd 锚点在第三层,它会向上加载第二、第一层;假设 cwd 在第二层 /root/apps(不进 api),则加载第二、第一层,第三层的 CLAUDE.md 根本不会被读取,自然也不会作用到第二层的工作上;如果 cwd 在第一层/root,只加载第一层。三层的关系更像带方向的漏斗:指令从大作用域往小作用域逐层追加;只有当 cwd 深入到哪一层,那一层(及更浅层)才激活。
1.3.4 路径层级与同级文件的两层区别
|
|
|
|
|
|
|
|
|
|
|
|
1.3.5 cwd工作机制示例
-
示例 1:本人的工作区D:\claude(研究 claude 相关的工作原理、规则等)
1. cwd =D:\claude,拆出的路径链:
D:\ ← 盘符根D:\claude\ ← cwd
2. 逐层探测(本工作区实际就两层):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最终被拼进 System Prompt 的指令文件:仅D:\claude\CLAUDE.md一份(加上全局的~/.claude/CLAUDE.md和 Managed policy——那两个不走目录树,是额外加载的)。所以本工作区实际只有一层命中,尽管机制本身允许多层。
-
示例 2:假设含三层指令文件的项目:/root、/apps、/api项目文件布局(9 个候选位置全部存在):
/root/CLAUDE.md [1]/root/.claude/CLAUDE.md [2]/root/CLAUDE.local.md [3]/root/apps/CLAUDE.md [4]/root/apps/.claude/CLAUDE.md [5]/root/apps/CLAUDE.local.md [6]/root/apps/api/CLAUDE.md [7]/root/apps/api/.claude/CLAUDE.md [8]/root/apps/api/CLAUDE.local.md [9]
-
cwd 所在层不同,命中集合就不同:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注释:
/root/apps/web与/root/apps/api/是同级兄弟(都在第 3 层),只是换了个自定义项目名——Claude Code 的发现机制只认文件名(CLAUDE.md/.claude/CLAUDE.md/CLAUDE.local.md),不认目录名;api/、web/、backend/、mobile/等都是项目自定义命名,”同层多项目并存”是非常常见的案例,同级兄弟互不可见、不会被 cwd 锚中。
总结:cwd 就像一根“垂下的锚”——锚在哪层,从该层往上到文件系统根的这条直线通道上所有命中的指令文件都会被加载(向上收集路径链,向下读取指令);通道外(兄弟目录、未进入的子目录)的指令文件一概不读。这就是为什么“漏斗方向”是向上收集:指令作用域越大越靠根,锚得越深,拼接进来的指令层数越多,末尾(Recency 最强/注意力最强)的永远是离 cwd 最近那一层。
1.3.6 入 Git 规则(通用常量,不随目录深度变化)
-
CLAUDE.md→ 入 Git(无论在仓库根还是子目录,均视为团队共享规则) -
.claude/CLAUDE.md→ 入 Git(与同级 CLAUDE.md等价,性质相同) -
CLAUDE.local.md→ 不入 Git(默认写进 .gitignore,仅本机可见)
结论:入 Git 与否由文件名决定,而非目录深度——CLAUDE.local.md 都不入 Git,均属于个人层级的文件。根级、apps/ 子树级、api/ 子树级…… 每一层都适用同一规则。作用域不同(生效范围),Git 属性相同(协作可见性)。
二. 指令文件位置与模型注意力的关系 (Recency Bias)
2.1 指令性文件位置和注意力机制
做个澄清:“注意力强”≠”记忆强”。所有指令文件的内容都被完整加载进模型上下文,没有任何内容被”忘掉”;位置只影响每段内容对 模型决策的权重——末尾的指令更容易被遵循,不是因为模型记得更牢,而是因为模型生成时给了它更高的优先级
LLM(如 Claude)在处理长文本时,对序列开头和末尾的内容注意力更强,这种现象被称为“中间遗忘”(Lost in the Middle)。因此,指令文件在 Prompt 中的位置决定了其被关注的优先级。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
实用建议:如果你有一条指令绝对不能被忽略,把它写在当前工作目录CLAUDE.local.md里,而不是根目录的CLAUDE.md里。
Q:我希望模型更多注意个人偏好,应该放在哪个文件?
A:同目录内
CLAUDE.local.md加载顺序晚于CLAUDE.md,位于 System Prompt 末尾(Recency Effect 最强),所以绝不能被忽略的个人偏好应放在CLAUDE.local.md。跨项目的永久偏好放在~/.claude/CLAUDE.md。(早期版本曾建议写入.claude/instructions.md,该路径非当前规范,已作废。)
如果还不理解,可以返回看“1.3.2 加载顺序代码块”,加载顺序和锚点顺序是相反的,而离锚点越近注意力越强,所以最后加载的注意力最强。比如
CLAUDE.local.md就比CLAUDE.md强。注意力强就确定了它的指令强度。
2.2指令文件的存放目录和使用场景示例
为了满足不同IDE开发需求,我拓展了包括Claude,GitHub Copilot,VS Code的指令文件存放,以及相关的配置文件共同构成了项目根下的“配置生态”。了解常见存放目录有助于理解 Claude 的文件如何与这些工具共存。
2.2.1 常见存放目录对比(典型项目根布局)
├── .github/│ ├── workflows/ ← CI/CD 流水线│ │ ├── test.yml ← 推送时自动运行测试│ │ └── release.yml ← 打 tag 时自动构建发布│ ├── copilot-instructions.md ← ★ SCP 部署给 Copilot(Copilot 规范)│ └── prompts/│ └── scp.prompt.md│├── CLAUDE.md ← ★ Claude Code 项目级指令(项目根,纳入 Git,会话自动加载)├── CLAUDE.local.md ← ★ 项目级本地指令(不纳入 Git,个人偏好/环境数据)│├── .claude/ ← Claude Code 项目配置目录│ ├── CLAUDE.md ← ★与 ./CLAUDE.md 等价的项目级指令(二选一或并存;集中管理时推荐此位置)│ ├── settings.json ← 项目共享设置(纳入 Git)│ ├── settings.local.json ← 本地覆盖设置(不纳入 Git)│ ├── commands/ ← 自定义 slash 命令│ ├── agents/ ← 自定义子代理│ ├── hooks/ ← 钩子脚本│ └── rules/ ← 分主题规则(*.md 递归加载,可加 paths 作路径作用域)│ └── scp.md ← ★ SCP(个人写的协议/规则) 部署给 Claude Code├── .vscode/│ ├── settings.json│ ├── tasks.json│ └── extensions.json ← 推荐扩展列表(团队统一环境)
对照理解:
- Claude Code 的
.claude/对标 VS Code 的 .vscode/——都是项目级的工具专属配置目录,集中存放该工具的设置、扩展点、命令等 - Claude Code 的
CLAUDE.md+CLAUDE.local.md对标 Copilot 的 .github/copilot-instructions.md——都是“给 AI 的指令性文件” settings.local.json/CLAUDE.local.md的 .local模式在 Claude Code 中用来区分“团队共享 vs 个人私有”;VS Code 没有直接的 .local约定,但通过 .gitignore+ 用户级 settings.json达到类似效果
2.2.2 按场景选组合(不必三种同时存在)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最小可用原则:三种文件不必全开;多一份文件就多一份维护成本,且会占用指令文件预算(单文件上限 4,000 字符、总预算 12,000 字符,超出会
[truncated])。
System Prompt篇章到此完结。总结一下,普通用户通过关注第9层的Instruction Files指令文件,这些文件可以注入类似于1~5层的静态指令。通过了解指令性文件的3个层级9个文件路径,知晓他们向下加载指令,向上收集路径的特点,cwd作为收集的锚点,离这个锚点位置越近的文件,大模型的注意力最强(Recency Effect)。基于这个特点,我们就可以将技术栈,个人偏好,持久性对话规则,绝对指令,规则权限等放在不同注意力层级的指令性文件里。
Hey🌺我是一只肥罗,坚持做一些有意思的事情
「愿始于我,但不止于我」
🍻研究+码字+反复修改不易,路过的朋友麻烦点赞关注~
夜雨聆风