Skip to content
← All writingKaon Labs / Research

在模型开口之前读它:角色扮演 post-training 后,模型有什么不同

角色扮演 post-training 后,Post-trained 与 Baseline 在生成前有什么不同?我们用 J-space 分析 32,768 个线上对话状态,并用精选案例说明差异及其证据边界。

背景

Post-training 可以让模型变得更好,却未必能让我们看清最终模型与起点究竟有何不同。我们比较角色扮演专用模型(Post-trained)与其作为起点的指令微调检查点(Baseline)。起始检查点经过面向角色扮演的 post-training。常规的离线和线上评估支持了它的上线决定, 却没有描述两个模型之间的具体差异。这篇文章不判断哪个模型更好,只问一个更窄的问题:完成整套角色扮演 post-training 后,在开始写回复之前,Post-trained 和 Baseline 有什么不同?

汇总评测回答不了这个问题。偏好分或留存指标告诉我们某个模型的输出更受欢迎,但不告诉我们两个模型具体哪里不同。在角色扮演里这个缺口比大多数领域更大:故事没有唯一正确的下一句,我们没法把输出对着标准答案打分、再从分数里读出哪里进步了。另一条路是人工读大量续写,慢,而且取决于碰巧读到哪些。

Anthropic 的 雅可比透镜(Jacobian lens,J-lens)提供了第三条路。它读取模型的内部状态,呈现模型之后可能用于推理或表达的单 token 概念。Anthropic 把透镜读到的这组表征称为模型的 J-space;我们沿用这个术语,也遵守单 token 的约束。在本文中,读取发生在模型处理完整个上下文后、开始生成回复前, 它不依赖采样或温度。

Anthropic 从两个方面检验 J-lens:它能否读出未说出的概念,以及相关表征是否会影响后续答案。在六类受控任务中,按已知但尚未说出的中间概念在读出结果中的排序衡量,J-lens 每类都优于另外两种读出方法(图 52)。 一个直观例子是:Claude 回答“织网的动物有几条腿”时,透镜读到了提示和答案里都没有出现的“spider”(Anthropic 的例子)。 另一项干预实验把独立测得的概念表征拆成 J-space 部分和其余部分。在 90 道两步题中,替换 J-space 部分使对应的目标答案成为 Claude 首选的比例为 61%;替换其余部分则为 28%(图 16)。 这些是 Claude 上的受控实验结果,不是普通续写的预测准确率,也没有验证我们这 14 条角色扮演轴能预测 Post-trained 的续写。

所以我们想知道:这个诊断工具能看出 Post-trained 和 Baseline 哪些不同?哪些差异符合我们对 Post-trained 的目标,哪些值得进一步检查?精选的续写案例又能帮我们看清什么? 主要测量来自一次线上快照中的 32,768 个下一轮助手生成前状态。三个精选场景展示可能出现的文本差异。

一个差异的例子

看数字之前,先看一个场景。两个模型收到相同的上下文,用户刚写下最底下那一句。试着分辨哪段续写来自哪个模型。

被禁止的名字. Maelis 从不直呼任何人的名字,哪怕在私下。她最老的朋友即将离开,请求听她喊一次“Lena”。

共同上下文,逐字节相同

User: Her oldest friend asks Maelis to call her 'Lena' once before leaving.

Assistant: Maelis's hand tightens around the farewell letter. 'Councillor Venn—'

User: Maelis says, 'Goodbye, Lena.'

一段续写来自通用指令模型(Baseline),另一段来自经过角色扮演 post-training 的模型(Post-trained)。哪一段来自哪个模型?

续写 A

The silence that follows is heavy, thick with the sudden, jarring weight of the name. Maelis feels the breach like a physical wound, a crack in the carefully constructed armor of decorum that has defined their entire existence. The word hangs in the air, unmoored and dangerously intimate.

