15 KiB
DeepSeek-V2-Lite 路由的消息历史 2×2 因子审计
状态:真实官方 BF16 权重、本机 RTX 5090、layer 0–6 连续 forward。 固定模型 revision:
604d5664dddd88a0433dbae533b7fe9472482de0。 研究单位:上一轮同一批 128 条公开 source prompt 的四种消息历史。 结论身份:消息历史组成敏感性探针,不是能力评测、角色语义、训练分布或线上流量。
1. 为什么上一轮之后还要做这一轮
上一轮已经把相同内容放入三种输入:
RAW → OFFICIAL USER → OFFICIAL USER + Assistant:
它回答了两个问题:
User:前缀会不会改变后续内容 token 的路由?会,而且方向随层与域改变。- 只在未来追加
Assistant:会不会反向改写过去?不会,21,852 / 21,852 个共享前缀 ordered top-6 完全一致。
但真实对话通常不只有一个 user message。目标请求之前还可能有:
- system instruction;
- 一轮或多轮示例;
- assistant 历史;
- EOS 与角色边界。
如果只做“有 system / 无 system”两组,system 的结果还可能取决于它是否直接贴近目标。 如果只做“有示例 / 无示例”两组,也无法知道示例的作用是否依赖 system。
所以本轮使用最小完整设计:
system × one-shot 的 2×2 因子实验。
它能同时计算:
- system 主效应;
- one-shot 主效应;
- 两者是否可以简单相加;
- system 在“直接贴近目标”和“先经过一轮示例”时是否表现相同。
2. 四个条件
固定文本:
SYSTEM
Answer accurately and concisely. 请准确、简洁地回答。
DEMO USER
Reply with OK. 只回复 OK。
DEMO ASSISTANT
OK
目标 user 内容来自四个公开域,每条固定为 23 个 regular-tokenizer tokens。
四个条件全部使用官方 apply_chat_template(..., add_generation_prompt=True):
| 条件 | System | One-shot | 官方消息序列 |
|---|---|---|---|
| S0F0 | 0 | 0 | target user → Assistant: |
| S1F0 | 1 | 0 | system → target user → Assistant: |
| S0F1 | 0 | 1 | demo user → demo assistant + EOS → target user → Assistant: |
| S1F1 | 1 | 1 | system → demo user → demo assistant + EOS → target user → Assistant: |
这里的 S 表示 system factor,F 表示 few-shot factor。
2.1 为什么称为正交长度增量
四格的输入 token 总数:
| 条件 | 输入 tokens | 相对 S0F0 | 每条 source 的固定增量 |
|---|---|---|---|
| S0F0 | 3,898 | — | — |
| S1F0 | 5,946 | +2,048 | +16 system tokens |
| S0F1 | 6,074 | +2,176 | +17 one-shot tokens |
| S1F1 | 8,122 | +4,224 | +16 + 17 tokens |
因此:
S1F0 − S0F0 = S1F1 − S0F1 = 每条 +16 tokens
S0F1 − S0F0 = S1F1 − S1F0 = 每条 +17 tokens
这并没有把“角色、文本、距离和长度”彼此拆开,但它保证 system 与 one-shot 两个处理的 token 增量互不偷换。
3. Cohort 完全复用,而不是重新抽样
选样 salt 继续固定为:
llm-atlas-deepseek-routing-template-control-v1
四域仍为:
| 域 | 来源 | 字段 | 数量 |
|---|---|---|---|
| 英文百科 | WikiText-2 raw validation | text |
32 |
| 中文新闻 | CLUE TNEWS public test | sentence |
32 |
| Python 代码 | OpenAI HumanEval | prompt |
32 |
| 小学数学 | OpenAI GSM8K test | question |
32 |
本轮 128 个 (source ID, content SHA-256) 与上一轮模板探针逐项完全相同。
答案不输入,HumanEval 代码不执行。
这让两个实验可以连续阅读:
上一轮:RAW / USER / GENERATION
本轮:USER 条件内部继续展开 system × one-shot 历史
4. 目标内容如何精确对齐
四个条件的目标 user 前都有同一个字面前缀 User: ,因此没有重新引入 RAW 条件的
首 token BPE 边界差异。
脚本仍不依赖这一经验假设,而是为每个目标 token 记录:
(相对目标内容字符起点, 相对终点, token ID)
只有四个条件都存在的三元组才进入 target_content。
| 条件 | 目标范围 tokens | 四条件精确交集 |
|---|---|---|
| S0F0 | 2,874 | 2,874 |
| S1F0 | 2,874 | 2,874 |
| S0F1 | 2,874 | 2,874 |
| S1F1 | 2,874 | 2,874 |
因此本轮目标内容对照没有丢弃任何一个条件特有的目标 token。
5. 执行账
| 对象 | 数量 |
|---|---|
| source prompts | 128 |
| prompt variants | 512 |
| 输入 tokens | 24,040 |
| 执行层 | layer 0–6 |
| 测量 MoE 层 | layer 1–6 |
| 每 token routed experts | top-6 |
| S0F0 routes | 140,328 |
| S1F0 routes | 214,056 |
| S0F1 routes | 218,664 |
| S1F1 routes | 292,392 |
| 本轮真实 routes | 865,440 |
与前四个真实语料实验合计:
488,880 长度三 cohort
+382,032 RAW / USER / GENERATION
+865,440 system × one-shot
=1,736,352 次真实 top-6 路由
四个条件的同一 source prompt 在同一个 padded batch 中执行;层、checkpoint、dtype、 attention implementation 和 bootstrap source indices 都保持一致。
6. 因子统计到底怎么算
每个 layer × scope × aggregation × domain,先得到四格统计:
m00 = metric(S0F0)
m10 = metric(S1F0)
m01 = metric(S0F1)
m11 = metric(S1F1)
然后定义:
system main effect
= 0.5 × [(m10 − m00) + (m11 − m01)]
few-shot main effect
= 0.5 × [(m01 − m00) + (m11 − m10)]
interaction
= (m11 − m01) − (m10 − m00)
若 interaction 为 0,system 在 F0 和 F1 下的增量相同;若不为 0,两个处理不能简单相加。
6.1 Bootstrap
- 每域 32 条 source prompt;
- 有放回重采样 2,000 次;
- 四格使用完全相同的 source indices;
- 固定 seed
20260729; - 主要结果使用 prompt-balanced 聚合;
- 同时保留 token-weighted;
- 报告 percentile 95% 区间;
- 不做假设检验;
- 不做多重比较校正。
7. 目标内容 CV:四格、主效应与交互
下表均为 target_content / prompt_balanced。
四格顺序是 S0F0 / S1F0 / S0F1 / S1F1。
| 层 | 域 | 四格 CV | System main [95%] | Few-shot main [95%] | Interaction [95%] |
|---|---|---|---|---|---|
| L1 | 英文 | .596 / .810 / .779 / .737 | +.086 [.057,.114] | +.055 [.023,.088] | -.256 [-.300,-.208] |
| L1 | 中文 | .621 / .426 / .621 / .575 | -.121 [-.144,-.090] | +.074 [.046,.099] | +.150 [.100,.192] |
| L1 | 代码 | .882 / .949 / .972 / .972 | +.034 [.017,.049] | +.057 [.034,.079] | -.068 [-.101,-.036] |
| L1 | 数学 | .793 / .937 / .912 / .867 | +.050 [.023,.075] | +.025 [-.009,.057] | -.188 [-.234,-.137] |
| L2 | 英文 | .403 / .339 / .346 / .337 | -.037 [-.049,-.018] | -.029 [-.041,-.012] | +.056 [.023,.080] |
| L2 | 中文 | .353 / .316 / .323 / .319 | -.021 [-.027,-.010] | -.014 [-.023,-.001] | +.034 [.011,.050] |
| L2 | 代码 | .617 / .652 / .658 / .667 | +.022 [.011,.031] | +.028 [.012,.043] | -.027 [-.045,-.010] |
| L2 | 数学 | .455 / .414 / .433 / .412 | -.031 [-.043,-.016] | -.012 [-.028,.005] | +.021 [-.007,.048] |
| L3 | 英文 | .423 / .399 / .393 / .379 | -.019 [-.033,-.002] | -.025 [-.040,-.008] | +.010 [-.013,.034] |
| L3 | 中文 | .469 / .452 / .455 / .446 | -.013 [-.021,-.002] | -.010 [-.024,.005] | +.007 [-.013,.028] |
| L3 | 代码 | .813 / .827 / .835 / .843 | +.011 [.001,.020] | +.019 [.007,.032] | -.006 [-.022,.010] |
| L3 | 数学 | .548 / .536 / .540 / .532 | -.010 [-.020,.000] | -.006 [-.019,.007] | +.004 [-.018,.025] |
| L4 | 英文 | .558 / .423 / .441 / .413 | -.082 [-.099,-.054] | -.064 [-.073,-.046] | +.107 [.068,.133] |
| L4 | 中文 | .851 / .611 / .719 / .683 | -.138 [-.153,-.117] | -.030 [-.051,-.013] | +.204 [.171,.228] |
| L4 | 代码 | 1.037 / 1.034 / 1.045 / 1.019 | -.015 [-.023,-.006] | -.003 [-.015,.011] | -.024 [-.038,-.007] |
| L4 | 数学 | .647 / .550 / .589 / .580 | -.053 [-.074,-.031] | -.014 [-.031,.006] | +.088 [.052,.118] |
| L5 | 英文 | .453 / .437 / .412 / .414 | -.007 [-.021,.008] | -.032 [-.044,-.015] | +.018 [-.008,.037] |
| L5 | 中文 | .503 / .469 / .483 / .488 | -.014 [-.025,-.001] | -.001 [-.012,.012] | +.040 [.017,.057] |
| L5 | 代码 | .852 / .839 / .851 / .834 | -.015 [-.026,-.004] | -.003 [-.014,.008] | -.004 [-.017,.010] |
| L5 | 数学 | .781 / .825 / .828 / .831 | +.023 [.005,.038] | +.026 [.006,.046] | -.041 [-.065,-.013] |
| L6 | 英文 | .566 / .489 / .514 / .485 | -.053 [-.070,-.032] | -.028 [-.042,-.010] | +.048 [.014,.076] |
| L6 | 中文 | .543 / .539 / .549 / .540 | -.006 [-.017,.006] | +.003 [-.009,.014] | -.005 [-.027,.014] |
| L6 | 代码 | .907 / .940 / .921 / .912 | +.012 [.002,.024] | -.007 [-.017,.003] | -.041 [-.061,-.023] |
| L6 | 数学 | .775 / .845 / .839 / .836 | +.033 [.013,.051] | +.028 [.010,.045] | -.073 [-.097,-.047] |
7.1 不能写成单向规律
24 个 layer × domain 中:
| 效应 | 区间完全正 | 区间完全负 | 跨 0 |
|---|---|---|---|
| system main | 8 | 13 | 3 |
| few-shot main | 7 | 7 | 10 |
| interaction | 8 | 8 | 8 |
所以不能写:
- “system 总会让路由更集中”;
- “few-shot 总会让路由更均衡”;
- “system 与 few-shot 总是互相增强”。
所有三个方向都随层和域改变。
8. 最清晰的模式:one-shot 历史缓冲了 system 扰动
比较两条 system 边:
system at F0: S0F0 → S1F0
system at F1: S0F1 → S1F1
两条边都给目标绝对位置增加相同的 16 tokens。区别是:
- F0:system 后直接进入目标 user;
- F1:system 后先经过 demo user、demo assistant、EOS,再进入目标 user。
8.1 目标路由分布 TV
各层四域平均:
| Layer | System TV at F0 | System TV at F1 |
|---|---|---|
| L1 | .107 | .022 |
| L2 | .059 | .017 |
| L3 | .051 | .015 |
| L4 | .085 | .019 |
| L5 | .061 | .020 |
| L6 | .079 | .022 |
| 24 格平均 | .073 | .019 |
结果:
- 24 / 24 个 layer × domain 的 TV 都变小;
- 平均 TV 下降约 74%;
- system 边的绝对 CV 变化在 21 / 24 格变小;
- 绝对 CV 变化均值从 .068 降至 .016。
8.2 这能否叫“few-shot 稳定路由”
不能直接这样写。
本实验固定的是一整段处理:
demo 文本 + user/assistant 角色 + assistant EOS + 更长历史 + 更远的 system
因此当前最强且不越界的表述是:
在这组固定消息中,让 system 的影响先穿过一轮 one-shot 历史后, 目标内容的聚合路由分布对 system toggle 更不敏感。
要拆开“示例语义、距离、EOS、角色转换和长度”,仍需新的等长正交控制。
9. 逐 token top-6 也看到相同缓冲模式
下表把四域 2,874 个目标 token 合并;每格为:
top-6 set exact rate / mean Jaccard
| Layer | System at F0 | System at F1 | Few-shot at S0 | Few-shot at S1 |
|---|---|---|---|---|
| L1 | .317 / .756 | .789 / .939 | .318 / .751 | .454 / .820 |
| L2 | .458 / .820 | .815 / .946 | .473 / .825 | .536 / .857 |
| L3 | .477 / .830 | .828 / .951 | .517 / .845 | .589 / .875 |
| L4 | .388 / .783 | .793 / .940 | .480 / .825 | .535 / .857 |
| L5 | .435 / .798 | .788 / .938 | .500 / .827 | .537 / .857 |
| L6 | .389 / .771 | .755 / .928 | .473 / .814 | .530 / .851 |
system-at-F1 的 top-6 set exact 在六层均大幅高于 system-at-F0。 这说明聚合 TV 的下降不是只有少数专家份额抵消后的表象。
但 set exact 不等于 hidden state exact,也不等于输出答案相同。
10. 完整输入与目标内容是两个问题
target_content 只问:
相同目标 token 在不同左侧历史下如何路由?
full_input 还把 system、demo、EOS、角色前缀与 Assistant: 自己都计入:
这四种实际协议流量整体会如何路由?
完整输入的 CV 主效应点估计如下,顺序为:
system main / few-shot main / interaction
| Layer | 英文 | 中文 | 代码 | 数学 |
|---|---|---|---|---|
| L1 | -.015 / +.186 / -.243 | -.129 / +.182 / +.020 | -.062 / +.084 / -.092 | -.053 / +.139 / -.212 |
| L2 | -.003 / +.128 / -.060 | +.022 / +.125 / -.071 | -.009 / +.094 / -.088 | +.004 / +.124 / -.057 |
| L3 | +.035 / +.092 / -.035 | +.027 / +.089 / -.037 | -.058 / -.012 / +.048 | +.012 / +.065 / +.011 |
| L4 | -.057 / +.110 / -.027 | -.125 / +.003 / +.041 | -.095 / +.022 / -.056 | -.074 / +.111 / -.004 |
| L5 | -.003 / +.114 / +.011 | +.038 / +.139 / -.037 | -.014 / +.067 / -.057 | -.030 / +.063 / +.049 |
| L6 | +.012 / +.138 / +.009 | +.061 / +.184 / -.071 | +.010 / +.066 / -.037 | +.017 / +.117 / -.021 |
完整输入中,one-shot main 大多使 CV 上升;但这包含新增示例 token 本身,不能拿来替代 目标内容的上下文条件化结论。
11. 分布效应不是普通 TV
对 system / few-shot 主效应和 interaction,脚本同时保存 64 维 expert-share effect vector。
其强度定义为:
0.5 × L1 norm(effect vector)
对两组普通概率分布,这个形式等于 TV;但主效应与 interaction vector 可能含正负抵消,
所以账本明确称为 half_l1_magnitude,不冒充两分布之间的标准 TV。
普通四条边仍单独报告:
- total variation;
- JSD;
- expert-share delta;
- paired 95% 区间。
12. 独立复跑
正式运行与第二次完整运行:
SHA-256
5765fbf85fa6fd948cca90f11e2237254fd58c32f373670f44530cff0a70c1fb
两份约 28 MiB JSON:
byte-for-byte identical
一致内容包含:
- corpus identity;
- 四种官方模板渲染的 token IDs 与 hashes;
- layer 0–6 权重与环境身份;
- 每 prompt × condition 的 64-expert loads;
- 每个目标 token 的 top-6 route hashes;
- 四条因子边的 route alignment;
- 两种 scope;
- 两种 aggregation;
- 2,000 次 paired bootstrap 后的全部区间;
- system / few-shot / interaction vectors。
13. 解释边界
本轮可以说:
- 官方模板下,system 与 one-shot 都会改变目标内容路由;
- 变化随层和域不同;
- system 与 one-shot 存在明显非加性交互;
- 在这组固定示例中,system 先经过 one-shot 历史后,目标路由对 system toggle 更稳定;
- 这个模式同时出现在聚合 TV 与逐 token top-6 set/Jaccard。
本轮不能说:
- “system 专家”或“few-shot 专家”被识别出来;
- one-shot 的语义本身因果地稳定了路由;
- 结果能代表完整 27 层;
- 结果能代表线上多轮对话;
- 路由更稳定就意味着答案更好;
- CV 更低就意味着模型能力更强;
- 2,000 次 bootstrap 是 2,000 次模型运行;
- 区间是经过多重比较校正的显著性结论。
14. 下一步
这轮已经把 system 与 one-shot 的 token 增量做成正交 2×2。 最自然的后续控制是继续拆解“历史缓冲”:
- 距离控制:用等长无语义 filler 把 system 推到相同距离;
- EOS 控制:保留相同文本,只切换 assistant EOS / role boundary;
- 角色控制:相同 token 文本放入 system / user / assistant 不同角色;
- 示例内容控制:固定长度,替换正确示例、无关示例与冲突示例;
- 完整模型:获得其余 shards 后扩到全部 27 层;
- 能力联结:生成答案并用独立任务指标检查路由变化是否与行为相关。
在这些控制完成之前,“历史缓冲”保持为这组固定官方协议下的描述性实证模式。