第 2 章:两种控制面 — Prompt 拼装与 Instruction Fragment
出处
来源:原网页 · 状态:已读 · PDF:book2-comparing.pdf p.12–15
一句话
Claude Code 把 prompt 当运行时控制面的动态拼装结果,Codex 把 instruction 当可识别、可包裹、可序列化的结构化片段。 前者更像现场编导,后者更像制度秘书。谈控制面,首先不是文风问题。
核心概念
把 prompt 讨论收成措辞风格会走偏。书里那句对照很硬:把警察制度理解成说话语气。两边都把给模型的指令当成行为调控组件,路径不同。
Claude Code 按运行时条件把 constants/prompts.ts、utils/systemPrompt.ts、claudemd.ts、memory、output style 注入 system prompt,重心是多源排序、减少互斥。控制面随任务、memory、工具能力与团队注入而变,不是一份死文本。底板是 default,再叠 append、agent 角色、CLAUDE.md 与 memory 的现场条件。好处是同一主循环可换场景;代价是必须盯拼接次序,否则后层盖前层、语义变淡。它依赖运行时治理:memory 预取、collapse、microcompact、autocompact 都在结构里。控制面是不断被注入、覆盖、折叠和压缩的动态组合物,而非静止法规。这与主循环性格一致:每轮重算此刻最要紧的东西。
Codex 拒绝把 instruction 交给模型「自己体会」。ContextualUserFragmentDefinition 强调类型、起止、包裹与消息转换。fragment.rs 把 AGENTS_MD_START_MARKER / END_MARKER、SKILL_OPEN_TAG / CLOSE_TAG 写成常量,经 wrap()、into_message() 变成 ResponseItem::Message。UserInstructions 序列化成 # AGENTS.md instructions for ...;SkillInstructions 带 <name>、<path>。连这段规则来自哪个目录、哪个 skill 文件,都不让模型猜。结果是来源可追查,也便于后续做成 precedence / merge / visibility 一类规则。
不变式大致是:起止标记成对;source ∈ {AGENTS_MD, SKILL, USER};project > team > default;CLAUDE.md 注入次序 team → personal → project;开启 child_agents_md 时补上作用域与优先级说明。
CLAUDE.md 像工地告示:贴着任务目录,和 memory/skill 一起登记常识、禁忌与局部规矩。AGENTS.md 被拉进层级:即便当下没有该文件,打开 child_agents_md 也会追写范围与优先级。Claude Code 让现场规则进入会话,Codex 让现场规则进入制度。
关键洞察
两种控制面的代价不对称。运行时拼接灵活,难彻底形式化,靠主循环与工程判断;规则一多就要防互盖与语义变淡。带标记的片段更清楚,但更重:标记、类型、序列化、注入路径都要定义,还要分清谁是一等对象。前者养出经验型控制力,后者养出制度型控制力——一个长于灵活但不够显式,一个长于清楚但要持续维护结构成本。
比谁更先进没有意义。要看系统更怕哪类失控:长会话指令走样、现场变得太快,倾向动态拼接;来源不清、范围含糊、难系统治理,倾向 fragment。
个人思考
对照 Book 1 第 2 章「Prompt 是控制平面」:那边已经把 prompt 从人格设定里救出来。Book 2 补的是:救出来之后,控制面可以继续当装配线,也可以升级成带编号的公文。仓库里 Warp 把现场反馈沉淀进 skill,更接近 Claude Code 这条;若一个组织要跨仓复制同一套行为,Codex 对来源、作用域、优先级的强迫症会更有用。