Skip to content

指令文件要分层:为什么“一次说清”反而更差

我早期做过一件很自然的事:把关于项目的所有要求、约定、注意事项,全部写进一个常驻的指令文件。文件长到两百多行,我以为这样最省事——结果是一次交付事故:文件里第 200 行写着“交付前必须导出整页截图看过”,而那一轮我恰好跳过了这一步,被忽略的原因恰恰是它在第 200 行。

先说结论

  • 常驻指令不是越全越好:规则一多,每条的实际权重被摊平,具体任务上最该被想起的那一条反而最不显眼;
  • 正确的做法是分层:常驻层只放“不可违反的硬约束”,流程性内容放进按需加载的任务层,细节放进被链接才读的参考层;
  • 判断一条信息该放哪层,只问一个问题:这件事如果没被提醒,会不会出事?

一、现象:塞得越满,遵守得越差

那次事故之后我回看了几轮工作记录,规律很清楚:

常驻文件长度观察到的行为
30 行以内约束基本都被遵守,偶有疏漏也能追溯到表述不具体
80 行左右开始出现“选择性执行”:格式类要求照做,流程类要求时做时不做
200 行以上中间部分的条款事实上失效;同时改动文件时不敢删任何一条,文件只增不减

第三条最要命:文件只会变长。每踩一个坑就补一条,因为“补进去”比“判断该放哪层”便宜,于是几十轮之后,常驻文件成了一份没人完整读过的文档——包括加载它的模型。

二、为什么会这样

两个原因,都跟模型聪明不聪明无关:

一是注意力被摊平。 常驻内容在每次任务开始时就占满了预算,规则条数越多,单条获得的“相对权重”越低。当一条约束和当前任务没有直接关系时,它几乎不会被主动回忆。

二是约束之间会互相干扰。 一次性的实验要求(“这轮先固定随机种子”)和长期的项目约定(“脚本要能重复执行”)写在同一层,模型无法判断哪条该覆盖哪条——它只能平均对待,于是两条都做得半吊子。

三、分成三层

我现在固定分三层:

层次放什么体量加载时机判断标准
常驻层(项目指令文件)不可违反的硬约束:禁止事项、必须跑的检查、环境里不能用的命令30–60 行每次任务开始违反了会直接出事
任务层(技能 / 流程说明)某类任务的步骤与边界:怎么写、怎么验、什么时候不该用每份 100 行内该类型任务被触发时只在做这类任务时才有意义
参考层(笔记 / 排查手册 / 决策记录)具体案例、报错对照、参数细节、历史决策不限被链接到时才读需要时查得到即可

判据只有一条:这件事如果没被提醒,会不会出事? 会出事 → 常驻层;只在特定任务里会出事 → 任务层;事后查得到就行 → 参考层。

四、渐进披露是怎么落地的

关键动作是把触发条件当成第一等公民:任务层的每一份文件,开头先写清楚“什么时候该用它、什么时候不该用”,这段极短,可以常驻;正文才按需加载。目录大致长这样:

text
project/
├─ AGENTS.md              # 常驻:硬约束(30–60 行)
├─ skills/
│  ├─ experiment/SKILL.md # 任务层:触发条件 + 步骤 + 边界
│  └─ delivery/SKILL.md
├─ docs/
│  ├─ troubleshooting.md  # 参考层:症状 → 根因 → 修复
│  └─ decisions.md        # 参考层:为什么这么定
└─ scripts/check.sh       # 机器可判的检查,不靠人记

这样安排之后,常驻部分能稳定被读完;任务层的文件只在真的要做那类任务时才进入上下文;参考层平时完全不占预算。

性价比最高的一步

把“能自动检查的约束”从指令里挪到脚本里。 一条“交付前必须跑三项检查”写在指令里,靠的是模型的自觉;写成 check.sh 并让流程固定调用,靠的是机器。指令只负责说明“为什么要有这个检查”。

五、一个反直觉的取舍

分层不是“少写”,而是把信息放到它被需要的那一层。几个我实际做过的搬迁:

  • “某个路径在这个 shell 里会被改写、要用另一种写法” → 从常驻层搬到参考层的环境排障手册:它是环境相关的一次性知识,不是每次任务都要提醒的约束;
  • “实验必须先写判定门槛再跑” → 从规则文件搬到实验流程的任务层:它只在跑实验时适用,写在常驻层反而稀释了别的约束;
  • “界面的每个可点击元素都要被审计” → 从指令搬到交付脚本:这件事可以自动判断,交给机器比写给人看更可靠。

搬迁之后常驻文件从两百多行回到五十行以内,而遵守率反而上升了——这是最早让我确信“分层”不是形式主义的一次变化。

稍加注意

不要用“文档已经写了”来替代“流程里已经做了”。写在参考层的规则,默认是不会被执行的;只有放进常驻层或自动化脚本里的约束,才算真的生效。

六、自检清单

  1. 常驻文件是否在 60 行以内,且每一条都是“违反了会出事”的硬约束?
  2. 每条约束是否可验证(能写成一条检查),不能验证的说明它该被改写或者搬走?
  3. 每份任务层文件开头是否写清了触发条件与“什么时候不该用”?
  4. 参考层的文件是否真的只被链接、不再常驻?
  5. 上一次踩的坑,我补在了哪一层——是补对了,还是只是补进了最顺手的那个文件?
  6. 有没有哪条约束其实早就可以交给脚本,却还留在指令里靠人记?

由 VitePress 构建 · 部署于 Cloudflare Pages 与 GitHub Pages

热爱 DeepSeek V4.1 Flash · 快、省、够用,一个人也能把整条流水线跑完