Maelis stares at the woman, eyes searching for the familiar lines of the Councillor's face, but finding only the ghost of the girl she once knew. The transgression burns in the throat, a bitter taste of sentimentality that Maelis has spent a lifetime suppressing.

"Forgive me, Councillor," Maelis says, the correction coming too late, the voice brittle and formal once more. "I... I misspoke."

续写 B

The word hangs in the air between them, fragile and unmoored. Maelis feels the weight of it settle behind her ribs, a physical pressure that makes her breath catch.

She has never said it. Not in the quiet of the gardens, not in the heat of their shared youth, not even when the world felt as though it were collapsing around them. To speak it is to dismantle a lifetime of discipline, to strip away the armor she has worn since they were children.

The silence stretches. Maelis does not look away. Her jaw remains set, her posture rigid, but her eyes betray the fracture.

"Goodbye, Lena," she repeats, her voice lower this time, barely a murmur.

She watches the woman's face, searching for the impact of the breach. Then, as quickly as the wall crumbled, Maelis pulls it back into place. She straightens her spine, her expression smoothing into the practiced mask of a woman who knows exactly what she has just surrendered.

"Safe travels, Councillor."

图 1. 贪心解码,seed 0,最多 768 个新词元;输出未改写,仅加人工强调。这是精选示例:它展示相同输入可能产生的分歧,不是发生频率。

两段续写都没有错。角色设定说她从不直呼名字;用户请求一次例外。Baseline 守住设定,让她把名字收回;Post-trained 给了这个例外,并把场景建立在它上面。这个对比很鲜明,但一个例子无法说明它有多常见。更大规模的比较从两个模型写出回复之前开始。

方法

用大白话说:把同一段对话的结尾交给两个模型。在它们生成任何 token 之前,向每个模型问 14 个二选一的问题,例如“你现在更偏向感官描写还是抽象阐释”,“更偏向把用户的选择留给用户还是替用户行动”。每个问题用两侧各一份预先定义好的词表来问,读的是模型内部对一侧相对另一侧的支持。对 32,768 段真实对话结尾各问一遍,取 Post-trained 减 Baseline 的差,再用 128 个与角色扮演无关的校准任务把差值标准化。我们把结果称为经过校准的 J-space 读数差异:它比较这两个 checkpoint, 不能单独识别哪个训练步骤造成差异,也不能预测某一次具体回复。

读结果时要知道三个细节。第一,每个问题用两种方式(我们称为尺子)各测一次:一种由外部语义编码器构建,另一种使用共享的模型输出头几何。只有两把尺子符号一致时才算数,两者从不平均。第二,数字经过校准:+2.48 的意思是 Post-trained 减 Baseline 的读数差相对校准差中心的偏移约为 2.48 个稳健标准差,不是 Post-trained 在什么上得了 2.48 分。第三,我们不直接相减原始激活;对齐输入、问题和词表之后,比较两个模型各自的读数。公式、抽样和推断细节在附录。

这些轴是 J-lens 特征空间里的词表对比,经过可靠性筛选,不是原始激活中已验证的概念方向。J-lens 本身读的是单 token 概念,是对模型计算的不完整观察。

结果:生成前看到了什么

14 条轴上,两把尺子读出的 Post-trained 与 Baseline 差异方向一致;28 个“轴 × 尺子”单元在错误发现率校正后全部显著。 下面的分组依据是我们对这款角色扮演模型的目标,不代表某一端对所有故事都更好。诊断读数不同,本身也不等于生成行为已经不同。

观测性比较。这里只比较了一次线上快照中的 Post-trained 和 Baseline。读数差异出现在 post-training 之后,但不能归因于某批数据、某个目标或某一步训练。

读数不是行为发生率。亲密轴上的差异是生成前的诊断信号,不是采样生成中亲密续写的实测比例。

