# DeepSeek-V2-Lite 路由的消息历史 2×2 因子审计 > 状态:真实官方 BF16 权重、本机 RTX 5090、layer 0–6 连续 forward。 > 固定模型 revision:`604d5664dddd88a0433dbae533b7fe9472482de0`。 > 研究单位:上一轮同一批 128 条公开 source prompt 的四种消息历史。 > 结论身份:**消息历史组成敏感性探针**,不是能力评测、角色语义、训练分布或线上流量。 ## 1. 为什么上一轮之后还要做这一轮 上一轮已经把相同内容放入三种输入: ```text RAW → OFFICIAL USER → OFFICIAL USER + Assistant: ``` 它回答了两个问题: 1. `User:` 前缀会不会改变后续内容 token 的路由?会,而且方向随层与域改变。 2. 只在未来追加 `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. 四个条件 固定文本: ```text 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 | 因此: ```text S1F0 − S0F0 = S1F1 − S0F1 = 每条 +16 tokens S0F1 − S0F0 = S1F1 − S1F0 = 每条 +17 tokens ``` 这并没有把“角色、文本、距离和长度”彼此拆开,但它保证 system 与 one-shot 两个处理的 token 增量互不偷换。 ## 3. Cohort 完全复用,而不是重新抽样 选样 salt 继续固定为: ```text 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 代码不执行。 这让两个实验可以连续阅读: ```text 上一轮:RAW / USER / GENERATION 本轮:USER 条件内部继续展开 system × one-shot 历史 ``` ## 4. 目标内容如何精确对齐 四个条件的目标 user 前都有同一个字面前缀 `User: `,因此没有重新引入 RAW 条件的 首 token BPE 边界差异。 脚本仍不依赖这一经验假设,而是为每个目标 token 记录: ```text (相对目标内容字符起点, 相对终点, 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** | 与前四个真实语料实验合计: ```text 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,先得到四格统计: ```text m00 = metric(S0F0) m10 = metric(S1F0) m01 = metric(S0F1) m11 = metric(S1F1) ``` 然后定义: ```text 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 边: ```text 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 稳定路由” 不能直接这样写。 本实验固定的是一整段处理: ```text demo 文本 + user/assistant 角色 + assistant EOS + 更长历史 + 更远的 system ``` 因此当前最强且不越界的表述是: > 在这组固定消息中,让 system 的影响先穿过一轮 one-shot 历史后, > 目标内容的聚合路由分布对 system toggle 更不敏感。 要拆开“示例语义、距离、EOS、角色转换和长度”,仍需新的等长正交控制。 ## 9. 逐 token top-6 也看到相同缓冲模式 下表把四域 2,874 个目标 token 合并;每格为: ```text 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 主效应点估计如下,顺序为: ```text 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。 其强度定义为: ```text 0.5 × L1 norm(effect vector) ``` 对两组普通概率分布,这个形式等于 TV;但主效应与 interaction vector 可能含正负抵消, 所以账本明确称为 `half_l1_magnitude`,不冒充两分布之间的标准 TV。 普通四条边仍单独报告: - total variation; - JSD; - expert-share delta; - paired 95% 区间。 ## 12. 独立复跑 正式运行与第二次完整运行: ```text SHA-256 5765fbf85fa6fd948cca90f11e2237254fd58c32f373670f44530cff0a70c1fb ``` 两份约 28 MiB JSON: ```text 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。 最自然的后续控制是继续拆解“历史缓冲”: 1. **距离控制**:用等长无语义 filler 把 system 推到相同距离; 2. **EOS 控制**:保留相同文本,只切换 assistant EOS / role boundary; 3. **角色控制**:相同 token 文本放入 system / user / assistant 不同角色; 4. **示例内容控制**:固定长度,替换正确示例、无关示例与冲突示例; 5. **完整模型**:获得其余 shards 后扩到全部 27 层; 6. **能力联结**:生成答案并用独立任务指标检查路由变化是否与行为相关。 在这些控制完成之前,“历史缓冲”保持为这组固定官方协议下的描述性实证模式。