dsh-entry-shaper:在入口定型 LLM 出網 payload,減輕推理塊對上下文的負擔

前言

用 DeepSeek Harness(DSH)跑長會話時,上下文會不斷膨脹:推理模型在生成階段會產出大量 Wait、Hmm 等反思標記,這些內容寫入會話後,每次請求都會原樣帶上。若在出口對已發送歷史做小塊壓縮(例如官方 compaction-basic 的自動壓縮),往往會打斷前綴緩存,下一次從斷點起整段按未命中價重算,作者 README 裏把這類代價稱爲「斷點稅」。

下面介紹社區插件 dsh-entry-shaper(維護者 MaudieHakimi,GitHub 倉庫 MaudieHakimi/dsh-entry-shaper,SkillHub 分類爲「模型推理」)。它的思路是把塑形挪到入口:在會話元素首次出網前按類別跑 op 鏈定型,此後不再改寫已發送形態,從而儘量保持出網 payload 前綴單調。插件當前版本 1.0.6,狀態爲實驗性、默認關閉,要求 Node ≥ 20,MIT 許可,測試 94/94。

這是什麼

dsh-entry-shaper 是 DSH 的 payload 塑形插件:按 reasoning、toolResult、toolArgs、assistantText 等類別配置 op 鏈,在代理通道的 wire 層對尚未發送的內容做變換。它不干預模型生成中的推理過程,只改變之後進入上下文、再次出網時模型「看到自己曾經想過什麼」的形態。

README 強調:它不是消除所有斷點的萬能方案——官方自動壓縮、緩存 TTL、換 provider、改配置等仍可能打斷前綴;它保證的是自身不在已發送內容上再做有狀態改寫。默認策略主要塑形 reasoning 一類,其餘類別多爲 keep,省幅上限取決於推理在 payload 中的佔比(README 實測約 −21% ~ −47%)。

核心機制與能力

入口定型 vs 出口壓縮

生成結束後,內置策略(如 extract)可把長推理壓成較短決策句再出網;上下文裏後續請求攜帶的是定型後的文本,而不是完整的填充詞鏈。這與「生成時保留反思標記的增益、進入上下文後去掉其負擔」的設計目標一致——文獻與邊界說明見倉庫 README 與 docs/。

可插拔 op 鏈

插件提供純 op(keep、drop、extract、head、tail、truncate 等)以及三種外部接入方式,可在同一鏈上混用:

傳輸 含義
inline 進程內算法,可熱改配置
exec 子進程(python / node / 任意命令)
http OpenAI 兼容端點的 LLM 壓摘要

外部調用統一 I/O:輸入信封含 text、kind、meta、op、protocol: 1;返回 { "text": "…" }、 { "text": null }(整塊刪除)或裸文本。單 op 失敗或超時則 fail-open(跳過該步,不阻斷會話)。非純 op 依賴內容哈希緩存以保持確定性;README 稱長會話緩存命中率約 98.4% ~ 99.6%。

代理與配置熱讀

配置放在 ~/.dsh-entry-shaper.config.json(不要寫進 cordis.patch.yml,否則市場熱掛載會受限)。開啓 proxy.enabled: true 後會惰性註冊路由(默認 provider 名 deepseek-shaped),將會話或默認 provider 指向該名即可。改配置按 mtime 熱讀,一般無需重啓;建空文件 ~/.dsh-entry-shaper.OFF 可立刻原樣轉發。

安裝與啓用

插件以 DSH 當前進程權限運行,安裝前請自行審閱 源碼與 LICENSE,勿憑名稱臆造安裝命令。README 給出的方式爲本地目錄安裝(路徑換成你本機位置):

dsh plugin --profile web add "file:D:\plugins\dsh-entry-shaper"

也可手動:複製目錄到 profile 的 node_modules,並在 profile 的 package.json 中同時加入 dependencies 與 dsh.profile.bundles,且 dsh.bundle.patch 仍指向本包 cordis.patch.yml。