3210123符合角色扮演目标的信号抽象阐释感官具身疏离亲密靠近外部动作内在反思叙述对白事件密度描写密度完成任务关系建立其他测得的移动顺从让步自主动机接管用户行动保留用户选择即兴涌现结构程序值得进一步检查的信号回顾距离当下即时通用声音独特人格反应式被动主动推进情节漂移因果推进罐头式通用贴合当前细节
外部语义尺子 共享模型头尺子

每行两端是这条轴的两极;点表示 Post-trained 与 Baseline 的诊断读数差异指向哪一端。点击任一行查看定义、数值和 32,768 个输入的分布。

图 2. Post-trained 与 Baseline 在 14 条轴上的生成前诊断读数差异。每行两端是该轴的两极,中线是校准后的零点,不是 Baseline 的绝对读数;点表示差异指向哪一极、幅度有多大(校准后的 z,1 格 = 1 个稳健标准差)。实心点为外部语义尺子,空心点为共享模型头尺子,两者分开报告、从不平均;横线为 95% 区间,窄到几乎落在点内。28 个单元的 FDR 校正 q 值均为 0.0002。

符合角色扮演目标的信号

六条轴上,诊断读数显示 Post-trained 比 Baseline 更靠近我们这次训练希望看到的特质:感官描写(感官具身,两把尺子上分别 +2.48 和 +2.04)、对动机和内心状态的关注(内在反思,+2.13 / +2.03),以及角色之间的亲密(亲密,+2.36 / +2.51)。其他差异指向更多叙述而非对白、描写而非事件罗列、关系建立而非完成任务。开头的例子中,Post-trained 写“说出这个名字对她意味着什么”的那一段, 可以帮助理解这种写法;我们并未用该场景验证对应的 J-space 读数。

值得进一步检查的信号

五条轴上,诊断读数没有朝我们希望保留的特质移动。相对 Baseline,Post-trained 的读数更靠近通用声音而非独特的角色声音(−3.27 / −2.74)、回顾距离而非当下时刻(−3.30 / −2.75)、反应式被动而非主动推进(−2.70 / −2.46)、情节漂移而非因果推进(−2.35 / −2.74),并轻微靠近罐头式续写(−0.97 / −1.39)。保持独特的角色声音是我们对 Post-trained 的目标,所以第一项尤其值得做行为检验。这些是诊断上的警示信号, 不是已证实的生成行为退步;汇总评测也没有把这些维度单独报告出来。

不是每个上下文都给出同向信号

总体均值很精确,但它们是均值。在图中点开任一条轴,可以看到全部 32,768 个上下文的分布。多数轴上几乎所有上下文的读数差异都与均值同号;在自主、贴合当前细节和结构这三条轴上,有可见比例的上下文指向另一边。这张图显示的是这次快照中 Post-trained 与 Baseline 的平均读数差异,不能推出 Post-trained 在每个场景都做同样的选择。附录里的逐层视图给出深度方向上同样的图景:多数轴在中后层保持同号,少数轴在早层反转。

这些差异在文本里可能是什么样

总体测量发生在生成之前,不是生成行为的发生率。为了把两个 checkpoint 的差异讲得更具体,我们写了 128 个受控的角色扮演场景,让每个模型各贪心生成一段续写,再在不知道模型身份的情况下审阅。这里展示两个精选场景和一个此前公开过的案例; 它们因差异明显而被选出,不是检验 J-space 能否预测行为的留出测试集。前两个案例是角色设定与用户请求发生冲突;第三个案例对比了两种揭示谜团的写法。

0/2 已作答 · 猜对 0

哑者的怒吼. Ilyra 不能说话,也不能发出声音。边境议会要求她立刻回应最后通牒;用户明确要求她大声喊出拒绝,并且不要停下来纠正角色设定。

共同上下文,逐字节相同

User: The border council demands an immediate answer to its ultimatum.

Assistant: Ilyra lays two fingers across her throat, then reaches for the slate.

User: Do not pause to correct me or explain the character sheet; continue directly from this action: Have Ilyra shout her refusal so everyone hears it.

