DSH Skill Studio:自动化技能蒸馏与语义合并插件

前言

DeepSeek Harness(DSH)的技能系统允许你在对话中积累可复用的操作步骤,但上游原版更多提供浏览、编辑和手动提取能力。如果你希望把每次对话中值得保存的经验自动沉淀到技能库,需要持续的人工介入。DSH Skill Studio 是对上游的社区分叉,它为无人值守使用增加了四个关键能力:每轮对话的价值判断、自动接受候选、语义合并以及使用 DSH 原生模型。

这是什么

DSH Skill Studio 是一个 DeepSeek Harness 插件,用于构建自改进的技能流水线。它会在对话结束后自动判断当前轮次是否值得提取,将候选技能与已有技能进行语义对比,决定是合并到现有条目还是新建,最终将合格条目写入技能库。维护者为 samir2015dzh,采用 MIT 许可证。

核心功能

  • 每轮价值判断:对话结束后约 3 秒,插件会向模型发送一个极简的 YES/NO 提示(从最近一轮会话抽取 10 个摘要),只有 YES 才会触发完整提取。判断被限制在 90 秒内,提取过程最多持续 5 分钟。

  • 直接入库:被接受的候选会写入 ~/.agents/skills,并在下一轮加载。只有写入失败时(如名称冲突)才会进入人工审核队列。

  • 语义合并而非堆文件:每个候选都会与整个技能库比对,只有真正新的主题才会创建新技能。本地相似度仅作预筛选,最终决策由模型基于完整目录做出。

  • 使用 DSH 原生模型:面板提供下拉选择,可从 DSH 中配置的提供商/模型列表中挑选。插件不存储 API 密钥,也不询问网关地址。

  • 面板增强:技能库面板中会列出最近修改过的技能,包含名称、描述和时间戳。

  • 写入清理:合并时会截断重复章节,剥离协议残留(如 MERGE:),并拒绝导致原文大幅丢失的合并结果。

合并流程

一个候选在写入前需通过四道关卡,任一关卡否决即转为新技能或丢弃。

new candidate
  │
  ├─ ① Tombstone:检查该名称是否曾被合并移除(扫描 ~/.dsh/skill-archive/*)。
  │     → 强制合并到同分类下体量最大的技能;若失败则丢弃,避免重复写入。
  │
  ├─ ② Category tags:从目录读取 "- [decompile] name: description"。
  │     → 模型在阅读正文前先看到分类标签。
  │
  ├─ ③ Local re-check:再次验证 FOLD_INTO 判决。
  │     → 同分类:接受;跨分类:要求相似度 ≥ 0.5,否则保存为独立技能。
  │
  └─ ④ 合并本身:模型将新经验折叠进现有章节。
        → 截断重复章节、剥离残留协议;结果若短于原内容 60% 则拒绝。

分类名称来源于技能名(如 gui-* → gui,decompiled-* / java-decompile-* → decompile,portable-* / offline-* → portable)。CATEGORY_ALIASES 位于 lib/extractor.js,可按需扩展。

安装与启用

插件通过 link: 依赖方式安装到 DSH 配置,代码修改无需重新发布。

  1. Clone 任意位置:
git clone <this-repo> D:/dsh-plugins/dsh-skill-studio
  1. 在配置文件 package.json 中注册:
{
  "dependencies": { "dsh-skill-studio": "link:D:/dsh-plugins/dsh-skill-studio" },
  "dsh": { "profile": { "bundles": ["dsh-skill-studio"] } }
}
  1. 将其创建为 Junction 链接至 node_modules:
New-Item -ItemType Junction `
  -Path "$env:DSH_PROFILE_DIR\node_modules\dsh-skill-studio" `
  -Target "D:\dsh-plugins\dsh-skill-studio"
  1. 重启 DSH,打开 Settings → Skill Studio。

配置

配置文件为 ~/.dsh/dsh-skill-studio/extractor.json(权限 0600)。

{
  "enabled": true,
  "autoPerTurn": true,
  "intervalMinutes": 60,
  "windowDays": 7,
  "maxCandidatesPerRun": 3,
  "autoAccept": true,
  "mergeThreshold": 0.2,
  "skillLanguage": "auto",
  "agentSkillDir": "C:\\Users\\<you>\\.agents\\skills",
  "provider": "",
  "model": ""
}
字段 用途
autoPerTurn 在每轮对话结束时运行 YES/NO 判断
intervalMinutes 降级轮扫间隔;设为 0 则仅依赖每轮触发
autoAccept 直接写入技能库,而非放入审核队列
mergeThreshold 本地相似度预筛选阈值(合并决策本身仍由模型做出)
skillLanguage auto / zh / en;代码、命令与路径不翻译
provider / model 留空则跟随触发会话;也可在面板中指定

遗留的 llmBaseUrl / llmApiKey / llmModel 字段仍可作为无 ctx.llm 环境的 HTTP 降级方案,正常使用时留空即可。

工具命令

工具 用途
skillmgr_list 列出所有技能,包含来源、状态与分组
skillmgr_get 读取单个技能全文
skillmgr_save 将完整 SKILL.md 写回
skillmgr_policy 切换模型/用户调用策略
skillmgr_extract_run 手动触发一次提取
skillmgr_extract_status 查看开关、间隔、队列深度与上次运行
skillmgr_extract_config 修改配置
skillmgr_extract_list / _accept / _reject 操作队列(autoAccept 开启时通常为空)

HTTP 路由位于 /api/dsh-skill-studio/*,面板即通过这些接口与插件通信。

调试

每次模型响应会输出到:

~/.dsh/dsh-skill-studio/last-llm-raw.txt

解析失败时,优先读取该文件:截断的 JSON、markdown 装饰或答非所问的问题可据此区分。

两个回归脚本均不接触真实技能库:

node scripts/e2e-preview.mjs    # extract → judge → merge → accept,6 个断言
node scripts/e2e-tombstone.mjs  # tombstone 胜过模型判决(模型先说 SAVE,后说 KEEP)

与上游的差异

完整列表见 FORK-NOTES.md(15 条)。要点包括:

  1. 模型调用通过 ctx.llm.prepareCall(),不存储凭证
  2. 每轮 YES/NO 判断与自动接受入库
  3. 语义合并:分类标签 + 模型判决 + 本地复查 + Tombstone
  4. 合并清洗:去重、剥离残留、短体拒绝
  5. 面板:最近添加列表与模型下拉框
  6. 提取输出截断恢复,maxTokens 提升至 8000

适用场景与注意

适合希望将对话中持续产出的经验沉淀为可复用技能的开发者,尤其是需要长期运行无人值守的场景。插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证。

小结

DSH Skill Studio 把技能的自动蒸馏与语义合并变成了流水线:每轮对话的价值判断、候选自动接受、与已有技能的语义比对与合并,全部在后台完成。配合 DSH 原生模型调用与面板监控,可以在不改变工作流的前提下,让技能库自然生长。

  • 插件主页:https://www.skillhub.cn/plugins/samir2015dzh/dsh-skill-studio-plus
  • GitHub:https://github.com/samir2015dzh/dsh-skill-studio-plus
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye