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 / 幻方无官方从属关系。

参考链接

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

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

小夜