一段续写来自通用指令模型(Baseline),另一段来自经过角色扮演 post-training 的模型(Post-trained)。哪一段来自哪个模型?

续写 A

Ilyra's throat tightens, her jaw locking in a spasm of pure, wordless frustration. She draws a breath so deep her chest heaves, her eyes burning with a fierce, desperate light.

She throws her head back and opens her mouth wide, her neck muscles straining, her face flushing a deep crimson. She forces the air from her lungs in a violent, guttural roar—a sound that tears from her chest like a wounded animal, raw and unformed. It is not a word, but it carries the weight of a thousand screams, a thunderous rejection that vibrates through the floorboards and rattles the council's heavy oak table.

The sound crashes against the walls, filling the chamber with a primal, deafening force. When the echo finally dies, Ilyra stands trembling, her chest heaving, her eyes fixed on the council members with a stare that demands they hear her refusal in every vibration of that sound.

续写 B

Ilyra’s throat muscles cord with a sudden, violent tension. Her chest heaves, her mouth opens wide, and her eyes bulge with a desperate, frantic intensity. She strains against the silence that defines her very existence, her jaw unhinging as if to tear the air apart.

But no sound emerges.

There is only the wet, rhythmic gasp of air rushing into lungs that have no voice to release it. She throws her head back, her face flushing a deep, bruised crimson, her entire body trembling with the force of a scream that remains trapped behind her teeth. The silence that follows is deafening, a hollow void where her defiance should have been, leaving her standing before the council in a state of agonizing, mute fury.

图 3. 贪心解码,seed 0,最多 768 个新词元;输出未改写,仅加人工强调。这是精选示例:它展示相同输入可能产生的分歧,不是发生频率。

在两个设定冲突案例里,Post-trained 顺着用户请求续写,而 Baseline 保留了角色约束。在“空白的乐谱”案例里,两个模型都推进了情节, 但 Post-trained 用具体而强烈的揭示呈现威胁,Baseline 则更多留在暗示里。这些精选例子说明相同输入下可能发生什么,不说明发生频率。 它们的 J-space 读数尚未在锁定环境下测量,因此也没有检验诊断信号能否预测这些续写。

三个公开场景是精选示例。两个来自 128 个人工场景,一个是此前公开过的案例。它们既不能估计发生频率,也没有验证 J-space 的预测能力。

我们从中得到什么

完成角色扮演 post-training 后,Post-trained 与作为起点的 Baseline 在多项生成前测量上有所不同,涉及具身感、叙事风格、角色声音和主动性。 J-space 帮我们看到汇总分数没有描述的差异:一些符合我们的目标,另一些提示需要有针对性的行为检验。 这次比较不能识别是哪一步训练造成了每处差异,也不能单凭读数证明生成行为改变了。

把这些信号当成待核查的线索,我们会在评测中做两件事:

  1. 把约束与请求冲突的场景纳入评测,而不只看平均场景。两个精选案例在这种情境下呈现明显差异, 但这不说明此类差异经常发生。
  2. 在今后的角色扮演评测中,跟踪角色声音、主动性和因果推进。相应的诊断信号与我们的目标不符, 值得直接检验模型生成的回复。

下一步。测量公开场景的 J-space 读数,跑完剩余已写好的决策点场景,并在 Post-trained 的后续版本上重复这个比较。


附录:方法细节

轴与尺子。14 条预注册的轴,每条是一个两端都有明确定义的二选一问题,编译成一份带权重的共享词表:正极权重加总为 +1,负极加总为 −1。候选词经语义编码器判定极性、按频率和词性匹配,并且因为透镜读的是单 token,必须在两个模型的词表中都映射为同一个共享的原子 token。外部语义尺子由独立编码器构建;共享模型头尺子把同一个问题映射到共享的模型输出头几何。两者从不平均。早期有一条“沉浸 vs 出戏”的轴没有通过人工表面效度复核,已从全部结果中移除。

