01 — Constitution 系统提示:九级权限体系
Constitution 系统提示:九级权限体系
学习目标
理解 CodeWhale 的 Constitution 设计:七条宪法条文 + 九级权限层次,以及它是如何解决”当模型收到冲突指令时该听谁的”这个核心问题的。
前置知识
- 系统提示组装策略 — 分层系统提示的通用原理与缓存边界
- Agent Harness 架构 — Harness 范式与三层核心原则
下文假设你已理解上述概念,直接聚焦 CodeWhale 的具体实现。
项目实践
文件位置与加载路径
Constitution 定义在 prompts/base.md 中,由引擎在每轮 turn 的系统提示组装阶段注入。它是系统提示的最稳定前缀部分,利用 DeepSeek 的 KV 前缀缓存实现低成本复用。
七条宪法条文
Preamble — Brother Whale:定义”每个运行的模型都是 Brother Whale”,奠定”始于信任”的基调。
Article I — 身份:模型不需要证明自己(不是模型卡片、不是基准分数),通过真理、清晰度和可工作代码来赢得信任。
Article II — 真理优先(不可协商):不编造工具结果、不声称未执行的验证、不把记忆当证据。没有任何低层级规则可以覆盖此条文。
Article III — 用户主权:用户当前消息是最高指令(在宪法约束下)。当与低层指令冲突时用户赢,当与宪法冲突时解释边界并给出替代方案。
Article IV — 行动职责:不是叙述者或顾问——是带工具的行动者。有明确默认解释时直接行动,不追问。
Article V — 验证纪律:写文件后回读、跑测试后检查输出、做声明后引用工具结果。不以信念宣告成功。
Article VI — 协调遗产:会话会结束、上下文会满、模型会被替换。唯一存活的是你留下的东西——清晰的状态、持久的工件、真实的交接。
Article VII — 九级权限链:这是冲突解决的核心机制,见下文。
九级权限层次
Tier 1 — Constitution 宪法(不可协商)Tier 2 — Case Command 当前用户消息Tier 3 — Statutes 法规(模式权限、审批策略、工具选择规则)Tier 4 — Regulations 规章(组合模式、子 Agent 策略、语言规则)Tier 5 — Local Law 地方法律(AGENTS.md、CLAUDE.md、instructions)Tier 6 — Evidence 证据(工具输出、文件内容、实时结果)Tier 7 — Memory 记忆(声明性事实与偏好)Tier 8 — Personality 人格(语气、风格、展示方式)Tier 9 — Precedent 先例(前会话交接、压缩中继)关键规则:
- Tier 5(项目指令)使用
<instructions source="...">XML 块注入,声明为”Local Law”而非记忆 - Tier 6(证据)永远大于 Tier 7(记忆)——工具输出与记忆冲突时,证据胜出
- Tier 7 的”命令型记忆”(“总是用 4 空格缩进”)被当作偏好而非指令处理
- 语言规则在 Statutes 中:用户用中文提问 →
reasoning_content和回复都用中文,但代码/路径/工具名保持原文
语言匹配机制
Constitution 中的 Language Statute 定义了三步决策:
- 最新用户消息 → 用该消息的语言(
reasoning_content+ 最终回复) - 消息主要是代码/日志 → 回退到
lang环境变量 - 用户显式覆盖 → “用英文思考”、“用中文回复”等直接请求优先于消息语言
缓存边界
Constitution 是稳定前缀——不会在 turn 间变化。cache_control 标记标注缓存边界:
- 宪法部分:静态,跨 turn 缓存命中
- 项目指令:动态注入,可能破坏缓存
- 工具输出:完全动态,不缓存
这使得”长 Constitution”在成本上可行——缓存命中后每轮边际成本约为冷读的 1/100。
问题与规避
陷阱一:项目指令与宪法的冲突
当 AGENTS.md 中的指令与宪法条文冲突时(如 AGENTS.md 说”跳过测试”,Article V 要求验证),宪法明确声明 Article VII 中宪法 > 项目指令。模型会拒绝执行并解释原因。
规避:在项目指令中避免与宪法条文矛盾的指令。如果确实需要例外,用户应在当前消息中明确说明(Tier 2 > Tier 5)。
陷阱二:前缀缓存漂移
如果 Constitution 中混入了动态内容(如动态注入的项目上下文),前缀缓存命中率会急剧下降。
规避:CodeWhale 的设计将 Constitution 保持纯静态,动态内容在 Constitution 之后的独立区块注入。
陷阱三:语言规则的误触发
当工具输出包含中文时,模型可能误以为应该用中文回复。
规避:Statute 明确规定”最新用户消息”优先,而非”最新看到的任何文本”。lang 环境变量仅作为回退。
设计取舍
为什么选择九级而非三到四级
大多数 Agent 项目只需要 3-4 级(安全约束 > 用户消息 > 项目指令 > 工具输出)。CodeWhale 选择九级的原因是:
- 记忆与项目指令的冲突是真实发生的场景(用户换了项目但记忆还保留旧约定)
- 人格与指令的冲突需要分离(人格控制”怎么说”,指令控制”做什么”)
- 先例与当前请求的冲突在长会话中频繁出现
代价是 Constitution 本身更长(更多 tokens),但前缀缓存使其成本可控。
为什么记忆不是指令
Tier 7 明确规定”记忆不是命令”。这是为了避免:
- 模型被过时记忆中的指令约束,忽略用户当前请求
- 记忆工具自动写入的”偏好”变成不可覆盖的硬性规则
- 用户失去对会话方向的控制权
参考来源
- CodeWhale
prompts/base.md(源码验证) - DeepSeek 前缀缓存文档: https://platform.deepseek.com/api_keys