掛載方式另有:SkillHub 市場頁熱開關(patch 爲純 insert 時無需重啓)、或在 cordis 上下文裏 ctx.plugin(module) 做實驗。注意 dsh plugin … add "file:…" 安裝的是物理副本而非符號鏈接,只改源碼目錄不會生效,需複製進 node_modules 或重新 add。

典型配置

先在用戶目錄創建或編輯 ~/.dsh-entry-shaper.config.json。README 示例(總開關、按類別的 op 鏈、緩存與代理)如下:

{
  "enabled": true,
  "shapeReasoning": true,
  "policy": {
    "reasoning":     { "ops": [{ "op": "extract", "maxChars": 240 }] },
    "toolResult":    { "ops": [{ "op": "keep" }] },
    "toolArgs":      { "ops": [{ "op": "keep" }] },
    "assistantText": { "ops": [{ "op": "keep" }] }
  },
  "cache": { "enabled": true, "path": "~/.dsh-entry-shaper.cache.jsonl", "maxBytes": 8388608 },
  "proxy": { "enabled": true, "provider": "deepseek-shaped", "upstream": "deepseek-official" },
  "opTimeoutMs": 8000,
  "logPath": "~/.dsh-entry-shaper.log"
}

README 特別提醒:配置裏的路徑不會展開 ~,誤寫會在當前目錄下建名爲 ~ 的文件夾;建議省略路徑鍵使用默認絕對路徑,或寫完整絕對路徑。

常用推理策略片段(同 README「複製即用」):

// 默認思路:推理只留決策句
"reasoning": { "ops": [{ "op": "extract", "maxChars": 240 }] }
// 保守:保留真實開頭
"reasoning": { "ops": [{ "op": "head", "chars": 800 }] }
// 自定義進程內過濾(示例)
"reasoning": { "ops": [{ "op": "inline", "use": "code",
  "code": "return text.split('\\n').filter(l => !/^(Let me|I will)\\b/.test(l)).join('\\n')" }] }

extract 的 marker 默認爲 false;若設爲 true 會加 [reasoning extract: …] 前綴,文檔標明該標記會污染模型上下文(見 docs/POLLUTION.md)。

適用場景與注意

適合誰:長會話、推理佔比高、希望在不頻繁改已發送歷史的前提下縮小出網 token;或願意用 exec / http / inline 接入自研塑形算法,複用插件的緩存、超時與 fail-open。

務必知曉的限制(均來自 README,非營銷承諾):

  1. 「更乾淨」≠ 已證明「更聰明」:插件未做去掉填充詞後的行爲對照實驗,只保證出網形態與生成過程分離。
  2. 內置 extract 的已知偏差:決策句規則會保留大量 Let me / I will 類長填充,README 稱保留句中約 76.9% 仍爲自我敘述標記,詳見 docs/FILLER-WORDS.md §5(候選修法尚未實施)。
  3. 會話日誌污染:實測日誌中可能出現塑形形態的推理塊,原文不保證保留;側路可用 node tools/original.mjs 回溯當前輪原文(見 docs/POLLUTION.md)。
  4. 改配置會改前綴形態:下一次請求可能整份全價重算(README 量級約 $0.2),宜一次定好策略。
  5. 與官方棧分工:官方已有 tool-result-pruner、compaction 等;啓用本插件前建議讀 docs/OFFICIAL-STACK.md,避免重複裁剪或預期衝突。

DSH 生態是「一切皆插件」;SkillHub 目錄頁 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-entry-shaper 把上下文壓縮從出口挪到入口:在 wire 層對首次出網的會話元素做確定性塑形,默認聚焦推理塊,並留出統一協議供自定義算法接入。若你在 Harness 上跑 R1 類推理模型且關心 payload 與前綴穩定,可在審閱源碼後按 README 安裝,從 enabled 與 policy.reasoning 小步試起。

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

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

小夜