static-skill-capsule / index.html
Eason666's picture
Upload folder using huggingface_hub
0e78ceb verified
Raw
History Blame Contribute Delete
14.9 kB
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Static Skill Capsule — 从 mock 管线到真实任务的九个版本</title>
<style>
:root{--bg:#0d1117;--card:#161b22;--border:#30363d;--text:#e6edf3;--dim:#8b949e;
--good:#3fb950;--bad:#f85149;--warn:#d29922;--accent:#58a6ff;--purple:#bc8cff}
@media (prefers-color-scheme: light){:root{--bg:#ffffff;--card:#f6f8fa;--border:#d0d7de;
--text:#1f2328;--dim:#656d76;--accent:#0969da;--purple:#8250df}}
*{box-sizing:border-box}
body{margin:0;font-family:-apple-system,"Segoe UI","Noto Sans SC",sans-serif;
background:var(--bg);color:var(--text);line-height:1.65}
.wrap{max-width:980px;margin:0 auto;padding:24px 16px 80px}
h1{font-size:1.7em;margin:.3em 0}
h2{font-size:1.25em;border-bottom:1px solid var(--border);padding-bottom:.3em;margin-top:2.2em}
.phase{color:var(--accent);font-weight:700;font-family:ui-monospace,monospace;font-size:.85em}
.sub{color:var(--dim)}
table{border-collapse:collapse;width:100%;margin:1em 0;font-size:.9em}
.tblwrap{overflow-x:auto}
th,td{border:1px solid var(--border);padding:6px 10px;text-align:left}
th{background:var(--card)}
.good{color:var(--good);font-weight:600}.bad{color:var(--bad);font-weight:600}
.warn{color:var(--warn);font-weight:600}
.card{background:var(--card);border:1px solid var(--border);border-radius:8px;
padding:14px 16px;margin:14px 0}
.ex{border-left:4px solid var(--accent)}
.ex.problem{border-left-color:var(--bad)}
.ex.win{border-left-color:var(--good)}
.tag{display:inline-block;font-size:.75em;padding:1px 8px;border-radius:10px;
border:1px solid var(--border);color:var(--dim);margin-right:6px}
pre{background:rgba(110,118,129,.1);border:1px solid var(--border);border-radius:6px;
padding:10px 12px;overflow-x:auto;font-size:.82em;line-height:1.5;margin:.6em 0}
code{font-family:ui-monospace,"SF Mono",monospace}
.arrow{color:var(--dim)}
.strip{display:flex;flex-wrap:wrap;gap:10px;margin:1.2em 0}
.stat{flex:1 1 140px;background:var(--card);border:1px solid var(--border);
border-radius:8px;padding:10px 14px;text-align:center}
.stat b{display:block;font-size:1.5em}
.stat span{font-size:.78em;color:var(--dim)}
.lesson{border-left:4px solid var(--purple)}
footer{margin-top:3em;color:var(--dim);font-size:.85em;border-top:1px solid var(--border);padding-top:1em}
</style>
</head>
<body><div class="wrap">
<h1>💊 Static Skill Capsule</h1>
<p class="sub">决策级程序蒸馏(LoRA「技能胶囊」)能否替代长文本技能提示?——从 mock 管线到真实任务、
从单次训练到门控持续学习的完整研究弧线。九个版本、8 次门控判定(5 升 3 拒),每一步的进步与问题都有真实样例。
基座:Qwen2.5-7B-Instruct;所有数字来自盘上评测记录,无挑选。</p>
<div class="strip">
<div class="stat"><b>100 / 99%</b><span>capsule 在 mock test/OOD(v1 阶段)</span></div>
<div class="stat"><b>100% vs 12%</b><span>工具 API 演化下 capsule+binder vs 具体调用微调</span></div>
<div class="stat"><b>23.8→50.8%</b><span>真实指令任务:迁移起点 → 最终 v009</span></div>
<div class="stat"><b>8 判定</b><span>门控升降全审计(5 promote / 3 reject)</span></div>
</div>
<!-- ================= v0/v1 ================= -->
<h2><span class="phase">v0–v1</span> 蒸馏起步:胶囊、raw-state、工具演化</h2>
<p>把「文档文本修订」技能蒸馏成 5MB 的 LoRA:模型每步吐一个抽象决策
(<code>LOCATE_TARGET → APPLY_MODIFICATION → VALIDATE_RESULT → STOP</code>),
不带任何技能提示文本。主设定 raw-state:模型只看原始可见对象+上一步反馈。</p>
<div class="card ex problem">
<span class="tag">问题实例</span><b>7B 基座 + 完整技能提示:协议崩溃</b>
<pre>任务 textrev_test_000001 (mixed_relation)
full_skill_prompt → actions: [STOP] parse_failures: 1 ✗ 失败
<span class="arrow"># 基座模型撑不住 raw-state 长输入下的 JSON 协议:test 集 91% 解析失败,成功率 14%</span></pre>
</div>
<div class="card ex win">
<span class="tag">进步实例</span><b>同一任务,蒸馏胶囊(零技能文本)</b>
<pre>skill_capsule_lora → [LOCATE_TARGET → APPLY_MODIFICATION → VALIDATE_RESULT → STOP] ✓
<span class="arrow"># capsule:test 100%,OOD 99%;解析失败 0。蒸馏买到的是「可靠性」</span></pre>
</div>
<div class="card ex win">
<span class="tag">v1 头条</span><b>工具 API 演化:抽象动作 + 规则 binder 全免疫</b>
<pre>同一个抽象动作 LOCATE_TARGET{content:"DN100", region:…}
tool v1 → query_text(page, content, region) capsule+binder: 100%
tool v2 → search_text(page_id, text_equals, area) capsule+binder: 100%
tool v3 → list_text + filter_text_by_content + … capsule+binder: 100%
对照:把具体 v1 调用蒸进权重的 toolcall_lora,
tool v2 下 schema error 1.07 个/任务 → 成功率 12%(残余=恰好该 no-op 的任务)</pre>
</div>
<div class="card ex problem">
<span class="tag">诚实的问题</span><b>「省上下文」主张被撤回</b>
<p>raw-state 下胶囊每步重发可见对象,上下文 ~4k>fulltraj 单次 ~2.5k——v0 的「省上下文」
是 oracle 摘要造成的假象。胶囊的真优势是<b>鲁棒性</b>(OOD +22pt)与<b>可靠性</b>(0 解析失败),不是成本。</p>
</div>
<!-- ================= B6 ================= -->
<h2><span class="phase">B6</span> 公平对照:主流多步 Agent(OpenClaw)</h2>
<p>方法论质疑:「主流 agent 就是多步的,得和它比」。于是把同一任务塞进真实框架
OpenClaw(ReAct 运行时 + MCP 工具),同一个 Qwen2.5-7B、greedy 解码——只有运行时不同。</p>
<div class="tblwrap"><table>
<tr><th>系统</th><th>test</th><th>OOD</th><th>上下文 tok/任务(中位)</th></tr>
<tr><td>capsule(蒸馏)</td><td class="good">100%</td><td class="good">99%</td><td>~4k</td></tr>
<tr><td>B6 zero-shot</td><td>57%</td><td>45%</td><td>~46k</td></tr>
<tr><td>B6 few-shot</td><td>53%</td><td>38%</td><td>~57k(OOD 空转时中位 <b class="bad">77 万</b>)</td></tr>
</table></div>
<div class="card ex problem">
<span class="tag">问题实例</span><b>幻觉成功:一次工具没调,却报告完成</b>
<pre>任务 textrev_test_000046 tool_log = ['query_text'](从未调用 modify_text)
B6 回复:"No matches found … Therefore, no modifications were made.
The operation has completed successfully without any changes."
<span class="arrow"># 文档里目标就在区域内;ground-truth 判失败。7B 的典型模式:定位后不跟进(test 上 31/60 停在 query)</span></pre>
</div>
<div class="card ex problem">
<span class="tag">问题实例</span><b>OOD 失控空转</b>
<pre>34/60 个 OOD 任务:模型始终发不出合法工具调用,循环到框架轮次上限
中位 32 次模型调用/任务,烧掉中位 ~77 万 token 后放弃</pre>
</div>
<p class="sub">结论:框架给了脚手架(B6 远好于会崩的裸提示基线),但<b>蒸馏才带来可靠性</b>——
准确率与成本双输给胶囊。few-shot 修不动(噪声内)。</p>
<!-- ================= v2 ================= -->
<h2><span class="phase">v2</span> 门控持续蒸馏:经验 → 候选 → 闸门 → 升/拒</h2>
<p>循环:跑任务流 → 外部验证轨迹 → 经验缓冲 → 确定性回放编译训练样本 → 训候选 →
四闸门(老任务保持/新任务提升/工具/成本)→ 升级或拒绝。v001 刻意用受限课程训练,留出提升空间。</p>
<div class="tblwrap"><table>
<tr><th>版本</th><th>老任务</th><th>batch_002(已到 OOD)</th><th>batch_005(未到)</th><th>判定</th></tr>
<tr><td>v001</td><td>100</td><td>81.7</td><td>74.0</td><td>promoted(初始)</td></tr>
<tr><td>v002</td><td class="good">100</td><td class="good">97.5(+15.8)</td><td class="bad">61.0(−13)</td><td class="good">PROMOTED</td></tr>
<tr><td>v003 候选</td><td>100</td><td class="warn">90.8(吐回 6.7)</td><td>70.0(+9)</td><td class="bad">REJECTED:误改率 0.4→2.6%</td></tr>
</table></div>
<div class="card ex win"><span class="tag">进步</span>
一轮门控蒸馏 +15.8(198 条 on-policy 验证轨迹 + 120 个专家验证的定向难例),回放护住老任务零遗忘。</div>
<div class="card ex problem"><span class="tag">问题</span>
<b>闸门保护不了「还没到达」的分布</b>:batch_005 不在任何闸门里,升级决策依规正确,却发生 −13 负迁移。
恢复轮 v003 又被闸门正确拦下(跷跷板 + 误改率上升)——<b>门控系统第一次真实拦截</b></div>
<div class="card ex problem"><span class="tag">问题实例</span><b>skill.md 文本更新:灾难性失败</b>
<pre>v001 裸跑 batch_002:81.7%
v001 + 失败衍生规则块(skillmd_update):<b>11.7%</b>
<span class="arrow"># 裸训胶囊把任何前置规则文本当分布外输入 → 整体塌掉。
# 六机制对比:权重更新 97.5 ≫ 不更新 81.7 > 记忆检索 78.3 ≫ 文本规则 11.7;工具轴 binder-only 零成本 100%</span></pre>
</div>
<div class="card lesson"><span class="tag">上界实验</span>
全量联合重训(mock 内)拿到 99.2/88.0——<b>mock 内部的跷跷板是小步序贯更新的样本预算伪影</b>,不是数据冲突。这个结论在 v3 终局被部分推翻(见下)。</div>
<!-- ================= v3 ================= -->
<h2><span class="phase">v3</span> 真实任务:DrafterBench 指令 × 合成基底</h2>
<p>160 条真实 CAD 图纸修订指令(2⁵ 因子设计),ground-truth 代码 160/160 解析成 238 个操作 + 56 个
「指令残缺应弃权」任务;合成与之语义一致的文档基底。模型只看<b>逐字真实指令</b>,必须自己抽取目标。</p>
<div class="card ex problem">
<span class="tag">问题实例(E1 迁移)</span><b>mock 训练的胶囊,面对真实语言直接放弃</b>
<pre>真实指令:"For the file X987Y654.pdf, on page 7, in the second rectangle,
delete the strings "Draft Copy" and "Preliminary Version" … Align any remaining…"
v002(mock 训练)→ actions: [STOP] ✗
<span class="arrow"># E1 迁移墙:最好的 mock 胶囊总体 33%,specific 46%;rule_planner(直读字段)83.7% 证明程序可解——
# 墙在「从真实语言抽槽位」,不在程序</span></pre>
</div>
<div class="card ex win">
<span class="tag">进步实例(E2 蒸馏一轮后)</span><b>同一条指令,v004 正确抽取</b>
<pre>v004 → LOCATE_TARGET{content_constraint: "Draft Copy", …} → … ✓
<span class="arrow"># 554 条真实样本一轮:specific 18→51,总体 23.8→40.0。
# 但 mock 保持 94%&lt;97% 阈值 → v004 被拒;回放加倍后 v005:真实 38.4 + mock 98.7 → 升级</span></pre>
</div>
<h2><span class="phase">v6–v7</span> 攻坚:wildcard 与「有原则的弃权」</h2>
<div class="card ex win"><span class="tag">进步实例</span><b>wildcard:学会 <code>content_constraint:"*"</code></b>
<pre>真实指令:"…in the first rectangle, replace all horizontal text with "Updated Project Details"…"
v006 → LOCATE_TARGET{content_constraint: "*", spatial_scope: "selected_region"} ✓
<span class="arrow"># 900 条多措辞合成样本:wildcard 0→49%</span></pre>
</div>
<div class="card ex problem">
<span class="tag">问题实例</span><b>能力越强越敢对诱饵动手</b>
<pre>残缺指令(没指定文件):"On page 3, in the first rectangle, replace all horizontal text
with "Updated Legend", then delete the string "Outdated"…"
v006 → [LOCATE_TARGET{*} → APPLY_MODIFICATION → VALIDATE_RESULT → STOP] ✗ 自信的错误执行
<span class="arrow"># v006 弃权 19 个失败全是这种;真实 Error 象限的破绽是「缺文件名」「不支持的模态(vertical text)」——
# 和最初合成的缺参数类消融不匹配</span></pre>
</div>
<div class="card ex win">
<span class="tag">进步实例</span><b>v007:显式拒绝(完整性契约学会了)</b>
<pre>残缺指令:"For the file Layout789.pdf, in the second rectangle of the page,
replace all horizontal text with "Updated Layout Details"." ← 没说第几页
v007 → [REPAIR_SELECTION{failure_type:no_candidate, resolution:abort} → STOP] ✓ no_op
<span class="arrow"># 补齐 missing_file/unsupported_modality 消融 + 对比孪生对(同基底:残缺→拒 / 补全→做)+ 真实弃权×6
# 弃权 46→89%,且 31/31 全部是显式拒绝(非蒙对)</span></pre>
</div>
<h2><span class="phase">v8–v9</span> 终局:全量联合重训与 Pareto 前沿</h2>
<div class="tblwrap"><table>
<tr><th></th><th>v007(序贯)</th><th>v008(联合·自然配比)</th><th>v009(联合·拒绝×3)</th></tr>
<tr><td>real 总体</td><td>47.6</td><td>47.0</td><td class="good">50.8(项目最高)</td></tr>
<tr><td>real specific / wildcard</td><td>31.6 / 45.1</td><td class="good">45.6 / 50.7</td><td class="good">45.6 / 50.7</td></tr>
<tr><td>real 弃权</td><td class="good">88.6</td><td class="bad">42.9</td><td class="warn">62.9(91% 有原则)</td></tr>
<tr><td>mock / batch_005 / 工具</td><td>98.7 / 61 / 99</td><td class="good">100 / 94 / 100</td><td class="good">100 / 94 / 100</td></tr>
<tr><td>判定</td><td>曾升级</td><td class="bad">REJECTED</td><td class="good">PROMOTED(现任)</td></tr>
</table></div>
<div class="card lesson"><span class="tag">终局发现</span>
<b></b> 联合重训化解除弃权外的一切跷跷板;<b></b> 弃权崩塌(88.6→42.9)是<b>数据组成冲突</b>:
拒绝信号在自然配比里仅 7.5%,扛不住「永远执行」语料——加权到 13% 只收回到 62.9,
<b>v007 与 v009 是弃权↔执行 Pareto 前沿上的两个点</b>;<b></b> 聚合闸门以总体 +3.2 选了 v009,
尽管弃权切片对 v007 只有 0.71 的保持率——<b>「最好的模型」是闸门粒度的函数</b>,逐切片闸门是 v4 首项。</div>
<h2>贯穿全程的工程教训</h2>
<div class="card lesson">
<ul>
<li><b>Harness 永不因模型输出而崩</b>:幻觉的关系词 <code>"within"</code>、显式 <code>validation_policy: null</code>
MCP 把 null 变 <code>""</code> 导致 layer 过滤全空——每一个都曾让评测崩掉,修复原则相同:吸收、记为模型错误、继续打分。</li>
<li><b>两次「训练失败」同一根因</b>:HF Trainer 评估 batch 默认 8(训练 2),共享 GPU 上收尾 dev 评估必 OOM;
权重都从 checkpoint 完整抢救,修死后再未复发。</li>
<li><b>推理侧引导修不了训练侧的问题</b>:v0 的 preamble 教训在 v2 的 skillmd 基线(81.7→11.7)再次以更极端形式出现。</li>
<li><b>先诊断机制再修</b>:v006 弃权失败的逐条检查(19/19 都是自信执行)直接指出正确的消融分类,一轮修复到位。</li>
</ul>
</div>
<footer>Static Skill Capsule · Qwen2.5-7B-Instruct + LoRA(r=8)· 所有数字来自评测记录原文 ·
registry 生命周期:v001–v009,8 次门控判定(5 promote / 3 reject),promotion_log 全审计。</footer>
</div></body>
</html>