AI 输出风格漂移——怎么把风格钉死

system prompt 没动、模型没换,几轮之后风格又变了。把形容词式的风格描述翻成模型能逐条自检的可测规则,并钉死版本与方差旋钮。

你写好了 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 月,这些模型会拒绝 temperaturetop_p——API 会返回 “unsupported parameter” 错误。这里的旋钮是 reasoning_effort(GPT-5.5 档位:xhighhighmediumlownone)。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: truejson_schema,模型就无法返回违反 schema 的形状。截至 2026 年 6 月,OpenAI 建议用了它就不要再在 prompt 里复述 schema;裸的 json_object(JSON Mode)已是 legacy,只保证是合法 JSON,不保证你要的字段。详见 Structured Outputs 指南。Claude 和 Gemini 也有等价的工具/schema 受限输出模式。

结构可以强制,语感不行。

怎么确认已经修好

  • 三次全新会话里跑同一 prompt,每次输出都通过你的全部规则。
  • 一个 10 轮会话里,第 1、5、10 轮输出都通过规则,没退化。
  • 让没参与的人读一段输出,描述语气;描述要和你的目标吻合。
  • 把旧”漂了”的输出和新输出 diff,原本失败的规则现在过了。

如果还是没修好

  1. 缩到只有一条规则的 prompt——如果连一条都钉不住,问题在模型/平台,不在 prompt。
  2. 从 chat UI 切到 API;UI 有自己的 system prompt 会盖掉你的。
  3. 换一个模型族——不同模型遵守约束的可靠度差很多。
  4. 如果要的是个人深度声音(你的写作而不是泛风格),用 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: truejson_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 质量 #风格漂移