dsh-lessons:在 DSH 里用任务边界与结构化复盘沉淀 Agent 经验

前言

在 DeepSeek Harness(DSH)里跑 Agent,常见问题是:同类失误会在不同任务里重复出现;当前会话结束后,上下文不一定保留;换一个新会话,之前的修正也不一定被沿用。只靠加长 system prompt 能塞下静态规则,却很难自然记录「这次具体出了什么问题、怎么改的、后来有没有再验证」。

下面介绍社区插件 dsh-lessons(维护者 duahciM,SkillHub 分类为工作流)。它尝试把「任务执行 → 结束复盘 → 结构化记忆 → 后续按作用域注入」串成闭环,让一次任务里形成的经验有机会迁移到后续独立任务。README 与目录页均标明这是实验品,效果不保证;是否值得接入,需要结合自己的任务形态和合规要求自行判断。

这是什么

dsh-lessons 是 DSH 上的元认知类插件:用 task_start / task_end 划定任务边界,在任务结束时生成决策轨迹与复盘材料,经 task_reflect 把经验写成可治理的记忆,并按 global、session、reflection 三层作用域注入 system prompt 的 ## Accumulated Lessons 区段。

  • 插件包名:dsh-lessons,当前版本 0.2.2(MIT 许可证)
  • 运行环境:README 写明 DeepSeek Harness 0.2.2-rc.1;package.json 要求 dsh >=0.2.1-rc.5,Node ^22.19.0 || >=24.0.0
  • 社区目录:SkillHub - dsh-lessons(独立社区站点,与 DeepSeek / 幻方无官方从属关系)
  • 源码:github.com/duahciM/dsh-lessons

插件在分工上明确:程序负责记录、结构校验与注入流程;模型负责语义分类、冲突判断和任务反思。

核心机制

闭环与四个工具

插件设想的闭环如下:

任务开始 → 决策 → 任务结束 → Agent反思 → 结构化记忆
   ↑                                           │
   └──────────── 后续任务读取并应用经验 ────────┘

对外暴露四个工具(名称与参数以 README 为准):

工具 作用
task_start(goal, expected_result) 声明任务目标与预期结果,建立任务记录
task_end(task_id, status, result) 声明任务结果,关闭任务并生成复盘材料
task_reflect(task_id, assessment, source, lessons[]) 保存 Agent 对任务的反思和经验
lessons_lookup(lesson_id) 按需追溯一条经验的完整来源(只读)

task_end 会在任务时间窗内整理决策轨迹(用户请求与纠正、Agent 对外表述等),反思对象是 Agent 的工作决策,而不是完整的工具调用技巧清单。任务状态包括 succeeded、failed、abandoned、aborted。

三层记忆与注入

层 主要用途 默认作用范围
global 跨任务通用的方法论 所有会话
session 与特定会话/项目背景绑定的约束或经验 指定会话
reflection 从具体任务反思中产生的经验 产生该经验的会话

注入由作用域决定;经验可晋升到 global 或指定 session,晋升是状态迁移而非复制条目。三层目前渲染在同一 system prompt 区段,按层分组。

经验字段与治理

单条经验的核心字段包括:problem(现象)、attempted(当时做法)、correction(应当怎么做)、applies_when(适用条件)、confidence(low/medium/high)。写入时由模型声明与已有经验的关系:new / repeat / revise / none;生命周期含 active、superseded、deprecated、deleted 等。冲突关系可声明为 condition、goal、contradiction、apparent,渲染时并列呈现,不由程序自动裁决。

决策环境快照

task_start 会把当时实际生效的经验冻结进 task_open 记录,避免事后修改记忆库改写历史任务「当时看到的约束」。反思材料里可呈现 DECISION ENVIRONMENT 段;渲染是否简略由配置项 environmentInBrief(默认 true)控制。记录与渲染可分开取舍:快照始终落盘,关掉简略渲染可减少复盘时的 token,但不影响按 id 反查。

默认开启的 silentReflection 要求模型在思维链内完成复盘,直接调用 task_reflect,对外最多一行说明任务是否成功,以减少重复输出 token 和决策轨迹污染(详见 README 第 2.4 节实测说明)。

安装与启用

