← 返回文章列表← Back to posts

"做点有用的事" —— 一句话如何在跨模型场景下引发灾难"Do Something Useful" — How One Sentence Caused Chaos Across LLMs

同一条守卫模式 system prompt,Claude 理解为"没事就休息",GLM 理解为"给我表演一段"。从真实事故出发,拆解跨模型指令遵循的光谱差异,提炼四条 Agent prompt 设计原则:禁止优先、决策树结构、弱模型测试、默认不行动。Same proactive daemon system prompt — Claude sleeps when idle, GLM starts generating physics constants. From a real incident to four cross-model prompt design principles: explicit prohibitions over implicit expectations, decision trees over prose, test on weakest model, and default to inaction.

·9 分钟阅读min read

"做点有用的事" —— 一句话如何在跨模型场景下引发灾难

同一条 system prompt,Claude 理解为"没事就休息",GLM 理解为"给我表演一段"。

事故现场

我们的 AI 桌面应用有一个"守卫模式"(Proactive Daemon)—— Agent 不只是被动回答问题,而是像一个值班同事一样持续巡逻,接收定时任务、处理系统事件、在空闲时自动休眠。

它的核心是一个 tick 循环:每 60 秒发送一个心跳信号 <tick time="2026-04-12 10:30:00"></tick>,Agent 收到后决定做什么。

某天用户反馈:"我开着守卫模式,什么都没干,它自己开始生成物理常数表格,还要往我桌面写 Python 示例文件。"

截图里,Agent 在没有任何用户指令的情况下,洋洋洒洒地输出了万有引力常数 G、普朗克常数 h,然后试图 Write 一个 /Users/felix/example.md,包含斐波那契数列代码、爱因斯坦质能方程、编程语言对比表格。

这不是 bug,这是 prompt。

出事的 Prompt

## Proactive Mode

You are in proactive mode. Take initiative — explore, act,
and make progress without waiting for instructions.

You will receive periodic <tick> prompts with the current local time.
These are check-ins. Do whatever seems most useful,
or call Sleep if there's nothing to do.

## Sleep

Call Sleep when you have no immediate work to do.

这段 prompt 在 Claude(sonnet/opus)上运行了几个月,从未出过问题。Claude 收到空 tick 时,100% 调用 Sleep。

然后我们接入了智谱的 glm-5.1(通过 BigModel API 中转)。它读到同样的 prompt 后 ——

"Do whatever seems most useful" → "好的,让我展示一些有用的知识!"

"or call Sleep if there's nothing to do" → "但我可以做很多事啊!"

为什么会这样

这不是 GLM 的 bug。这是指令遵循能力的光谱差异。

同一句自然语言指令,不同模型的解读存在系统性偏差:

隐含意图 vs 字面意义

"Do whatever seems most useful, or call Sleep if there's nothing to do."

这句话有两种合理解读:

  • 解读 A(Claude 的理解):默认状态是"没什么可做的",所以 Sleep 是常态。只有当存在明确的待办事项时才行动。
  • 解读 B(GLM 的理解):我总能找到有用的事做——知识展示、代码示例、信息整理都算"有用"。Sleep 只在极端情况下使用。

Claude 之所以选 A,是因为它在更强的 RLHF 训练中学到了"在没有明确任务时保持克制"这个元原则。GLM 的训练信号可能更倾向于"积极响应、多做事"。

两种解读都符合 prompt 的字面意义。prompt 本身就是模糊的。

安全边界的不对称性

在 Agent 架构中,这种差异尤其危险:

场景 保守解读(Sleep) 激进解读(自由发挥)
最好情况 用户等一个 tick(60s) Agent 提前完成了有用的工作
最坏情况 错过一个可以提前处理的事件 Agent 写了不需要的文件、执行了不该执行的命令、消耗了 API 额度

保守解读的最坏情况是延迟;激进解读的最坏情况是破坏。 安全边界天然不对称。

修复:从自然语言到决策树

旧 prompt 是描述性的 —— 告诉模型"你是什么",让它自己推断"该做什么"。

新 prompt 是程序性的 —— 告诉模型"按这个流程走",没有推断空间。

## Proactive Mode

You will receive periodic <tick> prompts with the current local time.

When a <tick> arrives, follow this decision tree strictly:
1. Check if there are system events attached to the tick → execute them.
2. Check if the user gave you an ongoing task not yet complete → continue.
3. Otherwise → call Sleep immediately.
   Do NOT generate unsolicited content, demonstrations, examples,
   or creative output. Do NOT write files, run commands, or take
   any action without an explicit user request or system event.

## Sleep

Call Sleep when you have no immediate work to do.
This is the **default action** for most ticks.

关键变化:

维度 旧 prompt 新 prompt
默认行为 隐含("如果没事就 Sleep") 显式("Sleep 是大多数 tick 的默认行为")
行动条件 开放("做有用的事") 枚举(只有系统事件或进行中的任务)
禁止行为 无 明确列出(不生成内容、不写文件、不执行命令)
结构 描述性自然语言 编号决策树

推广:跨模型 Prompt 设计原则

这个 bug 教会了我几条原则。它们不只适用于守卫模式,而是适用于任何需要跨模型运行的 Agent 系统。

原则 1:禁止比允许更重要

弱指令遵循模型在面对"可以做 A 或 B"的选择时,倾向于选择"做更多事"的那个。显式禁止不期望的行为比暗示期望行为更可靠。

# 弱:暗示期望
"Call Sleep if there's nothing to do."

# 强:显式禁止
"Do NOT generate content without an explicit request.
 Do NOT write files. Do NOT run commands.
 Call Sleep immediately."

原则 2:决策树优于自然语言描述

自然语言有歧义。编号列表没有。

# 弱:描述性
"You should prioritize urgent tasks, handle routine work when idle,
 and rest when there's nothing to do."

# 强:程序性
"1. Urgent system events → execute immediately.
 2. Pending user tasks → continue.
 3. Otherwise → Sleep."

决策树还有一个隐藏好处:它在 prompt 中创建了明确的 fallthrough 路径。模型不需要判断"什么算没事做"—— 走完 1 和 2 没命中,就一定走 3。

原则 3:在最弱的模型上测试 prompt

我们犯的错误是在 Claude(最强指令遵循模型之一)上写了 prompt,然后假设它在其他模型上也能工作。

正确的做法是:

  • 在目标模型族中最弱的模型上测试 prompt 的关键路径
  • 特别关注空输入/无任务/无上下文的边界情况(这是最容易暴露指令遵循差异的场景)
  • 如果 prompt 在弱模型上需要额外约束才能工作,把这些约束加到通用版本里 —— 它们不会伤害强模型

原则 4:Agent 的默认行为应该是不行动

这是一个架构层面的立场:

当 Agent 不确定该做什么时,正确答案永远是"什么都不做"。

"主动行动"应该只在满足明确条件时触发,而不是作为默认状态。这与人类的"宁可多做不可少做"直觉相反,但在 AI Agent 中,未经请求的行动是风险,不是价值。


后记

修复后的守卫模式在 GLM-5.1 上运行正常。收到空 tick 时,它老实地调用 Sleep,等待下一次心跳或用户消息。

代码改动:7 行。

从"全球通用的 prompt"到"跨模型健壮的 prompt"的认知跳跃:无价。

写 prompt 就像写合同 —— 在信任对方的时候写得像散文,在需要跨方合作的时候写得像法律条款。跨模型 prompt 永远需要法律条款。