DeepSeek Harness 递归 Harness 插件

前言

DeepSeek Harness(DSH)的典型用法是给一个任务定义 prompt 和 workspace,然后运行 Agent。如果希望 Agent 在迭代中逐步变强,通常的做法是手动调整 system prompt 或反复重写任务脚本。这种方式对开发者要求高,且难以在多个任务间复用经验。

Recursive Harness 插件引入了两层递归演化机制,在模型权重不变的情况下,让 Harness 自身进化:任务内部做 Propose → Probe → Compose,任务之间通过 Reflector 积累经验库。这套逻辑来自 Google Research 的 Harness² 论文(arXiv:2610.14224)。

下面介绍这个插件如何工作,以及如何安装和配置。

插件定位

名称:dsh-plugin-recursive-harness
维护者:Bear0117
状态:实验性(experimental)
适用范围:DeepSeek Harness 0.2.x(测试于 0.2.0-rc.2)
Node.js 要求:22.19 或 24+

插件的目标是:当模型权重固定时,通过演化 Harness(包括 system prompt、guardrails、tool guidance、memory 和 skills)来提升 Agent 表现,并在不同任务间复用成功模式。

核心机制

插件在两个维度做递归演化。

任务内:Propose → Probe → Compose

对每个任务,插件按以下流程运行:

  1. Propose:模型提出两个候选 Harness。一个偏通用,用于强化推理和工具纪律;另一个偏领域,增加 memory、guardrails 和一个 skill。每次提出后,运行一轮 baseline(参考运行)。
  2. Probe:两个候选 Harness 在隔离的 headless dsh 实例中运行,各自拥有独立的任务 workspace。先通过 objective checks 决定是否通过,再通过行为指标(工具错误、步数、token 数)比较,可选模型 judge 做第三级判断。
  3. Compose:互补的赢家合并后再次验证;如果合并变差,则回退到表现最好的单候选。

每次迭代后,新的 active Harness 会写入 $DSH_HOME/recursive-harness/active/,新 Session 会自动加载。

任务间:Reflector → Experience Library

插件维护一个时间顺序的 Experience Library,记录哪些 Harness 配置在哪些任务上有效。每次运行结束后,Reflector 将结果写入 Markdown 条目,供后续任务的 Propose 使用。

演化范围

插件可以演化的组件包括:

  • systemprompt
  • guardrails
  • tool_guidance
  • longTermMemory
  • skills(SKILL.md + 小脚本)

以下内容保持不变:

  • AGENTS.md
  • .dsh/
  • .git/
  • lockedSurfaces 中列出的路径

安装与启用

安装命令(以 web profile 为例):

dsh plugin --profile web add dsh-plugin-recursive-harness

安装后重启 dsh web,终端会打印 [recursive-harness] ready: …。

更新插件:

dsh plugin --profile web update dsh-plugin-recursive-harness

如需立即更新到指定版本(因为 pnpm 默认只使用一天前发布的版本),可加版本号:

dsh plugin --profile web add dsh-plugin-recursive-harness@0.1.0

移除插件:

dsh plugin --profile web remove dsh-plugin-recursive-harness

删除残留文件:

  • 删除 recursive-harness 条目(如果在 cordis.patch.yml 中添加过)
  • 删除 ~/.dsh/recursive-harness/(如不保留 harness 版本和经验库)

配置说明

配置文件位于 profile 的 cordis.patch.yml(web profile 为 ~/.dsh/profiles/web/cordis.patch.yml)。添加 id: recursive-harness 条目后,其 config 会替换插件的默认配置。

一个最小配置示例:

- id: recursive-harness
  config:
    proposer:
      engine: llm
      endpoint: http://127.0.0.1:8000/v1/chat/completions
      model: my-model
      apiKeyEnv: ""        # 环境变量名
      allowEgress: false   # 是否允许访问非回环地址
      allowHttpHosts: []   # 允许的 HTTP 主机
      judge: true          # 启用模型 judge(第三级判断)
      jsonMode: false      # 是否发送 response_format=json_object
      extraBody: {}        # 额外的请求体字段
    probe:
      templateProfile: web     # probe 继承此 profile 的模型和凭证
      provider: ""             # 覆盖 probe 使用的模型提供者
      model: ""                # 覆盖 probe 使用的模型
      blockedTools: []         # 这些工具的任务永不被 probe
    lockedSurfaces: []         # 任何 candidate 都不能触碰的路径
    protectedPatterns: []      # 正则表达式,匹配则拒绝 candidate
    maxConcurrency: 2          # 并行 probe 子进程数
    maxTokensPerIteration: 120000
    probeTimeoutMs: 600000

注意:proposer 需要一个 OpenAI 兼容的聊天补全服务器(如 vLLM、SGLang、llama.cpp、Ollama 或托管 API)。未配置前 proposer 为固定模板,不会向外部发送文本。

命令行接口

插件提供以下命令(可在 dsh 的会话中执行,也可直接用 npx dsh-recursive-harness):

  • /harness inspect:查看当前 active harness 版本和已挂载的 skills
  • /harness start <task> 或 /harness start ./my-task.mjs:在后台启动一次演化运行
  • /harness status <runId>:查看运行状态
  • /harness cancel <runId>:停止运行并杀死子进程
  • /harness rollback [versionId]:回退到指定版本(不提供则回退到上一个版本)
  • /harness listExperience:列出 Reflector 保存的经验条目

命令行等效调用示例:

npx dsh-recursive-harness inspect | start | status | cancel | rollback | listExperience

状态默认存储在 ./.dsh-harness 目录下;可通过 --config 指定 JSON 配置文件。

自定义任务示例

任务文件是一个 ES Module,导出 task 或 tasks 数组。插件会写入 workspaceFiles 到空 workspace,运行 agent,将最终输出交给 objectiveCheck:

// my-task.mjs
export default {
  taskId: 'orders-report',
  split: 'dev',
  domain: 'general',
  prompt: '讀取 orders.csv,輸出 { total, byRegion } 的 JSON,byRegion 依名稱排序。',
  workspaceFiles: { 'orders.csv': 'region,amount\nEast,10\nWest,5\nEast,2\n' },
  expected: { total: 17, byRegion: { East: 12, West: 5 } },
  objectiveCheck(record, task) {
    const data = JSON.parse(record.finalOutput.match(/\{[\s\S]*\}/)[0]);
    const ok = data.total === task.expected.total;
    return {
      passed: ok,
      score: ok ? 1 : 0,
      details: ok ? [] : [`total 應為 ${task.expected.total},實得 ${data.total}`]
    };
  },
};

注意:objectiveCheck 的结果详情会在传递给 proposer 前被脱敏(隐藏 expected 和具体错误信息),避免 proposer 过拟合。

适用场景与注意事项

适合使用此插件的情况:

  • 需要在多个任务上持续优化 Agent 的 system prompt、guardrails 和工具使用方式
  • 希望在任务间复用成功的 Harness 配置和经验
  • 模型权重固定,但希望通过迭代改进 Harness 来提升性能

注意事项:

  • 插件以当前 dsh 进程的权限运行,安装前应检查源码和许可证(MIT)
  • 插件为实验性功能,当前在 dsh 0.2.0-rc.2 上测试通过
  • 每次 probe 是一次完整的 agent 运行,需要根据 maxConcurrency 和 probeTimeoutMs 合理配置资源
  • 插件不会向外部发送除 proposer endpoint 以外的数据,无遥测

生态背景

DeepSeek Harness 的设计理念是「一切皆插件」,社区目录由 SkillHub 独立维护,与 DeepSeek 或幻方无官方从属关系。本文介绍的插件只是社区项目之一。

总结

Recursive Harness 插件通过 Propose → Probe → Compose 和 Reflector → Experience Library 两层递归,让 Harness 在模型权重不变的情况下自我演化,并在任务间复用经验。对于需要在多个任务上持续优化 Agent 行为的开发者,这是一个可用的实验性工具。

  • 插件目录页:https://www.skillhub.cn/plugins/Bear0117/dsh-plugin-recursive-harness
  • GitHub 仓库:https://github.com/Bear0117/dsh-plugin-recursive-harness
羽毛球分组比赛记分
小程序二维码

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

Xiaoye