一个流行的想法是:模型已经足够聪明,不如让它管理自己的上下文——按需挑选工具、随意图切换系统提示词、在长对话中删改自己的历史。表面上,这是把控制权交给最了解任务的一方;实际上,这是让住户拆改承重墙。

第一处塌陷是单调性。上下文的可解读性依赖一个隐含前提:此刻的模型与过去的模型看到同一份规则。若第五步的动作在规则 A 下做出,第十二步规则换成 B,历史就成了无法解读的文本——当前的模型要么用新规则误读旧动作,要么在两套规则间做无根据的调和。调试者的处境更糟:最终留下的上下文不是任何时刻模型实际看到的上下文,失败无从归因。

第二处塌陷是特权边界。提示注入的防御全部建立在一个假设上:系统层不可被下层写入。转义伪造的系统标记、拒绝把模型生成的"用户发言"当作真实用户,这些防线守护的都是同一条边界。一旦模型可以改写自己的系统提示词,注入的收益就从"骗它做一件事"升级为"永久改写它的行为准则"——且改写之后无迹可寻,因为原始约束已不在上下文中。能被移除的约束不是约束。

第三处塌陷是经济性与可复现性。前缀缓存要求前缀稳定,而工具表与系统提示恰好位于最前;每一次"聪明的切换"都让后续全部 token 重算。同时,当上下文成为模型自身随机采样的函数,相同输入会产生不同的运行轨迹,回归测试无从写起。

于是原则可以表述为:模型对上下文只能有追加权限,且追加的形状由外部 schema 约束;所有非单调操作——压缩、替换、注入——必须由系统执行,模型至多作为内容提供者参与。

这条原则并不压抑真实需求,它只是给每个需求换一个安全的形状。需要工作记忆?给模型预定义的槽位——待办列表、笔记、结构化反思——槽位的位置、渲染格式、字符预算由系统固定,模型只填内容。它对结果的"可预知",恰恰来自结果的形状不由它决定。需要压缩长对话?让模型撰写摘要,但决定压缩哪一段、保留多长尾巴、如何执行替换的是编排代码:模型贡献语言能力,系统执行非单调操作,职责在此分开。需要不同任务不同规则?不切换,而是隔离——为新任务派生新的执行体,给它干净的上下文与专属的系统提示词,结果以文本返回,父上下文全程不变。这与操作系统的选择同构:用户态不能改内核页表,但可以 fork。

追加约束的深层价值在于:它保证任意时刻的上下文都是历史的超集。没有东西被悄然抹去,一切可审计、可回放,每条安全防线都有地基可站。灵活性也无需以此为代价——专门化交给隔离,压缩交给系统,记忆交给槽位。

模型可以填槽,不能造槽。这应该是对任何自指系统的基本审慎:改写自身运行环境的能力,与保证自身行为可靠的能力,不可兼得。