Spaces:
Running
Running
| <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%<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> | |