依赖方面:无外部服务,零 npm 依赖(仅 Node 内置模块)。安装前建议浏览仓库源码与 MIT 许可证;插件以当前 dsh 进程权限运行,数据目录由你配置,需自行评估路径与备份策略。

方式 A:DSH 界面(推荐)

  1. 打开 DSH,进入 插件 → 添加插件。
  2. 输入 dsh-lessons(或仓库地址 https://github.com/duahciM/dsh-lessons),点击 安装。
  3. 安装完成后点击 立即启用。

方式 B:命令行

Web 模式示例:

dsh plugin --profile web add dsh-lessons

命令行安装后请重启 dsh web。Headless 用户请使用 --profile headless。

配置要点

插件通过 cordis.patch.yml 挂载;下列片段摘自官方文档,安装后可在对应配置中按需修改路径与开关:

- insert:
    - id: lessons
      name: 'dsh-lessons'
      config:
        taskDir: '<你的数据目录>/dsh-lessons-data'
        fsyncEvery: 16
        taskBoundaryHints: true
        injectReflection: true
        recordEvents: true
        stateFromFile: true
        silentReflection: true
        lessons:
          enabled: true
          maxLessons: 0
          diagnostics: true
          scopes:
            global: true
            session: true
            reflection: true
          batching: true
          instantNotice: true
          commitEvery: 8
          commitEveryTokens: 0

taskDir 决定任务记录与经验的存放位置。stateFromFile: true(默认)时,进程重启可从 tasks.jsonl 重建进行中任务等状态,避免 task_end 报 no open task。batching 与 instantNotice 用于在「system prompt 全量重算成本高」与「新反思尽快可见」之间折中:未达提交阈值时先发 plugin 通知,达到 commitEvery 等阈值后再更新 system prompt 区段。

典型用法

Agent 侧流程

系统提示会引导 Agent:任务开始前调用 task_start(文档要求其为任务第一项动作);有明确结果后调用 task_end;根据复盘材料调用 task_reflect 写入结构化经验。若任务开始后才补开 task_start,插件无法补回此前未收录的决策过程——这是 README 明确写明的限制。

需要追溯某条经验时,由 Agent 自行决定是否调用 lessons_lookup(lesson_id),以换取完整来源链(目标、结果、事件区间、任务开启时的其他经验等),而不是在每次反思时预塞全部来历。

人工维护记忆

在插件目录下,可用附带的 CLI 做审计与治理(会话 id 等参数以你环境为准):

node tools/lessons.mjs list --session <会话id>
node tools/lessons.mjs check
node tools/lessons.mjs add --scope global --pattern "…" --correction "…" \
     --applies-when "…" --boundary "为什么属于这一层"
node tools/lessons.mjs move <id> --to global
node tools/lessons.mjs remove <id>
node tools/lessons.mjs remove <id> --yes
node tools/deprecate.mjs <id> --reason "…"
node tools/deprecate.mjs --list

remove 默认只预览、exit 3 等待确认;--yes 才写入墓碑。这与 README 中「危险操作需审批」的设计一致。

适用场景与注意

更适合谁: 希望在 DSH 工作流里显式区分「任务边界」、愿意让 Agent 在任务结束后做结构化复盘,并把经验按会话/全局分层注入后续对话的团队或个人。SkillHub 将其归入工作流类插件,与「纯工具封装」型插件的定位不同。

务必留意的限制(摘自 README 第三节,此处只列要点):

  1. 任务边界仍依赖模型是否调用 task_start / task_end,漏开会缺决策轨迹。
  2. 分层、冲突、重复等语义判断由模型负责,结构检查器无法识别「分错层」或空泛 boundary。
  3. 三层共用一个 system prompt section,内容变化可能触发较大范围的提示词缓存重算(README 给出过量级实测,因使用方式而异)。
  4. 插件自述为实验品,第四节实验数据需在仓库内查阅,不宜在未经复现的情况下当作生产 SLA。

经过上面的步骤,若你已在测试环境验证安装、数据目录权限与复盘流程,再推广到日常会话会更稳妥。

结尾

dsh-lessons 把 DSH「一切皆插件」的思路落到 Agent 元认知上:用工具划定任务、用结构化字段沉淀经验、用作用域与治理规则控制注入,并保留按需溯源能力。它不替代你自己的评测与合规流程,而是在 Harness 内多一层可审计的记忆闭环。

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

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

Xiaoye