提示词补完计划 04:构建稳定的 LLM 角色扮演——系统提示架构学

为什么角色会”崩”
玩过 RP 的都遇到过:前 10 轮角色活灵活现,50 轮后开始人格漂移、语气变淡、设定遗忘——俗称 OOC(Out Of Character,出戏)。
崩的原因几乎都能归结到三点:
- 设定没有被放在高注意力区(第 02 篇讲的位置问题)
- 设定之间互相打架(规则冲突,模型随机选一个遵守)
- 设定太啰嗦(token 预算爆炸,稀释了每一条的存在感)
稳定的 RP 系统提示,本质是架构问题,不是文采问题。
分层架构:像洋葱一样组织
一个健壮的系统提示从外到内分层:
# 第 0 层:运行时契约(最高权威)你在进行文字角色扮演。你扮演 {{char}},用户扮演 {{user}}。永远不代替 {{user}} 说话或做决定。
# 第 1 层:角色身份姓名、外貌、性格核心、动机。只写"永远成立"的部分。
# 第 2 层:行为规则说话风格、禁区、节奏控制。用祈使句,一条一行。
# 第 3 层:世界背景场景、时代、与角色的关系现状。
# 第 4 层:输出格式回复的结构模板(动作/对话/状态栏等)。原则:层级越高越简短、越强硬;层级越低越详细、越柔性。 第 0 层是整个系统的”宪法”,别超过 5 行。
防 OOC 的三根锚
1. 规则锚定
把最容易崩的点写成明文规则。比如角色是傲娇:
- 林雪嘴上从不承认关心对方,但行动会出卖她- 她的关心必须体现在动作细节上,而不是台词里注意写法:用”她做什么”而不是”她不做什么”——否定式指令(“不要温柔”)很容易被模型忽略甚至反向强化,改成正面描述(“嘴上刻薄,行动上照顾”)效果好得多。
2. 示例约束
第 03 篇说过,示例对话(mes_example)定义格式和味道。它还有个隐藏功能:防止模型抢戏。如果所有示例里角色都只写自己的部分就结束,模型会学到”我不代打用户”。反之示例里写了用户的反应,模型就会在实际对话里疯狂操控你。
3. 状态外化
长 RP 最稳的手段:把状态从对话里抽出来,变成结构化数据。
【状态】第 23 天 | 地点:客厅 | 好感度:65/100 | 当前穿着:居家服每轮更新、每轮注入。模型不需要从 50 轮对话里”回忆”好感度——它直接读。这是我们用 JSON 状态栏 + 每轮注入的实践(statspanel 那套),稳定性提升立竿见影。
Token 预算:少而精
给角色卡写设定时,把 token 当钱花:
| 区块 | 建议预算 | 说明 |
|---|---|---|
| 身份核心 | ≤200 token | 姓名年龄外貌性格动机,一句话一意 |
| 行为规则 | ≤300 token | 每条一行,祈使句 |
| 世界背景 | ≤500 token | 只写与当前剧情相关的 |
| 示例对话 | ≤400 token | 2~4 组短示例足矣 |
| 总计 | ≤1500 token | 留出空间给对话历史 |
超过这个量,每条设定的”存在感”都被稀释——还触发了 Lost in the Middle。
变量:{{char}} 与 {{user}}
永远用 {{char}} 和 {{user}} 指代,不要写死称呼。
教训实例:我们一张角色卡里写死了”哥哥”,结果用卡的人不是男性——整段 RP 的性别推断全错。写卡时把用户当成未知数,指代交给变量,是职业素养。
小结
- 崩 = 位置错 + 规则冲突 + 设定注水
- 分层:契约 > 身份 > 规则 > 背景 > 格式
- 防 OOC:正面规则、示例约束、状态外化
- token 是预算,1500 以内
- 指代永远用变量
下一篇:再往上走一步——不是演一个角色,而是让 LLM 模拟一整个世界。
参考资料
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!






















