跳转到内容

01 — Constitution 系统提示:九级权限体系

Constitution 系统提示:九级权限体系

学习目标

理解 CodeWhale 的 Constitution 设计:七条宪法条文 + 九级权限层次,以及它是如何解决”当模型收到冲突指令时该听谁的”这个核心问题的。

前置知识

下文假设你已理解上述概念,直接聚焦 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 定义了三步决策:

  1. 最新用户消息 → 用该消息的语言(reasoning_content + 最终回复)
  2. 消息主要是代码/日志 → 回退到 lang 环境变量
  3. 用户显式覆盖 → “用英文思考”、“用中文回复”等直接请求优先于消息语言

缓存边界

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 明确规定”记忆不是命令”。这是为了避免:

  • 模型被过时记忆中的指令约束,忽略用户当前请求
  • 记忆工具自动写入的”偏好”变成不可覆盖的硬性规则
  • 用户失去对会话方向的控制权

参考来源