dsh-no-loop-plugin:流式推理中的防復讀與截斷

前言

在 DeepSeek Harness(DSH)裏做長會話時,模型有時會在 reasoning 階段陷入重複:同一句、同一個詞或同一句式反覆出現幾百遍。更麻煩的是,DSH 會把歷史 thinking 原樣發回給模型——一段已經退化的思考會變成下一輪的「範例」,越滾越大,直到整輪幾乎沒有有效產出。

事後刪消息或改提示詞只能部分緩解;需要在 流式接收 reasoning 時 就識別打轉,並把 寫回上下文的那份 換成截斷版,否則下一輪仍會被回灌。下面介紹社區插件 dsh-no-loop-plugin,由維護者 54nanmiao 發佈,分類爲模型推理,在 llm/stream 上掛接檢測與截斷邏輯。

這是什麼

dsh-no-loop-plugin 是 DSH 的防循環插件:在 token 流裏檢測重複或自指打轉的 reasoning,命中後丟棄後續 reasoning delta,並把該塊的 block-end 換成截斷版本再落盤,避免退化思考進入下一輪上下文。它不修改正文輸出與工具調用;內部異常時退回原樣透傳。

當前 npm 包版本爲 0.2.0(見倉庫 package.json),許可證 MIT,Node 要求 >=22.13.0。

核心功能

流式守衛

插件掛在 llm/stream 上,邊收 reasoning-delta 邊判定:

  • 命中:丟掉後續 reasoning delta(界面不再刷屏),並把 block-end 換成截斷版——落盤內容決定下一輪是否被回灌,這一步比「不刷屏」更重要。
  • 未命中:原樣透傳,不做字節級修改。

判定與分檔

檢測爲文本啓發式,閾值集中在 detector.mjs 的 CONFIG。默認按 reasoning 塊字數分 嚴格檔(長 reasoning) 與 聊天檔(短回覆):短回覆放寬閾值,降低誤殺。規則涉及週期、單字遊程、句尾、回收率(recycle)、儀式串(ritual)、碎片(frag)、塌縮(collapse)、尾句同構等;代碼塊、表格、hex 串、key=value 日誌行等結構化內容會快速放行。

界面 靈敏度 提供寬鬆 / 標準 / 嚴格三檔,只調整「多容易算打轉」的四個閾值(標準檔示例:回收率 ≥0.85、儀式串 ≥12 等,詳見 README 表格)。

配置與 HTTP 接口

可調項在 DSH 設置 → 防循環 中修改,保存後寫入 ~/.dsh/no-loop.json。也可直接編輯該 JSON,例如:

{
  "streamGuard": true,
  "rule": true,
  "sensitivity": "normal",
  "minProbe": 80,
  "probeStep": 40,
  "probeTail": 4000,
  "chatMax": 1200
}

宿主提供:GET /plugins/dsh-no-loop-plugin/state(配置、命中統計、日誌路徑);GET|POST /plugins/dsh-no-loop-plugin/config(讀寫上述 JSON,非法值會被鉗到範圍內)。

主要配置項含義(默認值見上表):

項 作用
流中熔斷(streamGuard) 關閉後僅保留 loop__check 工具與提示詞紀律
提示詞紀律(rule) 向系統提示詞加入「發現重複 → 換說法/收尾」類約束(改此項需重啓 DSH)
靈敏度 寬鬆 / 標準 / 嚴格
開始判定的字數(minProbe) 攢夠字數後纔開始判
判定間隔(probeStep) 之後每隔多少字再判一次
只看尾部多少字(probeTail) 判定窗口
聊天檔上限(chatMax) 整塊低於該字數時按聊天檔放寬閾值

工具與留痕

安裝後模型可使用:

  • loop__check({text, mode}):自查文本是否打轉;mode:'truncate' 可得到截斷版。
  • loop__reset():清零本會話的打轉計數。

命中時寫入插件目錄下(可通過環境變量 NO_LOOP_DATA_DIR 改路徑):

  • data/halt.log(JSONL,超過 5 MB 輪轉爲 halt.log.1)
  • data/samples/<時間>_<會話尾號>_b<塊>.txt(命中原始思考)

不想留痕可定期刪除 data/,或關閉 streamGuard。

安裝與啓用

先通過 DSH 官方 profile 安裝(命令來自倉庫 README):

dsh plugin --profile web add dsh-no-loop-plugin

安裝完成後 重啓 DSH 纔會掛載插件。

已知問題與 README 中 dsh-peak-reminder 同源:

  • 桌面版自帶 pnpm 但可能不在 PATH,會報 'pnpm' is not recognized,需把 pnpm 加入 PATH 後再執行 add。
  • pnpm 11 的 minimumReleaseAge 可能擋住剛發佈版本;若要立即安裝 0.2.0,可顯式指定:
dsh plugin --profile web add dsh-no-loop-plugin@0.2.0

典型用法

  1. 按上一節安裝並重啓 DSH。
  2. 打開 設置 → 防循環,按需調整流中熔斷、靈敏度、探測字數等,點保存。
  3. 長會話中若 reasoning 開始刷屏式重複,插件應在流中截斷;側邊欄可查看當日命中次數與檔位。
  4. 若需模型主動自檢,可在對話中依賴 loop__check / loop__reset(由插件註冊)。
  5. 調閾值前,維護者建議在本地查看 data/halt.log 與 data/samples/,或用 node eval-guard.mjs 按理由分層評估誤殺風險(開發腳本,見 README)。

適用場景與注意

適合誰: 在 DSH 中頻繁使用帶 reasoning 的模型、且遇到過 thinking 復讀導致上下文膨脹的開發者。

邊界:

  • 這是文本啓發式,不是形式化證明;誤殺表現爲正常但句式重複的思考被截斷,正文仍會生成。疑誤殺可關 streamGuard 並將樣本反饋給維護者。
  • 僅作用於 reasoning;正文裏的復讀不在範圍內。
  • 插件是兜底,提示詞裏明確「做完一步就換句式」比事後截斷更治本。

安全: 插件以當前 DSH 進程權限運行;安裝前請在 GitHub 閱讀源碼與 MIT 許可證,確認符合你的環境策略。DSH 社區插件目錄(SkillHub 等)爲獨立生態站點,與 DeepSeek / 幻方無官方從屬關係。

參考鏈接

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

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

小夜