dsh-self-evolution:为 DeepSeek Harness 补上可边界约束的自进化记忆层

前言

DeepSeek Harness(DSH)默认每次会话从零开始:昨天一起摸清的构建命令、部署细节、被你纠正过的偏好,新开会话里都不会自动带上。社区里 Hermes Agent 用有界记忆文件和回合结束后的自动回顾解决类似问题;DSH 具备 ctx.tools 与 ctx.systemPrompt 等原语,但开箱并没有同等实现。

下面介绍维护者 Tommy00748 在 SkillHub 目录 与 GitHub 仓库 发布的 dsh-self-evolution(当前 package 版本 0.9.0,MIT 许可证)。它把 Hermes 的自改进循环移植到 DSH 插件形态,不修改 DSH 核心;记忆文件格式与 Hermes 字节级兼容,可互换。分类上属于「记忆」类插件。

这是什么

一句话:DSH 上的自进化层——有界长期记忆、每回合自动回顾、程序化技能写入与合并、技能健康检查、跨会话检索,以及「有内容才出现」的学习提示(对话内持久行 + 输入框上方卡片)。

设计目标之一是:自动学习可以长期开着,而不必担心写坏文件、悄悄删改记忆,或通知被当成一闪而过的 toast 而错过。

核心功能

1. 有界、自管记忆

记忆落在 <dshHome>/self-evolution/ 下:

  • MEMORY.md:智能体笔记
  • USER.md:关于你的信息

条目以 § 分隔,格式与 Hermes 相同。工具支持 add / replace / remove / list;replace 与 remove 用唯一子串定位条目,歧义时拒绝操作。

默认容量与 Hermes 一致:MEMORY 2200 字符、USER 1375 字符;不会自动压缩。写满时工具返回 ok:false 并带上当前全部条目,便于同回合内合并后重试。完全重复条目会被拒绝。

写入前默认做安全扫描(可用 scanOnWrite: false 关闭):不可见 Unicode、指令注入、私钥与云凭证、authorized_keys、curl … | sh 等。命中则拒绝写入。

记忆通过系统提示词段落 self-evolution:memory(order 100,interpolate: false,记忆正文不会被当作 {{template}} 解析)注入,标题行会显示占用比例,例如 [67% — 1474/2200 chars]。

2. skill_learn:把流程写成可加载的技能

将刚跑通的流程写成 DSH 实际扫描目录下的 SKILL.md,默认根目录为 <projectRoot>/.dsh/skills(在工作区内,无需额外审批或重启)。

写入后会立即重读并 lint;若加载器会丢弃该文件则回滚,不会报告「已保存」却实际不可用。frontmatter 标量以 JSON 双引号形式输出,减少 YAML 解析失败导致技能被静默丢弃的情况;description 超过 500 字符会直接拒绝(目录会静默截断更长描述)。

3. skill_doctor:发现会被静默丢弃的技能

DSH 对 frontmatter 解析失败的技能静默丢弃且无警告。skill_doctor 扫描 DSH 读取的所有技能根,区分:

  • 加载错误:无 frontmatter、缺 name/description、非 kebab-case 名称、未加引号且含 ": "、未闭合引号等;
  • 质量警告:如 description 过长。

fix: true 时仅 surgical 修复 offending 行,其余字节不动,并备份为 <file>.bak-<timestamp>,修复后再次校验,无法验证则放弃。

4. 回合结束自动回顾

监听 turn/end,用辅助模型(无工具、JSON 输出)判断本回合是否值得保留。中断或错误结束的回合不会学习;工具步数少于 reviewMinSteps(默认 2)视为琐碎;同一时刻只跑一条回顾。

输入为回合末尾最多 reviewMaxEvents(40)条事件的紧凑文本,字符上限 reviewMaxChars(6000)。输出契约为严格 JSON,包含 memory、skill 与 reason;提示词要求克制,0–2 条记忆、空结果也合法。

落地路径与手动工具相同(扫描、限额、去重、读回校验)。失败(模型不可用、超时、非法 JSON、写入被拒)全部吞掉,不影响当前会话。技能侧支持 create 与 improve:后者会二次调用模型把新知识合并进已有技能并压缩,避免近重复技能堆积;合并体超过 skillMaxChars(12000)则拒绝并保持旧版。reviewSkillUpdates: false 可关闭改写,仅保留新建。

自动回顾只能追加记忆;删除或改写需排队等你批准(见下文「信任与审批」)。

搜索历史会话中的真实消息(与智能体主动写入的 MEMORY 互补)。模式包括 search(全文,可限定 session_id)、list(最近会话)、read(按 seq 读窗口上下文)。

README 建议:一次搜一个 distinctive 词;多词按精确短语匹配。中文按词切分,无 Hermes 式 CJK 分词器时,子串级检索可用 grep 扫文件。

该工具可选注册:无搜索后端时插件其余部分仍可用。启用需在 profile patch 中覆盖 DSH 的 session 查询插件,例如:

