dsh-memory-router:掛在 DSH 工具調用邊界上的 Token 壓縮插件

前言

Agent 每讀一次工具結果,其實是一次「回讀」:工具返回 8000 字,模型爲了決定下一步,要把這 8000 字重新讀一遍。下面介紹的 dsh-memory-router 做的就是在這次回讀之前把事辦掉——同一份內容不重付,長輸出按字段裁剪,狀態類問題不反覆注入。

它需要先記一筆賬。這個插件自帶一套「省 / 花 / 賠」的賬本,把截斷省下的 token、注入花掉的 token、以及壓縮過頭導致模型重讀的賠錢項都記下來,而不是隻報喜。文末會給出它自己的實測結論:單次命中確實省,長期累計淨收益目前是負的。

這是什麼

dcd887/dsh-memory-router,維護者 dcd887,分類「工作流」。它掛在 DSH 的工具調用邊界上,處理兩類浪費:

  • 同一個文件、同一個命令被調用兩次,第二次的文本模型又讀一遍;
  • 工具返回很長,模型實際只需要其中幾個字段。

它對標 HarnessMM(arXiv 2610.32813)裏提出的 EDG / GDR / CCS 三個機制,是作者在 DSH 上做的可運行等價實現。注意作者自己也明確說明:DSH 的 PostToolDecision 只有 accept / block 兩支,沒有「執行下一個動作」這一分支,所以插件省的是上下文體積,不是模型回合數。

核心功能

插件由四個模塊組成,均爲生產環境驗證狀態(inject 注入閘門爲單測通過):

  • dedupe:同工具同參數,在 TTL 緩存窗口內直接複用上次的文本,工具本身不再執行;
  • edg:聲明式決策圖,匹配工具名與參數,守衛條件爲真時執行一條本地只讀動作,用結構化結果替換原始輸出;
  • liveState:會話延續,自動落盤「在處理什麼、動過哪些文件」,新會話第一輪注入;
  • inject:注入閘門,用內容哈希去重、長度上限和賬面行限頻控制注入次數。

處理順序是固定的:去重 → 決策圖 → 閾值壓縮 → 緩存最終文本。任一步拋異常都會回落,不阻斷主循環。

edg 的門禁很窄:守衛只有 exitCode / fileExists / regex / minChars / jsonPath 五個純本地算子;動作只有 readJson / readFileSlice / grep / stat 四個只讀動作。寫 exec 會直接拋錯。設計意圖是:決策圖配錯了,最壞結果是退化成沒有它。

安裝與啓用

README 給出的安裝方式是從倉庫拉下來跑一遍測試,再以本地插件方式掛進 profile:

git clone https://github.com/dcd887/dsh-memory-router.git
cd dsh-memory-router && npm test      # 6 個測試套件,92 項
# 在 profile 的 node_modules 下建鏈接(Windows 用 mklink /J)
ln -s /path/to/dsh-memory-router ~/.dsh/profiles/web/node_modules/@local/dsh-memory-router

重啓 DSH 後生效。倉庫標註狀態爲 alpha,Node 要求 >=18,許可證 MIT(README 註明提交前應補 LICENSE 文件)。這個插件以當前 DSH 進程的權限運行,裝之前應當把 index.js 和 lib/ 下的源碼讀一遍,確認行爲符合預期。

典型用法

決策圖配置放在 ~/.dsh/memory-router/edg.json,倉庫內的 edg.example.json 給了十個節點的示例。一個節點長這樣:

{
  "id": "tax-table-pick-fields",
  "match": { "tool": "read", "args": { "file_path": { "$re": "hs_codes" } } },
  "guard": { "minChars": 2000 },
  "then": [
    { "act": "readJson", "path": "${args.file_path}", "limit": 3,
      "pick": ["hs_code", "name", "import_tariff", "category"] }
  ]
}

這條規則匹配讀取 hs_codes 相關文件的調用,命中後先看字符數是否超過 2000;超過則只取前 3 條的 4 個字段返回。

一個真實會話的對比數據來自 README:

場景 原生 插件後 省
讀稅則大表(8972 條) 6031 字 298 字(總條數 + 3 條樣本 × 4 字段) 1433 token
讀盲推記錄(26 KB) 8035 字 1707 字(標題骨架 + 錯誤行 + 結論行) 1582 token
重複執行同一條命令 重新執行 命中緩存,未執行 賬本記 dedupe

十案例 A/B(node scripts/ab.mjs,可復現)的結果:命中 6/10,命中時平均節省 96%;合計是挑過的樣本,屬於上界;按三成命中率折算約 29%。

記賬口徑

插件把每一筆開銷寫入 metrics.jsonl,口徑如下:

淨收益 = 裁剪省 + 去重省 + 決策圖省 − 重讀賠 − 注入花 − 摘要花
科目 記什麼
trim 壓縮省下的
trim-skip 省得太少沒壓的次數(不進賬)
dedupe 複用緩存省下的
edg 本地執行替換輸出省下的
reread 負收益:上次壓過,同一調用又來了
inject 注入花的

查看賬本:

node scripts/stats.mjs

README 明確寫出的一段累計賬本是:

裁剪省 1223  ·  去重省 0(2 次)  ·  決策圖省 3015(2 次)
重讀賠 0     ·  注入花 14755     ·  淨 −10517

兩個解釋:注入開銷是歷史累積的,大部分發生在「注入閘門」裝上之前;另外驗證方式放大了它——作者一直在同類問句上反覆測。所以「單次命中省 1400—1600 token」是真的,「長期淨收益爲正」還沒有被證明。

作者額外加了一個論文裏沒有的科目 reread。理由是:壓縮越多,賬面越省,但模型可能因爲信息被裁掉而重新讀一遍,實際反而更貴。不記這筆賬,賬本就係統性偏高。

適用場景與注意

適合的場景是工具輸出長、字段固定、調用還會重複出現的工作流。README 提到的負載類型是寫作與調研類 Agent。

需要注意的幾點:

  • 累計淨收益目前是負的,作者把這段寫在 README 靠前位置,並建議讀完再決定要不要 Star;
  • 它是 alpha 狀態,功能和配置格式都可能再變;
  • 它省的是上下文體積,不是模型回合數,跟論文 GDR 的起點不同,別把論文裏的數字直接套用;
  • 插件以當前 DSH 進程權限運行,安裝前讀源碼、確認許可證;
  • 星標爲 0,生態位還早,用之前自己用 node scripts/ab.mjs 在本地跑一遍復現。

相關鏈接

目錄頁: https://www.skillhub.cn/plugins/dcd887/dsh-memory-router
倉庫:   https://github.com/dcd887/dsh-memory-router
論文:   https://arxiv.org/abs/2610.32813

目錄頁是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

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

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

小夜