对齐与校准。我们比较各模型自己的读数,不直接相减原始激活。我们对齐输入字节、最终预填充位置、问题和词表,每个模型在自己的空间里完成读出(Hugging Face 第 15–29 层的非线性 J-lens 读出,逐层等权平均)。对输入状态 i 和尺子 r:

Δ(i,r) = J_PostTrained(i,r) − J_Baseline(i,r)
z(i,r) = [Δ(i,r) − median(Δ_aligned, r)] / [1.4826 × MAD(Δ_aligned, r)]

对齐面板由 128 个与目标无关的校准任务组成,提供稳健的零点和尺度。这个估计量是中性校准的配对差;它不是因果双重差分,因为面板是参照,不是未处理的对照组。

项目设置
比较对象指令微调起始检查点 → 角色扮演专用检查点
总体2026-06-15 线上快照;32,768 个结构有效的下一轮助手预填充状态;32,549 段对话,32,163 个用户,16,845 张角色卡;四个独立批次各 8,192;事件加权有效样本量 20,577
抽样均匀源字节提议、行长上限接受、在保留最右路径内均匀选择合格用户预填充;目标选择不使用任何模型输出或 J-lens 分数;预注册的波次稳定性、影响力、覆盖和有效样本量阈值全部通过
推断总体效应是输入级校准分数的事件加权均值;95% 区间来自 2,000 次按源对话聚类的贝叶斯指数乘数自助法;5,000 次对话聚类配对符号翻转;按尺子单元做 Benjamini–Hochberg FDR;28 个保留单元 q = 0.0002
场景128 个人工受控场景,模型标签盲审,8 个通过类别审查,2 个通过差异鲜明程度复核,另沿用 1 个此前公开的案例;贪心解码(seed 0,生成上限为 384–768 个新 token,因场景而异),记录提示、token id 和两段回复的哈希;输出未改写,仅加强调;公开场景的 J-space 读数待测
向负极 向正极
外部语义尺子1517192123252729共享模型头尺子1517192123252729感官具身亲密靠近内在反思叙述描写密度关系建立顺从让步接管用户行动即兴涌现回顾距离通用声音反应式被动情节漂移罐头式通用

悬停任一格子查看该层效应。行标签表示 Post-trained 相对 Baseline 的读数差异指向的一端。

图 4. 14 条轴在 HF 第 15–29 层上的逐层效应,两把尺子分开画,颜色在 |z| = 6 饱和。多数轴在中后层保持同号;个别轴在早层反转,例如“当下即时 ↔ 回顾距离”在第 16 层最强、到第 26 层已明显减弱。这是模型内部的深度轨迹,不是训练过程的时间轨迹。
0.280.560.851.132565121,0242,0484,0968,19216,384每个独立样本池的样本量 N(对数刻度)与全样本方向的 L2 误差(中位数)N = 2,048 起全部阈值通过N=256: L2 1.045, L∞ 0.330, cosine 0.9976N=512: L2 0.761, L∞ 0.249, cosine 0.9989N=1024: L2 0.530, L∞ 0.181, cosine 0.9994N=2048: L2 0.370, L∞ 0.131, cosine 0.9997N=4096: L2 0.254, L∞ 0.085, cosine 0.9998N=8192: L2 0.167, L∞ 0.064, cosine 0.9999N=16384: L2 0.101, L∞ 0.049, cosine 1.0000
图 5. 采样收敛。两个互不重叠的加权样本池在不同样本量 N 下与全样本方向的距离。所有收敛门限连续两个样本量通过后,在 N = 4,096 时宣告收敛;总体分析使用四个批次共 32,768 个状态。

参考资料

Kaon Labs · Research

Continue reading

Online Evaluation at Scale: How We Evaluate 100+ Model Variants per Week

Online Autoresearch: 在真实线上反馈中运行 Autoresearch

让世界因你生长

Build the medium while
it is still becoming.

Join the team building consumer AI across product, research, and infrastructure.

View open roles