- id: session-query-sqlite
  name: '@deepseek-ai/dsh-session-query-sqlite'
  config:
    path: '/Users/<you>/.dsh/storages/session-search.db'
    openAt: first-search      # startup | first-search | never

索引为独立派生库,可安全删除重建;勿指向会话持久化库本身(单进程索引)。

6. 对话内的学习记录与输入框卡片

有学习发生时,会在对应回答之后写入一条持久 context 行(可 transcriptRow: false 关闭),摘要类似「记住了一条经验:…」;展开可见回顾理由、记忆占用与当前条目。正文以 [self-evolution record · not a message from the user] 开头,避免被误读为用户消息;每回合最多一行,且在回合已 idle 后写入,不会触发额外一步。

输入框上方:无新闻时仅占 stats 行里一个 faint ◈;有学习或待审批变更时出现一行可点击摘要,点击展开面板(待审批、MEMORY/USER 用量、近期学习时间线、当前条目)。待审批项或面板打开时卡片保持可见;已读状态存于浏览器 localStorage(dsh:self-evolution:seen)。

系统提示里还可注入一段稳定的 guidance(默认 guidance: true),说明何时写记忆、何时提炼技能、写前查容量、用户纠正优先等。

安装与启用

安装命令来自仓库 README(非 npm 发布包):

dsh plugin --profile <your-profile> add github:Tommy00748/dsh-self-evolution

然后在 profile 的 cordis.patch.yml(路径形如 ~/.dsh/profiles/<profile>/cordis.patch.yml)加入 bundle:

- id: self-evolution
  name: 'dsh-self-evolution'
  config:
    memoryCharLimit: 2200
    userCharLimit: 1375

主机侧(工具、提示词段、HTTP 路由)在下次启动 DSH 后加载;客户端 client.js 可被 DSH 轮询热更新,index.js 变更需重启。

运行环境:package.json 要求 Node >= 22,并依赖 @deepseek-ai/dsh-tools、@deepseek-ai/dsh-llm、@deepseek-ai/schemastery 等 peer 依赖(随已安装的 DSH 提供)。

卸载时从 profile 的 dsh.profile.bundles 移除 bundle 并删除包;不会自动删除 <dshHome>/self-evolution/ 下的记忆与技能文件,需自行清理。

配置要点

在 profile 的 cordis.patch.yml 里用 id self-evolution 覆盖配置。Patch 会整体替换 config 对象,不会字段级合并,因此要列出你想保留的全部键。

常用项包括:storeDir、skillsDir、extraSkillDirs、enableMemoryTool、enableSkillTools、autoReview、reviewProvider / reviewModel、approveReviewEdits(默认 true:删改需批准;false 则自动合并)、uiMode、notify、scanOnWrite 等。完整列表见仓库 README 的 Configuration 一节。

典型用法

  1. 安装并写入 profile patch 后重启 DSH,正常对话;复杂任务结束后,自动回顾可能写入 MEMORY 或改进/新建 .dsh/skills 下的技能。
  2. 需要主动固化流程时,让模型调用 skill_learn;怀疑技能「写了却从不生效」时,调用 skill_doctor(必要时 fix: true)。
  3. 记忆写满时,根据工具返回的现有条目在同回合合并后再 add。
  4. 若要跨会话搜聊天记录,按 README 配置 session-query-sqlite 后使用 session_search;查询宜单词、 distinctive。
  5. 自动回顾提议删除或改写记忆时,在卡片里查看将被替换的全文后再批准;批准接口仅接受本机 loopback 且声明 JSON 的请求。

适用场景与注意

适合谁:长期在同一 DSH 环境做项目开发、希望构建/部署/偏好能跨会话保留,又希望技能文件不被 YAML 小错误静默吃掉的用户;也可与 Hermes 记忆文件迁移互换。

信任边界(务必阅读):插件通过主机进程的 node:fs 写入,不受会话文件沙箱约束。默认写入 <dshHome>/self-evolution/ 与 <projectRoot>/.dsh/skills/(均可配置)。记忆会持续注入系统提示词,故默认开启 scanOnWrite。安装前请自行审阅源码与 MIT 许可证;插件以当前 dsh 进程权限运行。

其他限制(摘自 README Known limits):对话行是 user-role 的 context 注入而非 system 行;卡片时间线只读、最多展示部分记录;session_search 为 SQLite unicode61 分词,非任意子串;记忆默认全局共享,可按项目将 storeDir 指到工作区内以隔离。

结尾

dsh-self-evolution 在 DSH「一切皆插件」的生态里,把有界记忆、回合回顾、技能精炼与可见的学习反馈接到一起,并围绕 unattended 写入做了 provenance、仅追加与审批队列等约束。若要进一步了解分类与简介,可看 SkillHub 目录页;安装、配置与测试说明以 GitHub 仓库 README 为准。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye