前言¶
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 / 幻方無官方從屬關係。