bot 没坏。是你的聊天记录在教它。
整段照抄、意象翻来覆去、每条回复同一个开头——三种毛病都被叫「复读」,可病因和治法完全不同。这篇按我们复读诊断器的分诊逻辑展开:12-token 滑窗的实测收据(Grok 4.5 连续三轮 100% 旧文、DeepSeek 单轮 72% 照抄后自愈)、为什么历史污染比一切参数都要命(纠正指令在我们实验里 9/10 轮无效)、哪些惩罚参数纯属乌龙,以及按实测排序的自救清单。

同一周收到三条抱怨,用的都是同一个词。一个会话把六条之前的整段话原样又贴了一遍;一个在十条回复里写了五次「琥珀色的眼睛」; 还有一个,每条回复都拿「她微微偏过头」开场。三个玩家给出同一个自我诊断:「我的 bot 在复读」。这一个词底下压着三种病,三种治法。
把三种病当一种治,正是标准建议老不管用的原因。「把重复惩罚拉高」只对得上其中一种,还治得很糙;「跟它说别重复」几乎哪种都治不了。 我们照着自家小说评测的测量口径做了个浏览器端的复读诊断器, 这篇就是它的分诊逻辑写成人话:每种病长什么样、什么原因造出什么形状、以及一张按实测排过序的自救清单。
三种病,共用一个名字
逐字照抄是最糙的一层,也是大家说「bot 坏了」时通常指的那种。量它的卡尺:把文本切成每 12 个连续 token 的滑窗(中文一字一个、英文一词一个,标点不进窗), 数一条回复的滑窗有多少在更早的回复里出现过。它还有个「一条消息内部」的形态:诊断器的演示语料里,最后一条回复把「我哪儿也不去。现在不去,以后也不去。」 在同一条消息里说了三遍;更早还有一条,把两条之前的整段话连铁钥匙的细节一起原样搬运。两种都亮同一层灯。
意象固着要安静得多:句子是新的,家具是旧的。同一段演示语料里,「琥珀色的眼睛」出现五次,「檀香混着旧纸的气味」出现五次,没有任何一段被照抄, 可场景读起来像贴了同一张墙纸。这一层最爱冤枉好人,所以有两条防线:角色名字不算数;单个词的高频只报「口头禅观察项」不算病。角色老把「随便」挂嘴边是人设, 每个房间都点着同一盏琥珀色的灯就不是了。
第三种是句式模具化:演示语料六条回复里三条拿同一句开场,句子的起笔聚在同样几个词干上。这层也内置了两条吃过亏才学会的豁免: 对话密集的正常小说天然满屏「她说」「他低声道」,豁免;同一条回复内部的刻意排比是修辞不是病,降级成观察项。
分层听着像较真,其实每层指向的嫌疑人不一样。逐字重合很重、句子形状还算新鲜,问题多半在历史或上下文窗口;开头模具化但照抄很少,是采样被压得太死; 只有意象层亮灯,通常是第一种病的早期软形态,值得盯着,不值得恐慌。
最被低估的病因:环已经住进了你的历史
模型模仿转录的力度,大于服从指令的力度。一个短语或开头在可见历史里出现两三次之后,就成了 few-shot 范例,历史里每多出现一次,下一次的概率就更高。 这一点我们直接测过:坏范例已经躺在历史里的会话,纠正指令 9/10 轮无效;同样的指令放进新开的会话,零残留。你那一条 OOC 注记,在跟模型看得见的五个范例竞争。范例赢。
同一机制还有个慢性变体:上下文自灌。长聊天会让卡面、场景、你自己写的东西被模型的旧回复一点点换掉,直到窗口里大半是自我回声。 我们的 20 轮续写评测复刻的正是这个演化过程,归档里所有逐字崩溃都发生在第 9 轮以后,一次都没提前过。如果你的重复率在聊天后段爬升,那就是这个签名。
还有个饿出来的变体。你这一侧每条只打几个字,模型没有新材料可反应,只能从自己上一条回复里重新推场景,按构造就是回收循环。 各平台社区指南在这条上出奇一致,而它也是整张清单上最便宜的修法:每条两三句,带一个新事实。
轮到模型背锅的时候:20 轮实测的收据
有时候嫌疑人确实是模型家族。同一套续写协议、同一把尺子,结果差得离谱。Grok 4.5 在第 10 到 12 轮连续三轮跨轮重复率 100%——三轮没写出一个新句子——第 13 轮回落到 68.4%。DeepSeek v4 flash 在 19 个测量轮里 18 轮保持 0%,只在第 14 轮失足一次:开头整抄了第 13 轮的三段(重合 72%),下一轮完全恢复。 失足谁都会,差别在自我纠正还是滚进环里。代际也要命:Kimi K2.6 中途卡死在 97.6% 旧文,后继的 K3 跑同一协议峰值只有 6.8%。
换模型之前先看两条诚实注记。这个评测跑的是小说续写协议、没挂任何惩罚参数,数字当倾向性证据看,不是对你具体配置的判决。 另外不是所有失效都叫复读:同一评测里 Gemini 的典型崩法是剧情回卷,故事倒回去重跑,逐字照抄反而很少,完全是另一种病。 没测过的家族,诊断器里就写「没测过」,不编数字凑数。
参数体检,把玄学撇掉
惩罚滑条是这个领域被吹得最狠的修法,而各家的真实参数面比传说古怪得多。Claude 没有任何形式的重复惩罚:Messages API 压根没定义这个参数,前端给 Claude 连接显示的滑条,值是被静默丢弃的。 它的温度上限还是 1.0,别家预设里写的 1.3 搬过去就不是一个意思。OpenAI 风格的 API 上,官方文档给惩罚系数的合理区间是约 0.1 到 1: 拉到 2 也合法,但按文档自己的话说,质量会明显劣化。
温度的民间传说也常常是反的。DeepSeek 官方文档按用途建议 1.3(通用对话)到 1.5(创意写作);「求稳」压到 0.6,等于进了深度确定性区间,惯用措辞按构造必然重现。Google 对 Gemini 3 的口径是保持默认温度 1.0 别动。再加上那个经典乌龙:重复惩罚 1.3 往上,模型开始躲避真正需要的词,名字和代词都躲,文字劣化,环却常常还在,模型只是在惩罚还允许的几种说法之间打摆。
本地后端是采样手术真能治病的唯一一族。DRY(multiplier 0.8 / base 1.75 / allowed length 2)直接打逐字序列,是社区首选的抗环采样器; 通行建议是把经典重复惩罚留在 1.0 到 1.1,活交给 DRY 干。诊断器的参数体检给每个参考区间都标了出身:官方文档、有出处的社区共识、我们自己的归档实测, 或者老实承认的推测。没有出身的推荐档,只是一种气氛。
自救清单的顺序,以及为什么「重摇」不排第一
顺序比旋钮重要。第一步,把环从历史里做掉:编辑或删除带着重复段落的回复,最重的几条重 roll,让范例从上下文里消失;按前面 9/10 的实验差距,这一步压过清单上其余全部。第二步,嫌逐条改麻烦就回溯:分支回最后一条干净消息继续,丢的是几轮,不是整段关系。第三步,给窗口换血: 长会话带摘要重开,回复喂真材料别只打「嗯」。第四步,这时候才轮到参数,一次一个,改在家族文档区间内。第五步,深聊天撞上有实测复读记录的家族, 换模型是正当修法,不丢人。指令排最后是故意的:OOC 注记零成本、边际上偶尔有用,但只要环还在历史里,它就输给范例。
这也解释了清单上那件缺席的事。对最新一条回复按重摇,等于在同一间被污染的教室里重新抽签——教环的范例全在上面那些消息里躺着,骰子落地时它们一个都没走。 重摇在这张清单上只有一种正当身份:当手术刀用,去重 roll 更早那几条带病的回复,把范例清出去。当老虎机拉杆用,只是花钱把上下文已经回答过的问题再问一遍。
拿你自己的聊天记录跑一遍
复读诊断器吃手贴的聊天记录或 .jsonl 导出,三层全跑,每个数字背后的原文段落都亮出来; 然后按你这段聊天的形状给七个根因排序,再拿你的采样参数对着这个家族的真实参数面体检,每条结论都带证据标签。全程在你的浏览器里跑,什么都不上传。 提醒一句它的脾气:没有任何指标过线时,它会直说没抓到强信号,然后闭嘴。毕竟一个永远能查出病的诊断器,和星座运势机是一路货。 要是它告诉你聊天没毛病、只是 30 轮之后开头有点趋同,那不是 bug。那就是诊断结果。
常见问题
AI 角色一直重复同样的话,是模型坏了吗?
多半不是。最常见的原因是复读已经躺在你的可见聊天记录里:一个短语出现两三次之后,就成了模型主动模仿的 few-shot 范例。我们实验过——坏范例留在历史里时,纠正指令 9/10 轮无效;新开会话零残留。先清历史,再考虑参数。
调高重复惩罚(repetition penalty)能治复读吗?
远没有传说中管用。Claude 压根没有这个参数,前端界面若给 Claude 连接显示了滑条,那个值会被静默丢弃。OpenAI 官方文档给的合理区间是 0.1 到 1;拉到 1.3 以上是经典乌龙——模型开始躲避名字和代词,文字劣化,环常常照样在。本地后端更推荐 DRY(multiplier 0.8 / base 1.75 / allowed length 2),它直接打逐字序列。
为什么聊得越久越容易复读?
上下文被灌满了。长聊天会让卡面、场景这些新鲜材料被模型自己的旧回复逐渐顶掉,窗口里自我回声越浓,复读引力越强。我们 20 轮续写评测里,归档中所有逐字崩溃都发生在第 9 轮以后——正是窗口挤满模型旧输出的阶段。带摘要重开新会话,能把故事带走、把回声留下。
现在正在复读,最快的止损动作是什么?
把带着重复段落的那几条回复改掉或删掉(最重的几条重 roll),或者回溯到最后一条干净消息重新开线,然后再继续聊。这一步压过一切调参:环还在历史里时,纠正指令在我们实验里 9/10 轮输给范例。历史干净之后,参数一次只动一个。