feat: add DeepSeek Chat behavior evidence
This commit is contained in:
@@ -1329,7 +1329,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<article>
|
||||
<span>CHECKPOINT BOUNDARY</span>
|
||||
<b>BASE ≠ CHAT / SFT</b>
|
||||
<p>不能把较小 TV 命名为“理解回合结束”;仍需 V2-Lite-Chat 与行为生成对照。</p>
|
||||
<p>不能把较小 TV 命名为“理解回合结束”;下方 Round 04 已另用 V2-Lite-Chat 做实际生成对照。</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
@@ -1345,7 +1345,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<b>SINGLE-ID ROUTING CAUSALITY, NOT TURN-SEMANTIC OR CAPABILITY PROOF</b>
|
||||
<p>
|
||||
EOS 条件下后续目标路由对 system 开关更稳定,但本实验既未生成答案,也未覆盖 Chat 权重;
|
||||
更小 TV 不等于更正确。下一步要拆 `User:` 角色标记、special-token 家族与行为指标。
|
||||
更小 TV 不等于更正确。角色标记、special-token 家族与 Chat 行为已由后续实验逐层拆开。
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1496,7 +1496,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<b>ONE ROLE-HEAD ID, NOT COMPLETE ROLE SEMANTICS</b>
|
||||
<p>
|
||||
前置词头会改变后续路由,但没有统一调制 system;后置负对照严格为零。
|
||||
special-token family 与完整两-token 角色块已在后续页签闭环;下一步转向 Chat 权重与行为指标。
|
||||
special-token family 与完整两-token 角色块已在后续页签闭环;Chat 权重与行为指标见下方 Round 04。
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1841,7 +1841,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
|
||||
<div class="artifact-boundary">
|
||||
<b>U / STILL OPEN</b>
|
||||
<p>完整 27 层生成、受支持硬件上的 FlashMLA 优化 kernel、生产服务、训练负载、FP8/pipeline 与 R1-like 训练 trace 仍未覆盖。</p>
|
||||
<p>Base checkpoint 的完整 27 层路由 trace、受支持硬件上的 FlashMLA 优化 kernel、生产服务、训练负载、FP8/pipeline 与 R1-like 训练 trace 仍未覆盖;Chat 的完整 27 层生成已在 Round 04 以 GPU+CPU offload 单独执行。</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -0,0 +1,655 @@
|
||||
---
|
||||
import rawBehavior from "@/data/deepseek-v2-lite-chat-behavior-compact.json";
|
||||
|
||||
const behavior = rawBehavior as any;
|
||||
const json = JSON.stringify(behavior).replaceAll("<", "\\u003c");
|
||||
const gib = (value: number) => value / 1024 ** 3;
|
||||
const gpuParameterBytes = (
|
||||
behavior.execution.parameterBytesByRuntimeParameterDevice["cuda:0"]
|
||||
);
|
||||
const cpuOffloadBytes = (
|
||||
behavior.execution.parameterBytesByRuntimeParameterDevice.meta
|
||||
);
|
||||
const peakGiB = gib(behavior.execution.peakCudaMemoryAllocatedBytes);
|
||||
const checkpointGiB = gib(behavior.model.checkpointTensorBytes);
|
||||
const gpuParameterGiB = gib(gpuParameterBytes);
|
||||
const cpuOffloadGiB = gib(cpuOffloadBytes);
|
||||
const rssGiB = behavior.execution.processMaxRssKib / 1024 ** 2;
|
||||
const edgeOrder = behavior.contract.edgeOrder as string[];
|
||||
const edgeLabels = behavior.contract.edgeLabels as Record<string, string>;
|
||||
const firstSource = behavior.sources[0];
|
||||
const conditionLabel: Record<string, string> = {
|
||||
s0_eos: "S0 · EOS",
|
||||
s1_eos: "S1 · EOS",
|
||||
s0_bos: "S0 · BOS",
|
||||
s1_bos: "S1 · BOS",
|
||||
s0_x: "S0 · x",
|
||||
s1_x: "S1 · x",
|
||||
s0_period: "S0 · 句点",
|
||||
s1_period: "S1 · 句点",
|
||||
};
|
||||
const deviceLayers = Array.from({ length: 27 }, (_, layer) => ({
|
||||
layer,
|
||||
device: behavior.execution.deviceMap[`model.layers.${layer}`],
|
||||
}));
|
||||
---
|
||||
|
||||
<figure class="behavior-lab" data-behavior-lab>
|
||||
<header class="behavior-head">
|
||||
<div>
|
||||
<p>ROUND 04 / CHAT BEHAVIOR · OFFICIAL BF16</p>
|
||||
<h3>路由变了以后,模型最后真的会说出不同答案吗?</h3>
|
||||
</div>
|
||||
<p>
|
||||
同一组 source 从 Base checkpoint 的路由显微镜进入
|
||||
<code>DeepSeek-V2-Lite-Chat</code>:system off/on × EOS/BOS/x/句点,
|
||||
每条 source 的八格在同一 batch 内做 greedy generation。这里观察的是最终输出,
|
||||
不再用 route TV 代替行为。
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="behavior-ledger">
|
||||
<article><span>CHECKPOINT</span><b>SFT CHAT · BF16</b><p>不是 Base,也不是 R1 / RL</p></article>
|
||||
<article><span>FORMAL GRID</span><b>16 × 8 = 128</b><p>四域各 4 条完整 source</p></article>
|
||||
<article class="complete"><span>EOS COMPLETE</span><b>{behavior.summary.completedOutputs} / 128</b><p>在 128-token 上限内结束</p></article>
|
||||
<article class="warning"><span>TRUNCATED</span><b>{behavior.summary.truncatedOutputs} / 128</b><p>能力分数不得横向解释</p></article>
|
||||
<article><span>LONG RERUN</span><b>32 / 32 EXACT</b><p>每域首条逐 token 复跑</p></article>
|
||||
</div>
|
||||
|
||||
<div class="behavior-tabs" role="tablist" aria-label="选择 Chat 行为证据视图">
|
||||
<button type="button" role="tab" data-behavior-tab="pair" aria-selected="true">
|
||||
<span>01</span><b>逐格读输出</b><small>source × contrast</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-behavior-tab="map" aria-selected="false" tabindex="-1">
|
||||
<span>02</span><b>分叉地图</b><small>10 edges × 4 domains</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-behavior-tab="execution" aria-selected="false" tabindex="-1">
|
||||
<span>03</span><b>完整权重怎样装下</b><small>GPU + CPU offload</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-behavior-tab="boundary" aria-selected="false" tabindex="-1">
|
||||
<span>04</span><b>证据边界</b><small>route ≠ output ≠ ability</small>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<section class="behavior-panel" data-behavior-panel="pair">
|
||||
<div class="panel-lead">
|
||||
<div><span>X / GENERATED OUTPUTS</span><h4>固定一条 source,再沿一条边比较两格</h4></div>
|
||||
<p>Exact 表示整段 generated token IDs 完全相同;similarity 是 token Levenshtein 相似度,不是语义得分。</p>
|
||||
</div>
|
||||
|
||||
<div class="pair-controls">
|
||||
<label>
|
||||
<span>source · 16</span>
|
||||
<select data-behavior-source aria-label="选择生成 source">
|
||||
{behavior.sources.map((source: any) => (
|
||||
<option value={source.id}>
|
||||
{source.label} · {source.withinDomainIndex + 1} · {source.id}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>contrast · 10</span>
|
||||
<select data-behavior-edge aria-label="选择输出比较边">
|
||||
{edgeOrder.map((edge) => (
|
||||
<option value={edge}>{edgeLabels[edge]}</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="source-contract">
|
||||
<div><span>SOURCE</span><b data-behavior-source-id>{firstSource.id}</b></div>
|
||||
<div><span>DOMAIN</span><b data-behavior-domain>{firstSource.label}</b></div>
|
||||
<div><span>FULL INPUT</span><b data-behavior-source-shape>{firstSource.sourceCharacters} chars · {firstSource.sourceTokens} tokens</b></div>
|
||||
<div><span>TEXT SHA-256</span><code data-behavior-source-hash>{firstSource.sourceTextSha256.slice(0, 16)}…</code></div>
|
||||
</div>
|
||||
|
||||
<div class="pair-metrics">
|
||||
<article><span>TOKEN EXACT</span><b data-behavior-exact>—</b></article>
|
||||
<article><span>COMMON PREFIX</span><b data-behavior-prefix>—</b><small>tokens</small></article>
|
||||
<article><span>EDIT DISTANCE</span><b data-behavior-edit>—</b><small>tokens</small></article>
|
||||
<article><span>NORMALIZED SIMILARITY</span><b data-behavior-similarity>—</b></article>
|
||||
</div>
|
||||
|
||||
<div class="output-pair">
|
||||
{(["left", "right"] as const).map((side) => (
|
||||
<article data-output-card={side}>
|
||||
<header>
|
||||
<div><span data-output-side={side}>{side === "left" ? "LEFT" : "RIGHT"}</span><b data-output-condition={side}>{conditionLabel[side === "left" ? "s0_eos" : "s1_eos"]}</b></div>
|
||||
<em data-output-status={side}>—</em>
|
||||
</header>
|
||||
<dl>
|
||||
<div><dt>PROMPT</dt><dd data-output-prompt={side}>—</dd></div>
|
||||
<div><dt>GENERATED</dt><dd data-output-tokens={side}>—</dd></div>
|
||||
<div><dt>TOKEN HASH</dt><dd><code data-output-hash={side}>—</code></dd></div>
|
||||
</dl>
|
||||
<p data-output-text={side}></p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div class="pair-reading">
|
||||
<span>怎么读</span>
|
||||
<p data-behavior-reading>
|
||||
一处历史边界 ID 或一条 system message 可以让 greedy 轨迹分叉;分叉只说明这条固定输入、固定 checkpoint、固定解码路径发生变化。
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="behavior-panel" data-behavior-panel="map" hidden>
|
||||
<div class="panel-lead">
|
||||
<div><span>X / DESCRIPTIVE MAP</span><h4>十条边,不要压成一句“有影响 / 没影响”</h4></div>
|
||||
<p>每域只有 4 条 source;下表是完整 token exact 数与平均编辑相似度,适合定位分叉,不是总体效应估计。</p>
|
||||
</div>
|
||||
<div class="map-control">
|
||||
<label>
|
||||
<span>聚合范围</span>
|
||||
<select data-behavior-map-domain aria-label="选择分叉地图聚合范围">
|
||||
<option value="all">四域合计 · n=16</option>
|
||||
<option value="english">英文百科 · n=4</option>
|
||||
<option value="chinese">中文新闻 · n=4</option>
|
||||
<option value="code">Python 代码 · n=4</option>
|
||||
<option value="math">小学数学 · n=4</option>
|
||||
</select>
|
||||
</label>
|
||||
<p data-behavior-map-note>四域合计;不同域的输出长度与完成率不等,均值只作导航。</p>
|
||||
</div>
|
||||
<div class="edge-map" data-behavior-edge-map>
|
||||
<header><b>CONTRAST</b><b>EXACT</b><b>MEAN SIMILARITY</b><b>EDIT</b></header>
|
||||
{edgeOrder.map((edge) => (
|
||||
<button type="button" data-behavior-map-edge={edge}>
|
||||
<span>{edgeLabels[edge]}</span>
|
||||
<b data-map-exact>—</b>
|
||||
<i><em data-map-meter></em></i>
|
||||
<strong data-map-similarity>—</strong>
|
||||
<small data-map-edit>—</small>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<div class="map-callout">
|
||||
<article><span>OFFICIAL EDGE</span><b>System · EOS</b><p>16 条里只有 2 条完整输出 exact;平均 token similarity 48.3%。</p></article>
|
||||
<article><span>DIRECT COUNTERFACTUAL</span><b>x · system on</b><p>0 / 16 exact;平均 similarity 29.8%。这是固定 ID 对照,不是“x 更坏”。</p></article>
|
||||
<article><span>DO NOT RANK</span><b>97 / 128 truncated</b><p>不同格的数学 exact / code parse 不满足公平能力比较的完成合同。</p></article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="behavior-panel" data-behavior-panel="execution" hidden>
|
||||
<div class="panel-lead">
|
||||
<div><span>X / FULL CHECKPOINT</span><h4>31.4GB BF16 权重怎样在 32GB 卡上完成生成</h4></div>
|
||||
<p>官方 model card 给出单卡 BF16 需要 40GB;本机可见 32,607 MiB,因此明确使用 Accelerate GPU+CPU offload。</p>
|
||||
</div>
|
||||
|
||||
<div class="checkpoint-ledger">
|
||||
<article><span>INDEX TENSOR BYTES</span><b>{behavior.model.checkpointTensorBytes.toLocaleString()}</b><p>{checkpointGiB.toFixed(3)} GiB · 全 BF16</p></article>
|
||||
<article><span>SHARD FILE BYTES</span><b>{behavior.model.shardFileBytesIncludingHeaders.toLocaleString()}</b><p>含 safetensors headers</p></article>
|
||||
<article><span>PINNED REVISION</span><code>{behavior.model.revision.slice(0, 12)}…</code><p>12 / 12 文件同 revision</p></article>
|
||||
</div>
|
||||
|
||||
<div class="offload-flow">
|
||||
<article class="gpu">
|
||||
<header><span>CUDA:0 · RTX 5090</span><b>{gpuParameterGiB.toFixed(2)} GiB parameters</b></header>
|
||||
<div class="memory-track"><i style={`--fill:${Math.min(100, peakGiB / (behavior.execution.localSingleGpuCapacityMib / 1024) * 100).toFixed(2)}%`}></i></div>
|
||||
<p>峰值 CUDA allocation <b>{peakGiB.toFixed(2)} GiB</b>;29GiB 是参数放置上限,KV/cache 会继续占显存。</p>
|
||||
</article>
|
||||
<div class="offload-arrow"><span>Accelerate</span><b>↔</b><small>device_map=auto</small></div>
|
||||
<article class="cpu">
|
||||
<header><span>CPU OFFLOAD</span><b>{cpuOffloadGiB.toFixed(2)} GiB tensors</b></header>
|
||||
<div class="memory-track"><i style={`--fill:${Math.min(100, rssGiB / 80 * 100).toFixed(2)}%`}></i></div>
|
||||
<p>layers 25–26、final norm 与 LM head;进程 max RSS <b>{rssGiB.toFixed(2)} GiB</b>。</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="layer-device-map" aria-label="27 层运行设备图">
|
||||
{deviceLayers.map(({ layer, device }) => (
|
||||
<span class={device === "cpu" ? "cpu" : "gpu"} title={`layer ${layer} → ${device === "cpu" ? "CPU" : "CUDA:0"}`}>
|
||||
<b>L{layer}</b><small>{device === "cpu" ? "CPU" : "GPU"}</small>
|
||||
</span>
|
||||
))}
|
||||
<span class="cpu tail"><b>NORM</b><small>CPU</small></span>
|
||||
<span class="cpu tail"><b>HEAD</b><small>CPU</small></span>
|
||||
</div>
|
||||
|
||||
<div class="runtime-grid">
|
||||
<article><span>LOAD</span><b>{behavior.execution.loadSeconds.toFixed(2)} s</b><p>4 shards → device map</p></article>
|
||||
<article><span>GENERATION</span><b>{behavior.execution.generationSeconds.toFixed(1)} s</b><p>16 source batches · 128 outputs</p></article>
|
||||
<article><span>STACK</span><b>torch {behavior.execution.torch}</b><p>Transformers {behavior.execution.transformers} · Accelerate {behavior.execution.accelerate}</p></article>
|
||||
<article class="warning"><span>NOT THROUGHPUT</span><b>CPU-offloaded eager</b><p>延迟不代表生产 kernel / serving</p></article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="behavior-panel" data-behavior-panel="boundary" hidden>
|
||||
<div class="panel-lead">
|
||||
<div><span>EVIDENCE LADDER</span><h4>同一个问题,至少要跨过三层证据</h4></div>
|
||||
<p>上一轮能看到专家路径,这一轮能看到生成文本;两者仍不能自动给出基准能力与机制因果。</p>
|
||||
</div>
|
||||
|
||||
<div class="evidence-ladder">
|
||||
<article>
|
||||
<span>01 / BASE ROUTING</span><b>11,289,744 routes</b>
|
||||
<p>回答“历史协议改变后,前六个 MoE 层的目标 token 路由怎样变”。</p>
|
||||
<em>不能回答最终生成了什么</em>
|
||||
</article>
|
||||
<i>→</i>
|
||||
<article class="active">
|
||||
<span>02 / CHAT GENERATION</span><b>128 greedy outputs</b>
|
||||
<p>回答“固定 SFT Chat checkpoint 下,八格输出是否 exact、在哪里分叉”。</p>
|
||||
<em>不能回答普遍能力或采样分布</em>
|
||||
</article>
|
||||
<i>→</i>
|
||||
<article>
|
||||
<span>03 / TASK EVALUATION</span><b>not yet identified</b>
|
||||
<p>需要完整结束、足够样本、可执行 evaluator、采样复跑与预注册统计。</p>
|
||||
<em>97 格截断,所以这一层未过闸</em>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="token-contract">
|
||||
<article class="official"><span>OFFICIAL</span><b>EOS · 100001</b><p>官方合法 Chat 序列;同时是 PAD alias。</p></article>
|
||||
<article><span>COUNTERFACTUAL</span><b>BOS · 100000</b><p>另一个 special ID;不是合法历史结束。</p></article>
|
||||
<article><span>COUNTERFACTUAL</span><b>x · 87</b><p>普通单 token 内容控制。</p></article>
|
||||
<article><span>COUNTERFACTUAL</span><b>. · 13</b><p>普通单 token 标点控制。</p></article>
|
||||
</div>
|
||||
|
||||
<div class="repro-grid">
|
||||
<article class="pass"><span>MODEL FILES</span><b>12 / 12 PINNED</b><p>revision metadata + SHA-256</p></article>
|
||||
<article class="pass"><span>LONG RERUN</span><b>32 / 32 EXACT</b><p>prompt、IDs、text、EOS 全一致</p></article>
|
||||
<article class="pass"><span>SMOKE PREFIX</span><b>32 / 32 EXACT</b><p>32-token smoke = 正式前缀</p></article>
|
||||
<article class="limit"><span>COMPLETION</span><b>31 / 128 EOS</b><p>截断率是结果的一部分</p></article>
|
||||
</div>
|
||||
|
||||
<div class="forbidden-claims">
|
||||
<b>这一轮仍然不能写</b>
|
||||
<p>“EOS 让答案更好” · “ordinary token 更差” · “route TV 解释了文本差异” · “4 条/域代表 benchmark” · “greedy exact 等于采样稳定” · “CPU offload 延迟等于生产吞吐”。</p>
|
||||
</div>
|
||||
|
||||
<div class="artifact-links">
|
||||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite-Chat" rel="noreferrer">官方模型与 model card ↗</a>
|
||||
<a href="https://git.k1412.top/wuyang/llm-atlas/src/branch/main/src/data/deepseek-v2-lite-chat-behavior.json" rel="noreferrer">542KB 正式原始 JSON ↗</a>
|
||||
<a href="https://git.k1412.top/wuyang/llm-atlas/src/branch/main/research/DEEPSEEK_V2_LITE_CHAT_BEHAVIOR_AUDIT.md" rel="noreferrer">完整审计与非结论 ↗</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<figcaption>
|
||||
<span>X / OFFICIAL BF16 CHAT · DESCRIPTIVE BEHAVIOR PROBE</span>
|
||||
固定 revision <code>{behavior.model.revision}</code>;正式原始 JSON
|
||||
<code>{behavior.source.formalSha256.slice(0, 16)}…</code>。32 格长序列复跑逐 token exact;
|
||||
其余 96 格未做完整 128-token 独立复跑。
|
||||
</figcaption>
|
||||
|
||||
<script is:inline type="application/json" data-behavior-data set:html={json}></script>
|
||||
</figure>
|
||||
|
||||
<script>
|
||||
const roots = document.querySelectorAll<HTMLElement>("[data-behavior-lab]");
|
||||
const labels: Record<string, string> = {
|
||||
s0_eos: "S0 · EOS",
|
||||
s1_eos: "S1 · EOS",
|
||||
s0_bos: "S0 · BOS",
|
||||
s1_bos: "S1 · BOS",
|
||||
s0_x: "S0 · x",
|
||||
s1_x: "S1 · x",
|
||||
s0_period: "S0 · 句点",
|
||||
s1_period: "S1 · 句点",
|
||||
};
|
||||
const domainNotes: Record<string, string> = {
|
||||
all: "四域合计;不同域的输出长度与完成率不等,均值只作导航。",
|
||||
english: "英文百科 · 4 条 source;不是开放域 QA benchmark。",
|
||||
chinese: "中文新闻 · 4 条 source;不是 TNEWS 分类准确率。",
|
||||
code: "HumanEval prompt · 4 条;代码只做 AST parse,未执行。",
|
||||
math: "GSM8K question · 4 条;大量输出截断,不报告准确率。",
|
||||
};
|
||||
|
||||
roots.forEach((root) => {
|
||||
const payload = root.querySelector<HTMLScriptElement>("[data-behavior-data]");
|
||||
if (!payload) return;
|
||||
const data = JSON.parse(payload.textContent ?? "{}");
|
||||
const one = <T extends Element>(selector: string) => root.querySelector<T>(selector);
|
||||
const all = <T extends Element>(selector: string) => [...root.querySelectorAll<T>(selector)];
|
||||
const set = (selector: string, value: string) => {
|
||||
const node = one<HTMLElement>(selector);
|
||||
if (node) node.textContent = value;
|
||||
};
|
||||
const sourceSelect = one<HTMLSelectElement>("[data-behavior-source]");
|
||||
const edgeSelect = one<HTMLSelectElement>("[data-behavior-edge]");
|
||||
const mapDomain = one<HTMLSelectElement>("[data-behavior-map-domain]");
|
||||
const sourceById = new Map<string, any>(
|
||||
data.sources.map((source: any) => [source.id, source]),
|
||||
);
|
||||
const shortHash = (value: string) => `${value.slice(0, 12)}…`;
|
||||
|
||||
const renderOutput = (side: "left" | "right", output: any) => {
|
||||
set(`[data-output-condition="${side}"]`, labels[output.condition] ?? output.condition);
|
||||
set(
|
||||
`[data-output-status="${side}"]`,
|
||||
output.hitEos ? "EOS COMPLETE" : "MAX 128 · TRUNCATED",
|
||||
);
|
||||
const status = one<HTMLElement>(`[data-output-status="${side}"]`);
|
||||
status?.classList.toggle("complete", output.hitEos);
|
||||
status?.classList.toggle("truncated", !output.hitEos);
|
||||
set(
|
||||
`[data-output-prompt="${side}"]`,
|
||||
`${output.promptTokens} tokens · left pad ${output.leftPaddingTokens}`,
|
||||
);
|
||||
set(
|
||||
`[data-output-tokens="${side}"]`,
|
||||
`${output.generatedTokens} tokens`,
|
||||
);
|
||||
set(`[data-output-hash="${side}"]`, shortHash(output.generatedTokenIdsSha256));
|
||||
set(`[data-output-text="${side}"]`, output.text || "(empty decoded text)");
|
||||
};
|
||||
|
||||
const renderPair = () => {
|
||||
const sourceId = sourceSelect?.value;
|
||||
if (!sourceId) return;
|
||||
const source = sourceById.get(sourceId);
|
||||
const edge = edgeSelect?.value;
|
||||
if (!source || !edge) return;
|
||||
const pair = data.summary.pairwise[edge].find(
|
||||
(row: any) => row.source_id === source.id,
|
||||
);
|
||||
if (!pair) return;
|
||||
const outputByCondition = new Map(
|
||||
source.outputs.map((output: any) => [output.condition, output]),
|
||||
);
|
||||
const left = outputByCondition.get(pair.left);
|
||||
const right = outputByCondition.get(pair.right);
|
||||
set("[data-behavior-source-id]", source.id);
|
||||
set("[data-behavior-domain]", source.label);
|
||||
set(
|
||||
"[data-behavior-source-shape]",
|
||||
`${source.sourceCharacters.toLocaleString()} chars · ${source.sourceTokens.toLocaleString()} tokens`,
|
||||
);
|
||||
set("[data-behavior-source-hash]", shortHash(source.sourceTextSha256));
|
||||
set("[data-behavior-exact]", pair.token_ids_exact ? "EXACT" : "DIVERGED");
|
||||
one("[data-behavior-exact]")?.classList.toggle("exact", pair.token_ids_exact);
|
||||
set("[data-behavior-prefix]", pair.common_prefix_tokens.toLocaleString());
|
||||
set("[data-behavior-edit]", pair.token_edit_distance.toLocaleString());
|
||||
set(
|
||||
"[data-behavior-similarity]",
|
||||
`${(pair.normalized_token_similarity * 100).toFixed(1)}%`,
|
||||
);
|
||||
renderOutput("left", left);
|
||||
renderOutput("right", right);
|
||||
set(
|
||||
"[data-behavior-reading]",
|
||||
pair.token_ids_exact
|
||||
? `这条边在当前 source 上没有改变完整 greedy token 序列;这不是“因素无效”,只是一条 exact 观测。`
|
||||
: `两格在共同前缀 ${pair.common_prefix_tokens} token 后发生分叉,编辑距离 ${pair.token_edit_distance};它证明这条固定 greedy 轨迹改变,不证明哪一格更正确。`,
|
||||
);
|
||||
};
|
||||
|
||||
const renderMap = () => {
|
||||
const domain = mapDomain?.value ?? "all";
|
||||
const rows = domain === "all"
|
||||
? data.summary.aggregates
|
||||
: data.summary.aggregatesByDomain[domain];
|
||||
set("[data-behavior-map-note]", domainNotes[domain]);
|
||||
all<HTMLElement>("[data-behavior-map-edge]").forEach((row) => {
|
||||
const edge = row.dataset.behaviorMapEdge;
|
||||
if (!edge) return;
|
||||
const metric = rows[edge];
|
||||
const percent = metric.mean_normalized_token_similarity * 100;
|
||||
const exact = row.querySelector<HTMLElement>("[data-map-exact]");
|
||||
const meter = row.querySelector<HTMLElement>("[data-map-meter]");
|
||||
const similarity = row.querySelector<HTMLElement>("[data-map-similarity]");
|
||||
const edit = row.querySelector<HTMLElement>("[data-map-edit]");
|
||||
if (exact) exact.textContent = `${metric.token_ids_exact} / ${metric.sources}`;
|
||||
if (meter) meter.style.width = `${Math.max(1.5, percent)}%`;
|
||||
if (similarity) similarity.textContent = `${percent.toFixed(1)}%`;
|
||||
if (edit) edit.textContent = `edit ${metric.mean_token_edit_distance.toFixed(1)}`;
|
||||
});
|
||||
};
|
||||
|
||||
sourceSelect?.addEventListener("change", renderPair);
|
||||
edgeSelect?.addEventListener("change", renderPair);
|
||||
mapDomain?.addEventListener("change", renderMap);
|
||||
all<HTMLButtonElement>("[data-behavior-map-edge]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
if (edgeSelect) edgeSelect.value = button.dataset.behaviorMapEdge ?? "system_eos";
|
||||
one<HTMLButtonElement>('[data-behavior-tab="pair"]')?.click();
|
||||
renderPair();
|
||||
});
|
||||
});
|
||||
|
||||
const tabs = all<HTMLButtonElement>("[data-behavior-tab]");
|
||||
const panels = all<HTMLElement>("[data-behavior-panel]");
|
||||
const selectTab = (tab: HTMLButtonElement) => {
|
||||
tabs.forEach((candidate) => {
|
||||
const active = candidate === tab;
|
||||
candidate.setAttribute("aria-selected", String(active));
|
||||
candidate.tabIndex = active ? 0 : -1;
|
||||
});
|
||||
panels.forEach((panel) => {
|
||||
panel.hidden = panel.dataset.behaviorPanel !== tab.dataset.behaviorTab;
|
||||
});
|
||||
};
|
||||
tabs.forEach((tab, index) => {
|
||||
tab.addEventListener("click", () => selectTab(tab));
|
||||
tab.addEventListener("keydown", (event) => {
|
||||
if (!["ArrowLeft", "ArrowRight", "Home", "End"].includes(event.key)) return;
|
||||
event.preventDefault();
|
||||
let next = index;
|
||||
if (event.key === "ArrowRight") next = (index + 1) % tabs.length;
|
||||
if (event.key === "ArrowLeft") next = (index - 1 + tabs.length) % tabs.length;
|
||||
if (event.key === "Home") next = 0;
|
||||
if (event.key === "End") next = tabs.length - 1;
|
||||
tabs[next].focus();
|
||||
selectTab(tabs[next]);
|
||||
});
|
||||
});
|
||||
renderPair();
|
||||
renderMap();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.behavior-lab {
|
||||
margin: 2.2rem 0 0;
|
||||
overflow: hidden;
|
||||
border: 1px solid rgba(30, 38, 43, .16);
|
||||
background: #f7f4ec;
|
||||
box-shadow: 0 28px 70px rgba(22, 35, 43, .1);
|
||||
}
|
||||
.behavior-head {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 2.4rem;
|
||||
align-items: end;
|
||||
padding: 2rem;
|
||||
color: #f8f4e9;
|
||||
background:
|
||||
radial-gradient(circle at 82% 22%, rgba(85, 169, 159, .24), transparent 28%),
|
||||
linear-gradient(135deg, #162a32, #254751);
|
||||
}
|
||||
.behavior-head p { margin: 0; color: rgba(255,255,255,.72); font-size: .77rem; line-height: 1.7; }
|
||||
.behavior-head > div > p { color: #82c3b9; font: 750 .61rem/1.2 var(--font-mono); letter-spacing: .1em; }
|
||||
.behavior-head h3 { max-width: 620px; margin: .75rem 0 0; color: white; font: 760 clamp(1.55rem, 3vw, 2.45rem)/1.14 var(--font-display); }
|
||||
.behavior-head code { color: white; font-size: .7rem; }
|
||||
.behavior-ledger { display: grid; grid-template-columns: repeat(5, 1fr); border-bottom: 1px solid rgba(30,38,43,.14); }
|
||||
.behavior-ledger article { min-width: 0; padding: 1rem 1.15rem; border-right: 1px solid rgba(30,38,43,.12); background: #ece8dd; }
|
||||
.behavior-ledger article:last-child { border-right: 0; }
|
||||
.behavior-ledger article.complete { background: rgba(57, 126, 109, .12); }
|
||||
.behavior-ledger article.warning { background: rgba(190, 100, 51, .14); }
|
||||
.behavior-ledger span,
|
||||
.checkpoint-ledger span,
|
||||
.runtime-grid span,
|
||||
.map-callout span,
|
||||
.repro-grid span,
|
||||
.token-contract span { display: block; color: #60706e; font: 720 .54rem/1.2 var(--font-mono); letter-spacing: .08em; }
|
||||
.behavior-ledger b { display: block; margin-top: .45rem; color: #182b33; font: 760 .82rem/1.25 var(--font-mono); }
|
||||
.behavior-ledger p { margin: .35rem 0 0; color: #68716f; font-size: .62rem; line-height: 1.4; }
|
||||
.behavior-tabs { display: grid; grid-template-columns: repeat(4, 1fr); border-bottom: 1px solid rgba(30,38,43,.14); }
|
||||
.behavior-tabs button { display: grid; grid-template-columns: auto 1fr; grid-template-rows: auto auto; column-gap: .75rem; min-width: 0; padding: .9rem 1rem; border: 0; border-right: 1px solid rgba(30,38,43,.14); color: #25363c; text-align: left; background: #fbf8f1; cursor: pointer; }
|
||||
.behavior-tabs button:last-child { border-right: 0; }
|
||||
.behavior-tabs button[aria-selected="true"] { color: white; background: #b25d36; }
|
||||
.behavior-tabs span { grid-row: 1 / 3; opacity: .72; font: 720 .55rem/1.2 var(--font-mono); }
|
||||
.behavior-tabs b { min-width: 0; font: 720 .76rem/1.25 var(--font-display); }
|
||||
.behavior-tabs small { opacity: .68; font: .54rem/1.3 var(--font-mono); overflow-wrap: anywhere; }
|
||||
.behavior-panel { padding: 1.55rem; }
|
||||
.behavior-panel[hidden] { display: none; }
|
||||
.panel-lead { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; align-items: end; margin-bottom: 1.25rem; }
|
||||
.panel-lead span { color: #a75231; font: 750 .56rem/1.2 var(--font-mono); letter-spacing: .09em; }
|
||||
.panel-lead h4 { margin: .35rem 0 0; color: #1c3037; font: 750 1.25rem/1.2 var(--font-display); }
|
||||
.panel-lead p { margin: 0; color: #65716f; font-size: .7rem; line-height: 1.65; }
|
||||
.pair-controls { display: grid; grid-template-columns: 1.2fr 1fr; gap: 1px; background: rgba(30,38,43,.14); border: 1px solid rgba(30,38,43,.14); }
|
||||
.pair-controls label,
|
||||
.map-control label { min-width: 0; padding: .8rem; background: #ede9df; }
|
||||
.pair-controls label > span,
|
||||
.map-control label > span { display: block; margin-bottom: .4rem; color: #65716f; font: 720 .54rem/1.2 var(--font-mono); letter-spacing: .08em; }
|
||||
.pair-controls select,
|
||||
.map-control select { width: 100%; min-width: 0; border: 1px solid rgba(30,38,43,.2); padding: .58rem; color: #1f3339; background: #fffdf8; font: 650 .66rem/1.3 var(--font-mono); }
|
||||
.source-contract { display: grid; grid-template-columns: 1.25fr .8fr 1fr 1fr; margin-top: 1px; background: rgba(30,38,43,.12); gap: 1px; }
|
||||
.source-contract > div { min-width: 0; padding: .7rem .8rem; background: #faf7f0; }
|
||||
.source-contract span { display: block; color: #78817e; font: 680 .5rem/1.2 var(--font-mono); }
|
||||
.source-contract b,
|
||||
.source-contract code { display: block; margin-top: .3rem; color: #23343a; font-size: .62rem; overflow-wrap: anywhere; }
|
||||
.pair-metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; margin-top: 1.15rem; background: rgba(30,38,43,.14); border: 1px solid rgba(30,38,43,.14); }
|
||||
.pair-metrics article { padding: .8rem; background: #e8e4da; }
|
||||
.pair-metrics span { display: block; color: #65716f; font: 680 .52rem/1.2 var(--font-mono); }
|
||||
.pair-metrics b { display: inline-block; margin-top: .4rem; color: #b05130; font: 790 1.15rem/1 var(--font-display); }
|
||||
.pair-metrics b.exact { color: #277563; }
|
||||
.pair-metrics small { margin-left: .3rem; color: #777; font-size: .55rem; }
|
||||
.output-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; margin-top: 1px; background: rgba(30,38,43,.15); border: 1px solid rgba(30,38,43,.15); }
|
||||
.output-pair > article { min-width: 0; background: #fffdf8; }
|
||||
.output-pair header { display: flex; justify-content: space-between; gap: 1rem; align-items: center; padding: .8rem 1rem; border-bottom: 1px solid rgba(30,38,43,.12); background: #efebe1; }
|
||||
.output-pair header span { display: block; color: #78817e; font: 690 .49rem/1 var(--font-mono); }
|
||||
.output-pair header b { display: block; margin-top: .25rem; color: #21363d; font: 760 .78rem/1.1 var(--font-mono); }
|
||||
.output-pair header em { padding: .35rem .5rem; color: #a15031; background: rgba(177,87,49,.1); font: 720 .5rem/1 var(--font-mono); }
|
||||
.output-pair header em.complete { color: #236a58; background: rgba(45,126,101,.12); }
|
||||
.output-pair dl { display: grid; grid-template-columns: 1fr 1fr 1.15fr; margin: 0; border-bottom: 1px solid rgba(30,38,43,.1); }
|
||||
.output-pair dl div { min-width: 0; padding: .6rem .7rem; border-right: 1px solid rgba(30,38,43,.09); }
|
||||
.output-pair dl div:last-child { border-right: 0; }
|
||||
.output-pair dt { color: #818884; font: 680 .46rem/1 var(--font-mono); }
|
||||
.output-pair dd { margin: .28rem 0 0; color: #35464b; font-size: .56rem; overflow-wrap: anywhere; }
|
||||
.output-pair > article > p { min-height: 15rem; max-height: 23rem; margin: 0; padding: 1rem; overflow: auto; color: #27383d; white-space: pre-wrap; font-size: .72rem; line-height: 1.65; }
|
||||
.pair-reading,
|
||||
.forbidden-claims { display: grid; grid-template-columns: 9rem 1fr; gap: 1rem; margin-top: 1rem; padding: .9rem 1rem; color: white; background: #253e46; }
|
||||
.pair-reading span { color: #79c0b3; font: 750 .57rem/1.3 var(--font-mono); }
|
||||
.pair-reading p,
|
||||
.forbidden-claims p { margin: 0; color: rgba(255,255,255,.78); font-size: .68rem; line-height: 1.55; }
|
||||
.map-control { display: grid; grid-template-columns: minmax(15rem, .7fr) 1.3fr; align-items: stretch; border: 1px solid rgba(30,38,43,.14); background: #ede9df; }
|
||||
.map-control p { display: flex; align-items: center; margin: 0; padding: .8rem 1rem; color: #68736f; font-size: .66rem; line-height: 1.5; background: #faf7ef; }
|
||||
.edge-map { margin-top: 1rem; border: 1px solid rgba(30,38,43,.15); }
|
||||
.edge-map > header,
|
||||
.edge-map > button { display: grid; grid-template-columns: 1.45fr .45fr 1fr .4fr; gap: .8rem; align-items: center; width: 100%; min-width: 0; padding: .65rem .8rem; border: 0; border-bottom: 1px solid rgba(30,38,43,.1); text-align: left; }
|
||||
.edge-map > header { color: #dee9e6; background: #253e46; font: 690 .48rem/1.2 var(--font-mono); }
|
||||
.edge-map > button { color: #2b3d42; background: #fbf8f1; cursor: pointer; }
|
||||
.edge-map > button:hover { background: #f0ebe0; }
|
||||
.edge-map > button:last-child { border-bottom: 0; }
|
||||
.edge-map button > span { font: 670 .63rem/1.25 var(--font-mono); }
|
||||
.edge-map button > b,
|
||||
.edge-map button > strong,
|
||||
.edge-map button > small { font: 720 .59rem/1 var(--font-mono); }
|
||||
.edge-map button > i { height: .48rem; overflow: hidden; background: #ded9cd; }
|
||||
.edge-map button > i > em { display: block; height: 100%; background: linear-gradient(90deg, #b45e37, #3d8275); }
|
||||
.map-callout,
|
||||
.checkpoint-ledger,
|
||||
.runtime-grid,
|
||||
.repro-grid,
|
||||
.token-contract { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; margin-top: 1rem; background: rgba(30,38,43,.13); border: 1px solid rgba(30,38,43,.13); }
|
||||
.map-callout article,
|
||||
.checkpoint-ledger article,
|
||||
.runtime-grid article,
|
||||
.repro-grid article,
|
||||
.token-contract article { min-width: 0; padding: .9rem; background: #eeeae0; }
|
||||
.map-callout b,
|
||||
.checkpoint-ledger b,
|
||||
.runtime-grid b,
|
||||
.repro-grid b,
|
||||
.token-contract b,
|
||||
.checkpoint-ledger code { display: block; margin-top: .45rem; color: #23363c; font: 750 .73rem/1.25 var(--font-mono); overflow-wrap: anywhere; }
|
||||
.map-callout p,
|
||||
.checkpoint-ledger p,
|
||||
.runtime-grid p,
|
||||
.repro-grid p,
|
||||
.token-contract p { margin: .45rem 0 0; color: #68736f; font-size: .61rem; line-height: 1.5; }
|
||||
.offload-flow { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1rem; align-items: center; margin-top: 1rem; }
|
||||
.offload-flow > article { padding: 1rem; border: 1px solid rgba(30,38,43,.14); }
|
||||
.offload-flow .gpu { color: white; background: #275d59; }
|
||||
.offload-flow .cpu { color: white; background: #704a3c; }
|
||||
.offload-flow header { display: flex; justify-content: space-between; gap: 1rem; font: 690 .61rem/1.2 var(--font-mono); }
|
||||
.offload-flow p { margin: .7rem 0 0; color: rgba(255,255,255,.75); font-size: .63rem; line-height: 1.5; }
|
||||
.memory-track { height: .65rem; margin-top: .8rem; background: rgba(255,255,255,.18); }
|
||||
.memory-track i { display: block; width: var(--fill); height: 100%; background: #d7a16e; }
|
||||
.offload-arrow { text-align: center; color: #6b716e; }
|
||||
.offload-arrow span,
|
||||
.offload-arrow small { display: block; font: .5rem/1.2 var(--font-mono); }
|
||||
.offload-arrow b { display: block; color: #b35b36; font-size: 1.6rem; }
|
||||
.layer-device-map { display: grid; grid-template-columns: repeat(15, 1fr); gap: 2px; margin-top: 1rem; }
|
||||
.layer-device-map span { display: grid; place-items: center; min-height: 3rem; padding: .3rem .1rem; color: white; background: #34786e; }
|
||||
.layer-device-map span.cpu { background: #875744; }
|
||||
.layer-device-map b { font: 720 .55rem/1 var(--font-mono); }
|
||||
.layer-device-map small { margin-top: .2rem; opacity: .7; font: .43rem/1 var(--font-mono); }
|
||||
.runtime-grid { grid-template-columns: repeat(4, 1fr); }
|
||||
.runtime-grid article.warning { background: rgba(177,86,48,.14); }
|
||||
.evidence-ladder { display: grid; grid-template-columns: 1fr auto 1fr auto 1fr; gap: .7rem; align-items: center; }
|
||||
.evidence-ladder article { min-height: 10rem; padding: 1rem; border: 1px solid rgba(30,38,43,.15); background: #eeeae0; }
|
||||
.evidence-ladder article.active { color: white; background: #24464d; }
|
||||
.evidence-ladder > i { color: #b15b37; font-size: 1.5rem; }
|
||||
.evidence-ladder span { color: #a35434; font: 730 .54rem/1.2 var(--font-mono); }
|
||||
.evidence-ladder article.active span { color: #7cc2b6; }
|
||||
.evidence-ladder b { display: block; margin-top: .5rem; font: 760 .82rem/1.2 var(--font-mono); }
|
||||
.evidence-ladder p { margin: .7rem 0; color: #626e6b; font-size: .65rem; line-height: 1.55; }
|
||||
.evidence-ladder article.active p { color: rgba(255,255,255,.76); }
|
||||
.evidence-ladder em { color: #a85534; font: 680 .57rem/1.4 var(--font-mono); }
|
||||
.evidence-ladder article.active em { color: #e2aa7c; }
|
||||
.token-contract { grid-template-columns: repeat(4, 1fr); }
|
||||
.token-contract article.official { background: rgba(53,126,106,.13); }
|
||||
.repro-grid { grid-template-columns: repeat(4, 1fr); }
|
||||
.repro-grid article.pass { background: rgba(53,126,106,.12); }
|
||||
.repro-grid article.limit { background: rgba(180,91,52,.14); }
|
||||
.forbidden-claims { background: #402e2b; }
|
||||
.forbidden-claims b { color: #e0a178; font: 740 .61rem/1.3 var(--font-mono); }
|
||||
.artifact-links { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1rem; }
|
||||
.artifact-links a { padding: .55rem .7rem; color: #2d625b; border: 1px solid rgba(45,98,91,.25); background: rgba(45,98,91,.06); font: 680 .57rem/1.2 var(--font-mono); }
|
||||
.behavior-lab figcaption { padding: .9rem 1.55rem; color: #75807c; border-top: 1px solid rgba(30,38,43,.13); background: #e8e4d9; font-size: .59rem; line-height: 1.5; }
|
||||
.behavior-lab figcaption span { color: #a65031; font-weight: 750; }
|
||||
.behavior-lab figcaption code { font-size: .55rem; overflow-wrap: anywhere; }
|
||||
@media (max-width: 980px) {
|
||||
.behavior-head,
|
||||
.panel-lead { grid-template-columns: 1fr; }
|
||||
.behavior-ledger { grid-template-columns: repeat(2, 1fr); }
|
||||
.behavior-ledger article { border-bottom: 1px solid rgba(30,38,43,.12); }
|
||||
.behavior-tabs { grid-template-columns: repeat(2, 1fr); }
|
||||
.behavior-tabs button:nth-child(2) { border-right: 0; }
|
||||
.behavior-tabs button:nth-child(-n+2) { border-bottom: 1px solid rgba(30,38,43,.14); }
|
||||
.source-contract { grid-template-columns: repeat(2, 1fr); }
|
||||
.output-pair { grid-template-columns: 1fr; }
|
||||
.map-callout,
|
||||
.checkpoint-ledger { grid-template-columns: 1fr; }
|
||||
.layer-device-map { grid-template-columns: repeat(10, 1fr); }
|
||||
.runtime-grid,
|
||||
.token-contract,
|
||||
.repro-grid { grid-template-columns: repeat(2, 1fr); }
|
||||
.evidence-ladder { grid-template-columns: 1fr; }
|
||||
.evidence-ladder > i { transform: rotate(90deg); text-align: center; }
|
||||
}
|
||||
@media (max-width: 620px) {
|
||||
.behavior-head,
|
||||
.behavior-panel { padding: 1rem; }
|
||||
.behavior-ledger { grid-template-columns: 1fr; }
|
||||
.behavior-ledger article { border-right: 0; }
|
||||
.behavior-tabs { display: flex; overflow-x: auto; }
|
||||
.behavior-tabs button { flex: 1 0 10.5rem; border-bottom: 0 !important; }
|
||||
.pair-controls,
|
||||
.source-contract,
|
||||
.pair-metrics,
|
||||
.map-control { grid-template-columns: 1fr; }
|
||||
.pair-metrics { grid-template-columns: repeat(2, 1fr); }
|
||||
.output-pair dl { grid-template-columns: 1fr; }
|
||||
.output-pair dl div { border-right: 0; border-bottom: 1px solid rgba(30,38,43,.09); }
|
||||
.output-pair > article > p { min-height: 10rem; max-height: 19rem; }
|
||||
.pair-reading,
|
||||
.forbidden-claims { grid-template-columns: 1fr; }
|
||||
.edge-map { overflow-x: auto; }
|
||||
.edge-map > header,
|
||||
.edge-map > button { min-width: 35rem; }
|
||||
.offload-flow { grid-template-columns: 1fr; }
|
||||
.offload-arrow b { transform: rotate(90deg); }
|
||||
.layer-device-map { grid-template-columns: repeat(5, 1fr); }
|
||||
.runtime-grid,
|
||||
.token-contract,
|
||||
.repro-grid { grid-template-columns: 1fr; }
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
||||
import DeepSeekLineage from "@/components/DeepSeekLineage.astro";
|
||||
import DeepSeekLab from "@/components/DeepSeekLab.astro";
|
||||
import DeepSeekArtifactLab from "@/components/DeepSeekArtifactLab.astro";
|
||||
import DeepSeekBehaviorLab from "@/components/DeepSeekBehaviorLab.astro";
|
||||
import { deepseekBranches, deepseekLedgers, deepseekPaperChain, deepseekWaves } from "@/data/deepseek";
|
||||
|
||||
const toc = [
|
||||
@@ -29,21 +30,22 @@ const toc = [
|
||||
["20", "k3", "与 K3 的继承边界"],
|
||||
["21", "lab", "四联交互实验"],
|
||||
["22", "artifact", "真实权重执行"],
|
||||
["23", "branches", "别漏掉旁支"],
|
||||
["24", "audit", "事实、推导与教学模型"],
|
||||
["23", "behavior", "Chat:最终生成行为"],
|
||||
["24", "branches", "别漏掉旁支"],
|
||||
["25", "audit", "事实、推导与教学模型"],
|
||||
["↳", "papers", "六十节点阅读链"],
|
||||
];
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="DeepSeek 技术谱系与真实权重深读:从 Dense、MoE、MLA 到 R1 与 V4"
|
||||
description="用二十四张问题账、十次技术转向、十七个交互实验、真实 V2-Lite 权重、公开语料路由区间、官方模板、消息历史、等长 filler、特殊词元家族与完整角色块控制、吸收式缓存 trace 和六十个一手节点,完整理解 DeepSeek 的 MoE、MLA、FP8、DualPipe、GRPO、R1、V3.2 与 V4。"
|
||||
description="用二十四张问题账、十次技术转向、十八个交互实验、真实 V2-Lite Base / Chat 权重、公开语料路由区间、官方模板、消息历史、等长 filler、特殊词元家族、完整角色块与最终生成行为控制、吸收式缓存 trace 和六十个一手节点,完整理解 DeepSeek 的 MoE、MLA、FP8、DualPipe、GRPO、R1、V3.2 与 V4。"
|
||||
section="deepseek"
|
||||
>
|
||||
<header class="page-hero deepseek-hero">
|
||||
<div class="page-hero-inner">
|
||||
<div>
|
||||
<p class="eyebrow"><span>SPOTLIGHT / DEEPSEEK · ROUND 03</span> ALGORITHM × SYSTEM × REAL WEIGHTS</p>
|
||||
<p class="eyebrow"><span>SPOTLIGHT / DEEPSEEK · ROUND 04</span> ROUTING × CHAT OUTPUT × REAL WEIGHTS</p>
|
||||
<h1>不要背模型名<br />要看懂每次为什么转向</h1>
|
||||
<p class="lead">
|
||||
这不是七篇报告的摘要,而是一套可追问、可计算、可反驳的技术谱系:
|
||||
@@ -55,7 +57,7 @@ const toc = [
|
||||
<div><dt>SPAN</dt><dd>2024.01 → 2026.06</dd></div>
|
||||
<div><dt>LEDGERS</dt><dd>24 张问题账</dd></div>
|
||||
<div><dt>LINEAGE</dt><dd>10 次技术转向</dd></div>
|
||||
<div><dt>LABS</dt><dd>17 个可操作实验</dd></div>
|
||||
<div><dt>LABS</dt><dd>18 个可操作实验</dd></div>
|
||||
<div><dt>EVIDENCE</dt><dd>60 个一手 / 官方节点</dd></div>
|
||||
<div><dt>STATUS</dt><dd>三轮 · 真实权重执行</dd></div>
|
||||
</dl>
|
||||
@@ -781,8 +783,20 @@ const toc = [
|
||||
<DeepSeekArtifactLab />
|
||||
</section>
|
||||
|
||||
<section class="article-section" id="behavior">
|
||||
<p class="eyebrow"><span>23</span> ROUTING IS NOT THE ANSWER</p>
|
||||
<h2>第七层之后不再只看 expert:加载完整 Chat 权重,实际生成 128 个输出</h2>
|
||||
<p class="lede">
|
||||
Base checkpoint 的路由实验回答“输入协议怎样改变专家路径”,却不能告诉我们模型最终说了什么。
|
||||
这一轮固定官方 <code>DeepSeek-V2-Lite-Chat</code> revision 与 31,412,968,448 bytes BF16 参数,
|
||||
把同一批 source 带进完整 27 层 generation。由于本机 32GB 显存低于官方 40GB 单卡边界,
|
||||
layers 25–26、final norm 与 LM head 明确落到 CPU;offload 事实、截断率和复跑覆盖都直接展示。
|
||||
</p>
|
||||
<DeepSeekBehaviorLab />
|
||||
</section>
|
||||
|
||||
<section class="article-section" id="branches">
|
||||
<p class="eyebrow"><span>23</span> THE MAIN LINE IS NOT THE WHOLE TREE</p>
|
||||
<p class="eyebrow"><span>24</span> THE MAIN LINE IS NOT THE WHOLE TREE</p>
|
||||
<h2>如果只读 V2 → V3 → R1 → V4,会漏掉五条反过来影响主线的旁支</h2>
|
||||
<div class="branch-grid">
|
||||
{deepseekBranches.map(([name, line, text, url]) => (
|
||||
@@ -802,7 +816,7 @@ const toc = [
|
||||
</section>
|
||||
|
||||
<section class="article-section" id="audit">
|
||||
<p class="eyebrow"><span>24</span> EVIDENCE AUDIT</p>
|
||||
<p class="eyebrow"><span>25</span> EVIDENCE AUDIT</p>
|
||||
<h2>同一张页面里有三种知识,它们的语气必须不同</h2>
|
||||
<div class="audit-grid">
|
||||
<article class="reported">
|
||||
|
||||
@@ -145,17 +145,18 @@ const paths = [
|
||||
</a>
|
||||
<a class="release-card deepseek-release" href="/deepseek/">
|
||||
<div>
|
||||
<p class="eyebrow"><span>NEW / DEEPSEEK ROUND 03</span> LINEAGE · REAL WEIGHTS · ROUTES · CACHE</p>
|
||||
<p class="eyebrow"><span>NEW / DEEPSEEK ROUND 04</span> LINEAGE · REAL WEIGHTS · ROUTES · GENERATION</p>
|
||||
<h2>从 Dense 到百万上下文:每次创新都在偿还上一代最贵的一张账</h2>
|
||||
<p>
|
||||
用二十四张问题账和十次技术转向走完 Dense→V4,再固定官方 V2-Lite 权重执行 7/27 层:
|
||||
逐 token 检查 3,240 次专家选择,并把 latent 状态与 HF eager cache 的实现差距摆在同一张账上。
|
||||
用二十四张问题账和十次技术转向走完 Dense→V4,再把 Base 路由证据接到官方
|
||||
V2-Lite-Chat 的 31.4 GB 完整 BF16 权重:16 个公开来源、8 种边界条件生成
|
||||
128 个输出,并把 31 个自然 EOS 与 97 个长度截断分开解释。
|
||||
</p>
|
||||
</div>
|
||||
<dl>
|
||||
<div><dt>LINEAGE</dt><dd>1991 → 2026 · 10 次转向</dd></div>
|
||||
<div><dt>NODES</dt><dd>60 个一手 / 官方节点</dd></div>
|
||||
<div><dt>LAB</dt><dd>4 公式实验 · 4 真实工件实验</dd></div>
|
||||
<div><dt>LAB</dt><dd>4 公式 · 13 Base 工件 · 1 Chat 行为</dd></div>
|
||||
</dl>
|
||||
<span class="release-arrow" aria-hidden="true">进入 DeepSeek 完整技术谱系 →</span>
|
||||
</a>
|
||||
|
||||
@@ -15,7 +15,7 @@ const workstreams = [
|
||||
{ label: "表示、位置与残差高速公路", value: 81, next: "加入真实 hidden-state / norm traces、长上下文位置外推复现与更多深层稳定性消融" },
|
||||
{ label: "Scaling Laws", value: 74, next: "加入真实拟合复现、置信区间与更多模型族对照" },
|
||||
{ label: "数据工程与预训练配方", value: 73, next: "逐图精读 FineWeb / DCLM,加入真实去重与 mixture traces" },
|
||||
{ label: "DeepSeek 专题", value: 98, next: "V2-Lite-Chat 生成/行为对照、完整 27 层与固定 batch content,再推进 SM90 FlashMLA、FP8/pipeline 与 R1-like RL" },
|
||||
{ label: "DeepSeek 专题", value: 98, next: "completion-aware 生成评测、完整 27 层与固定 batch content,再推进 SM90 FlashMLA、FP8/pipeline 与 R1-like RL" },
|
||||
{ label: "指令微调与人类偏好", value: 75, next: "加入真实偏好分歧样本、RM 长度偏置与 PPO/DPO 小模型复现" },
|
||||
{ label: "推理与测试时扩展", value: 76, next: "真实模型采样曲线、PRM 案例与逐篇图表精读" },
|
||||
{ label: "工具使用与长程 Agent", value: 74, next: "补真实环境 traces、cross-harness 对照、Agent RL 训练曲线与安全案例" },
|
||||
@@ -97,12 +97,12 @@ const workstreams = [
|
||||
<article><span>✓</span><h3>K3 报告已结构化拆解</h3><p>47 页报告目录、151 条参考来源和架构/后训练/系统主线已经提取。</p></article>
|
||||
<article><span>✓</span><h3>17 专题知识图</h3><p>从语言模型基础到评测安全,包含先修依赖和三条贯穿案例。</p></article>
|
||||
<article><span>✓</span><h3>编辑式网站系统</h3><p>响应式导航、章节模板、侧栏、进度、论文链和证据提示组件。</p></article>
|
||||
<article><span>✓</span><h3>八十四个原创交互视图</h3><p>K3 三轴图、八联报告实验与四联开放工件实验,DeepSeek 四联公式实验与十三联真实权重实验,以及语言模型前史、Transformer、表示深度、长上下文、MoE、推理、Agent、多模态、训练系统、推理服务、Scaling、数据工程、数值、Alignment 与评测安全专题。</p></article>
|
||||
<article><span>✓</span><h3>八十五个原创交互视图</h3><p>K3 三轴图、八联报告实验与四联开放工件实验,DeepSeek 四联公式实验、十三联 Base 工件实验与一联完整 Chat 行为实验,以及语言模型前史、Transformer、表示深度、长上下文、MoE、推理、Agent、多模态、训练系统、推理服务、Scaling、数据工程、数值、Alignment 与评测安全专题。</p></article>
|
||||
<article><span>✓</span><h3>十七篇首版长文</h3><p>K3、语言模型前史、Transformer、表示/位置/残差、DeepSeek、Scaling、数据工程、长上下文、MoE、后训练、推理、Agent、原生多模态、训练系统、推理服务、数值优化与评测安全专题。</p></article>
|
||||
<article><span>✓</span><h3>语言模型前史深度专题</h3><p>八张独立问题账、33 个正式节点、20 段长文与概率—向量—记忆—对齐四联实验。</p></article>
|
||||
<article><span>✓</span><h3>Transformer 深度专题</h3><p>十张独立问题账、40 个正式节点、21 段正文与 QKV—Mask—多头位置—Block 成本四联实验。</p></article>
|
||||
<article><span>✓</span><h3>表示、位置与残差高速公路深度专题</h3><p>二十张问题账、66 个一手节点、DeepSeek/Kimi 双谱系,以及 Token—位置—Norm—Residual/FFN 四联实验。</p></article>
|
||||
<article><span>✓</span><h3>DeepSeek 三轮真实权重里程碑</h3><p>在二十四张问题账、十次转向与四联公式实验上,新增 V2-Lite 7/27 层连续 forward、官方 V3 absorb,以及长度、模板、消息历史、边界、角色词头、完整 special inventory 与两-token 角色块控制;累计 11,289,744 次真实路由。最新两组八格各自 byte-exact:BOS 不复现 EOS,四 ID 的 2-vs-2 只作描述;head、delimiter 与 interaction 均无统一 system 调制方向。</p></article>
|
||||
<article><span>✓</span><h3>DeepSeek 四轮真实权重里程碑</h3><p>在 Base 路由与缓存实证上,新增官方 V2-Lite-Chat 的 31.4 GB 完整 BF16 生成:16 个公开来源 × 8 条件得到 128 个输出,31 个自然 EOS、97 个长度截断;独立复跑的 32 / 32 token 序列 exact。逐来源双输出、十边分歧、GPU/CPU offload 与证据边界共同组成第十八个实验,不把生成差异越界写成能力。</p></article>
|
||||
<article><span>✓</span><h3>Kimi K3 技术报告二轮深读</h3><p>三十二张问题账、Figure 1–16 / Table 1–5 审计、100 节点阅读链,以及 Delta—Decay—AttnRes—LatentMoE—SiTU—QB—MOPD—Cache 八联实验。</p></article>
|
||||
<article><span>✓</span><h3>Kimi K3 三轮开放工件里程碑</h3><p>固定官方 revisions,审计 96 个 shards、497,220 个 tensor entries 与真实 KDA / MLA / MoE / MoonViT shapes;四联实验分开显示层型、tensor anatomy、参数范围和复现边界。</p></article>
|
||||
<article><span>✓</span><h3>FlashKDA RTX 5090 执行闸门</h3><p>隔离 CUDA 13.0 / glibc 2.39 编译 sm_120a wheel;6/6 官方参考逐元素相等,并完成 fixed / varlen、三种 state mode 的 1,800 个 CUDA Event samples。</p></article>
|
||||
@@ -134,7 +134,7 @@ const workstreams = [
|
||||
<div class="queue-table">
|
||||
<div class="head"><b>优先级</b><b>专题</b><b>本轮交付</b><b>完成闸门</b></div>
|
||||
<div><span>P0</span><strong>K3 三轮</strong><p>开放权重 traces → FlashKDA / AttnRes / MoE 真实行为 → Figure 1–16 数值重绘与独立复现</p><em>运行证据 + 逐图复现</em></div>
|
||||
<div><span>P0</span><strong>DeepSeek 三轮</strong><p>V2-Lite-Chat 生成/行为对照 → 完整 27 层与固定 batch content → SM90 FlashMLA / FP8 / pipeline traces → R1-like RL 小模型复现</p><em>运行证据 + 独立复现</em></div>
|
||||
<div><span>P0</span><strong>DeepSeek 四轮</strong><p>completion-aware 行为评测 → 完整 27 层与固定 batch content → SM90 FlashMLA / FP8 / pipeline traces → R1-like RL 小模型复现</p><em>运行证据 + 独立复现</em></div>
|
||||
<div><span>P0</span><strong>Transformer 二轮</strong><p>多头电路逐图 → Pre/Post-LN 真实 traces → Flash/KV 配置与 kernel 对照</p><em>逐图笔记 + 实测边界</em></div>
|
||||
<div><span>P0</span><strong>表示、位置与残差二轮</strong><p>真实 hidden-state / norm traces → 长上下文位置外推 → mHC / AttnRes 深层稳定性消融</p><em>可复现实验 + 逐图笔记</em></div>
|
||||
<div><span>P0</span><strong>语言模型前史二轮</strong><p>Kneser–Ney / LSTM / Bahdanau 逐图 → 真实小语料复现 → tokenizer 公平性</p><em>可复现实验 + 逐图笔记</em></div>
|
||||
@@ -226,6 +226,9 @@ const workstreams = [
|
||||
<div><time>2026-07-29</time><b>完整 special inventory 与普通对照分身份</b><p>BOS/EOS 穷尽固定 tokenizer 的两个 special IDs;x/句点只是两个选定普通对照,2-vs-2 只描述四个 ID。</p></div>
|
||||
<div><time>2026-07-29</time><b>两-token 角色块按因子分解</b><p>`User:` / `Assistant:` 都是 head + delimiter 两个普通 IDs;head、delimiter、interaction 与直接边分别记账。</p></div>
|
||||
<div><time>2026-07-29</time><b>下游目标与完整输入分因果身份</b><p>目标内容只看编辑位置后的精确对齐路由;完整输入包含被编辑 token 自身,只作稳健性账。</p></div>
|
||||
<div><time>2026-07-29</time><b>Chat、生成行为与能力永久分层</b><p>完整官方 Chat 权重可以支撑真实生成;成对输出分歧只证明干预传播,没有 evaluator 与足够 completion 就不升级成能力判断。</p></div>
|
||||
<div><time>2026-07-29</time><b>completion 是生成实验的首要审计字段</b><p>31 / 128 自然 EOS 与 97 / 128 长度截断同时显示;截断答案不冒充完整回答。</p></div>
|
||||
<div><time>2026-07-29</time><b>offload 拓扑进入复现合同</b><p>31.4 GB BF16 权重按 GPU 25 层、CPU 2 层 + norm / lm_head 执行;设备切分不被写成模型结构。</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user