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
羽毛球分组比赛记分
小程序二维码

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

小夜