你写好了 system prompt,第一轮模型语气精准——简短、第二人称、没有营销废话。三轮之后它又开始写”在当今快速变化的数字化时代”。到第十轮,它已经擅自加上了 bullet 标题、emoji,整体调子变成了企业博客的官腔。Prompt 没变,模型没变。变的是你的风格指令相对于会话里其他内容的”有效权重”。
最快修法: 把风格块从对话消息里挪出来,放到模型每轮都会重新读到的地方(ChatGPT 的 Custom Instructions 或 Project、Claude 的 Project,或 .cursor/rules/*.mdc),并把每个软形容词改写成模型能逐条核对的可数规则。风格漂移几乎都是”软约束 vs 硬约束”的问题:你告诉模型你想要”什么感觉”,但没给它”必须满足什么规则”。
本文讲清楚漂移的原因,以及怎么把软风格描述翻译成模型可以自检的可测约束。
常见原因
1. 用形容词描述风格,没给规则
“punchy”、“专业”、“温暖”、“简洁”这些词对应不到具体行为。模型把它们解析成训练分布里带该标签的文本的平均态——也就是你最不想要的企业博客口吻。
如何判断:你的风格指令里 0 个数字、0 个禁用词、0 条结构规则,全是形容词。
2. 早期风格示例被挤出”有效上下文”
长会话里,模型对最近的 token 注意力最强。即便窗口本身很大(截至 2026 年 6 月,Claude Opus 4.7、Sonnet 4.6 和 Gemini 3.1 Pro 都是 1M token;ChatGPT Plus 应用内大约只能吃进 320 页),早期那条指令丢的是”注意力权重”,不一定是真的出了窗口。如果风格锚在 turn 1 第一段,而你现在已经到 turn 25,模型就又靠回默认。
如何判断:漂移和轮次强相关。前 3 轮没事,第 8 轮之后开始走样。
3. 软提示和内容争优先级
如果你最近一条 user message 里塞了一大段技术说明,末尾加一句”保持口语化”,模型把技术段落当成主导框架,“口语化”只是个提示。提示打不过体量。
如何判断:内容多 + 风格指令短时漂移最严重。
4. 根本不是漂移,是采样方差
高 temperature 下,同一 prompt 不同 run 风格本来就不一样。你看到的不是漂移而是方差,但修法一样:收紧约束。(注意:GPT-5.x 的推理模型根本不让你设 temperature——见 Step 5——所以那里的方差来自推理过程,不是温度旋钮。)
如何判断:在全新会话里跑同一 prompt 多次,风格仍然每次不同。
5. 模型快照中途换了
某些平台会悄悄轮换模型版本。你为上周快照调好的语气在新快照上失效。比如 ChatGPT 在 2026 年 4 月 23 日前后把默认模型切到 GPT-5.5,按旧默认调的语气一夜之间就变了。
如何判断:漂移和日期相关,和轮次、prompt 内容无关。
先对号入座:你是哪一种
| 症状 | 最可能的原因 | 看哪步 |
|---|---|---|
| 第一轮就不对,且每次都不对 | 用形容词没给规则(原因 1) | Step 1 + Step 2 |
| 前几轮好,约第 8 轮后走样 | 锚丢了注意力权重(原因 2) | Step 3 |
| 只在内容多的轮次出错 | 软提示被压过(原因 3) | Step 1 + Step 4 |
| 每次全新 run 都不一样 | 采样 / 推理方差(原因 4) | Step 5 |
| 在某个日期突然变了 | 模型快照轮换(原因 5) | Step 5 |
动手前先确认
- 保存一份”风格正确”和一份”风格漂了”的输出,方便对照差异。
- 记下模型名、用的是哪个平台或 API,以及(如适用)temperature 或 reasoning effort。
- 在新对话里跑同一 prompt,区分漂移和采样方差。
- 看平台 changelog 最近一周有没有模型快照更新(OpenAI 的在
platform.openai.com/docs/changelog)。 - 确认 system prompt 或 project instructions 真的加载了——有些 UI 会悄悄截断,而且每个 Custom Instructions 字段大约只有 1,500 字符上限。
需要收集的信息
- 完整风格指令原文,包括它在 prompt 里的位置。
- 第一次漂移出现在第几轮。
- 模型与快照,加上 temperature/top-p(非推理)或 reasoning effort(GPT-5.x 推理模型)。
- “好”和”差”的两段输出并排。
- 漂移发生时整个对话的总 token 数。
最短修复路径
前 3 步通常解决大多数情况。
Step 1:把形容词换成可测规则
软描述换成可数约束:
| 形容词 | 可测规则 |
|---|---|
| ”punchy" | "每句不超 15 字。任意一句不能以’在’开头。" |
| "专业" | "无感叹号。无第二人称。无口语缩略。" |
| "温暖" | "每段至少出现一次’我们’。标题不加粗。" |
| "简洁" | "全文不超 120 字。不超过 4 句。” |
模型判断”这句是不是 15 字以内”远比判断”这句是不是 punchy”靠谱。
Step 2:给一个显式风格锚
贴 2-3 句目标语气示例,明确标注:
风格示例(请完全按这段语气写):
"先去 Dashboard 拿环境变量。粘到 .env.local。
重启 dev 服务。如果还报错,说明你拿错 key 了。"
一个具体锚比三页形容词管用。
Step 3:把风格块放到模型每轮都会重读的地方
在第 6、12、18 轮重新粘风格块确实有效,但是体力活。真正长久的修法是放到平台每轮都会喂给模型的位置:
- ChatGPT:Settings > Personalization > Custom Instructions(每个新对话都会加载,两个字段各约 1,500 字符);或建一个 Project,把规则写进项目指令,对这个工作区里每个对话都生效。
- Claude:建一个 Project,把风格规则写进项目的自定义指令(截至 2026 年 6 月约 8,000 字符)。用 Claude Code 的话,放进
CLAUDE.md(或拆分到.claude/rules/下)。 - Cursor:放进
.cursor/rules/*.mdc(当前推荐位置;老的单个.cursorrules文件仍可用但已是 legacy)。仓库根目录放AGENTS.md是跨工具的兜底,Cursor、Codex 等都会读。
持久化的风格块能顶住上下文窗口压力,一次性的对话消息做不到。
Step 4:加自检尾巴
每个 prompt 后面加:
写完后用以下规则核对:
- 规则 1:每句不超过 15 字
- 规则 2:无感叹号
- 规则 3:每句以动词开头
有违反的句子重写后再核一遍。
给具体清单时模型自审能力还不错。规则要写成二元(是/否),别写成主观判断。
Step 5:钉死版本,并选对方差旋钮
锁的是快照,不只是好记的名字。“默认”会偷偷变,带日期的快照不会。
- 非推理模型(以及 Claude / Gemini 的对话模型):快照和 temperature 都钉死。如果你是在 temperature 0.3 上调出了正确语气,就锁 0.3。用显式选模型的 UI 或 API,别用”默认”。
- GPT-5.x 推理模型:截至 2026 年 6 月,这些模型会拒绝
temperature和top_p——API 会返回 “unsupported parameter” 错误。这里的旋钮是reasoning_effort(GPT-5.5 档位:xhigh、high、medium、low、none)。reasoning effort 越低风格越稳;如果你确实需要temperature,必须以reasoning_effort: none运行。详见官方 Using GPT-5.5 指南。
所以”钉死 temperature”对非推理运行是对的,但在 GPT-5.x 推理模型上根本设不了——那里改钉 reasoning effort。
Step 6:格式漂移——强制结构,别只是描述
如果漂的是结构(bullet vs prose、JSON vs Markdown),别用散文描述形状然后碰运气,要强制。
- 聊天 UI 里:给一个精确模板加一个填好的示例:「只返回这个形状,别的都不要:
{"summary": "...", "next_step": "..."}。」 - API 上:用 OpenAI 的 Structured Outputs——把
response_format设成带strict: true的json_schema,模型就无法返回违反 schema 的形状。截至 2026 年 6 月,OpenAI 建议用了它就不要再在 prompt 里复述 schema;裸的json_object(JSON Mode)已是 legacy,只保证是合法 JSON,不保证你要的字段。详见 Structured Outputs 指南。Claude 和 Gemini 也有等价的工具/schema 受限输出模式。
结构可以强制,语感不行。
怎么确认已经修好
- 三次全新会话里跑同一 prompt,每次输出都通过你的全部规则。
- 一个 10 轮会话里,第 1、5、10 轮输出都通过规则,没退化。
- 让没参与的人读一段输出,描述语气;描述要和你的目标吻合。
- 把旧”漂了”的输出和新输出 diff,原本失败的规则现在过了。
如果还是没修好
- 缩到只有一条规则的 prompt——如果连一条都钉不住,问题在模型/平台,不在 prompt。
- 从 chat UI 切到 API;UI 有自己的 system prompt 会盖掉你的。
- 换一个模型族——不同模型遵守约束的可靠度差很多。
- 如果要的是个人深度声音(你的写作而不是泛风格),用 5-shot 你自己的真实写作做示例,比规则更准。
常见问题
为什么 temperature 设 0 也压不住漂移? 因为大多数风格漂移不是采样方差,而是注意力权重。temperature 0 时,对固定输入模型是确定性的,但会话越来越长,输入本身在变,输出照样漂。temperature 只控制同一输入下不同 run 的随机性。而且在 GPT-5.x 推理模型上你根本设不了 temperature,要改降 reasoning effort。
我 ChatGPT 的 Custom Instructions 设了,语气还是漂,为什么? 两个常见原因。一是每个 Custom Instructions 字段上限约 1,500 字符,太长的风格块会被悄悄截断——只留真正关键的二元规则。二是 Custom Instructions 对新对话生效,但很长的旧线程仍可能压过它;重要工作建议建 Project,把规则写进项目指令。
把 JSON schema 写进 prompt 够不够?
聊天 UI 里这是你能用的最好办法,那就给精确模板加一个填好的示例。API 上它不是对的工具——用 Structured Outputs(带 strict: true 的 json_schema 放进 response_format),真正约束输出。单纯说”用 JSON 回”(JSON Mode)已是 legacy,只保证语法不保证字段。
我什么都没动,语气却变了,发生了什么? 多半是模型快照在你脚下被轮换了。ChatGPT 在 2026 年 4 月 23 日前后把默认切到了 GPT-5.5。如果漂移跟着日期走而不是跟着轮次,就用 API 或选模型 UI 钉死带日期的快照,并在它上面重调风格块。
该用规则还是用示例? 两者各有分工。规则适合可测约束(长度、禁用词、结构)。示例适合难命名的个人语气——3-5 段真实写作的短样本胜过任何形容词。示例要短;长锚会被平均到泛化的均值上。
预防建议
- 维护一份短的”风格块”,放进平台级配置(Custom Instructions / Project /
.cursor/rules),别塞进单条消息。 - 重复性工作绝不靠”message 里塞一句风格提示”。
- 风格锚保持短:最多 2-3 句。长锚会被平均。
- 每周审一次漂移:跑一个固定 prompt,和上周对比;并看平台 changelog 有没有换快照。
- 品牌语气把”快照 + 方差旋钮(非推理用 temperature,GPT-5.x 用 reasoning effort)+ 风格块”打包,作为一个完整配置。
- 格式重要时强制结构(Structured Outputs / schema),别用”散文 + 格式规则”。
相关阅读
标签: #排查 #Prompt #Prompt 质量 #风格漂移