写到第五章人物开始串味,先别急着换模型。可以先把它拆成三条可以分别验证的线索:角色卡里到底写清了多少人物信息、每次请求带进去多少旧章节内容、采样参数放出了多少随机性。建议的排查顺序是先改提示词,因为角色卡改动成本低且能长期复用;再验证上下文长度;最后才动温度一类参数。每轮只改一个变量并留档输入输出,否则同时改两处就判断不出是哪一处起了作用。
人物前几章正常、后面跑偏,通常是提示词信息量不足与上下文过长叠加,随机性偏高会放大漂移。可先把角色卡改写为身份、口吻、禁忌、状态四类字段,再按章保存完整输入提示词,用相邻两章并排对比确认起点;随后只调整上下文长度复测同一章,仍不稳再单独调整温度与重复惩罚。全程只动一个变量并记录结果,排查才可复现。不同模型对长上下文的处理差异较大,需结合所用接口的参数说明确认。
把人物设定改写成字段化提示词模板
人物串味常见的一种情况是角色设定写成了散文,模型每章都在重新解释人物。把角色卡拆成固定字段,可以减少它对人物信息的自由发挥。四类字段建议分开写:身份、说话口吻、行为禁忌、当前状态。
role_id: 林晚
identity: |
28 岁,急诊科主治医师,做事快,怕冷场。
voice: |
规则:短句为主,少用形容词;被追问时先反问一句再回答。
示例:“先看片子。” / “你确定?那再说一遍。”
taboo: |
- 不主动示弱
- 不使用网络流行语
- 不称呼对方为“亲爱的”
state: |
章节:第 5 章
已知信息:男主在谎报病情
当前情绪:疲惫,压着火
长度上,identity 建议 1 到 2 行就够,写清职业、年龄区间和核心性格;voice 写 2 到 3 条规则并配 2 到 3 个示例句,示例句往往比形容词更能约束口吻;taboo 列 3 到 5 条,只写真正会破坏人物的行为;state 每开一章更新一次,把本章已知信息和情绪写进去。字段化之后,同一份角色卡可以在不同章节复用,也方便后续做对照时替换。
按章节保存输入提示词,定位串味起点
要确认是不是提示词没写清,第一步是知道从第几章开始跑偏。做法不复杂:每章生成前,把最终发给模型的完整输入原样落盘,生成后把输出另存一份,文件名带上章号。
prompts/ch05.prompt.json
prompts/ch05.output.txt
prompts/ch06.prompt.json
prompts/ch06.output.txt
然后并排对比相邻两章的输入差异:
diff -u prompts/ch04.prompt.json prompts/ch05.prompt.json
重点看三处:角色卡有没有被换成简化版或漏字段;上下文里塞进了多少旧章节;同一人物的称呼在前一章和当前章是否一致。如果第 5 章开始串味,就把第 5 章输出里出戏的那句对话标出来,回溯它在输入里对应的角色卡或上下文段落,范围通常能缩小到具体两章之间。这一步只做定位,先不要顺手改参数。
只改上下文长度,复测同一章
定位到起点后,验证是不是旧内容挤占导致的偏移。对照实验的设计是:固定角色卡、固定用户输入、固定采样参数,只改上下文长度,对同一章重跑。
{
"role_card": "roles/linwan.yaml",
"chapter": 5,
"user_input": "inputs/ch05.txt",
"sampling": { "temperature": 0.8, "top_p": 0.9, "repetition_penalty": 1.05 },
"context": { "mode": "recent_n_chapters", "n": 2 }
}
可以先跑三组:全量历史、只保留最近 2 章、只保留最近 1 章加一段状态摘要。观察指标放在人物口吻与称呼上:同一角色说话长度、句式和用词有没有变;对同一人的称呼有没有突然改口;台词的禁忌有没有被破。如果缩短上下文后口吻明显回稳,说明旧内容对当前章形成了挤压;如果三组输出都差不多,那就更可能是角色卡或采样参数的问题。上下文长度不是越短越好,太短会丢掉必要的人物关系,需要结合你的章节字数确认保留几章。
只改采样参数,看口吻是否回稳
如果缩短上下文也没解决,再排除随机性过高造成的漂移。温度越高、重复惩罚越松,人物越容易在长文里滑向通用语气。可以先从一个保守骨架起步:
{
"temperature": 0.7,
"top_p": 0.9,
"repetition_penalty": 1.05,
"frequency_penalty": 0.0,
"presence_penalty": 0.0
}
每次只改一项,比如 temperature 从 0.8 降到 0.6,或者 repetition_penalty 从 1.0 提到 1.05,其他参数和上下文长度都保持不动。跑同一章、同一段输入,把输出和上一轮并排看,记录口吻是否更接近角色卡里的示例句。不同厂商的参数名和取值范围不一样,temperature 有的按 0 到 1 计,有的按 0 到 2 计,需要按接口文档映射后再动,不要直接把别处的数值抄过来。
把稳定下来的组合写回模板
找到一组口吻回稳的配置后,把它固化下来,下一次开新书直接复用。建议在项目里建一个配置文件,至少记录这些参数项:模型名与版本、上下文模式与保留章数、temperature、top_p、重复惩罚、角色卡文件路径、每章输入文件路径。
model: 你的模型标识
context: { mode: recent_n_chapters, n: 2 }
sampling: { temperature: 0.6, top_p: 0.9, repetition_penalty: 1.05 }
role_card: roles/linwan.yaml
chapter_inputs: prompts/
角色卡字段仍然沿用身份、口吻、禁忌、状态四类。换题材时,identity、voice 和 taboo 通常要重写,因为人物性格和说话方式变了;state 每章都要改;采样参数和上下文模式可以先沿用同一组,再根据新题材的人物密度和对话节奏微调。每换一次模型或接口版本,建议用同一章旧输入复跑一次,确认口吻没有整体漂移,再继续往下写。