dsh-collapse-guard:在流式推理塌缩时掐断,避免垃圾进历史

前言

在 DeepSeek Harness(DSH)里跑智能体时,模型偶尔会进入「塌缩」:输出从正常推理退化成短句刷屏,例如「好。写。发。」循环,或固定动作词绕圈。若只是中途停掉,半截内容仍可能以 assistant/message 进入可见历史,下一轮会继续照着垃圾写。

dsh-collapse-guard(npm 包名 doudou-collapse-guard,仓库 otonemame/dsh-collapse-guard)挂在 llm/stream 瀑布上监听 chunk,发现重复塌缩后断流,并以 finish(error) 结束本步,使本步只写 assistant/attempt,不产生带 surface 的 assistant/message。下文介绍其定位、断流方式、安装与配置。

这是什么

维护者 otonemame,分类为模型推理,许可证 MIT(package.json 版本 0.1.0)。

一句话:在 LLM 流式输出中扫描近期行与滚动原文,命中塌缩规则时中止流,并以 provider 失败(failure.code = STREAM_COLLAPSE)收场,让垃圾不进入模型可见历史。

兼容性要求:dsh >= 0.2.1,node >= 20。README 说明对 dsh 0.3 的破坏性变更未在声明中锁定,升级到 0.3 后建议先查看 fires.jsonl 是否正常记录。

为什么要用 finish(error)

不是所有断法效果相同:

断法 后果
补 finish(stop) agent-loop 当作正常结束,半截内容进历史
agent.cancel() 写 assistant/message 且 interrupted:true,仍进历史
补 finish(error) 只写 assistant/attempt,本步不产生 assistant/message

本插件采用第三种;STREAM_COLLAPSE 刻意不在 dsh-llm-retry 默认重试集里(默认仅 EMPTY_RESPONSE / RATE_LIMIT / SERVER / TIMEOUT / TRANSPORT),因为塌缩与当前请求属性相关,重试等于整段 prompt 再跑一遍。

核心功能

监听与硬上限

  • 挂在 llm/stream 上包住上游 chunk 流,扫最近一百多行(默认主窗 128 行),发现退化成重复碎念则断流并补 terminal finish(error)。
  • README 称一次可截断二十余万字符级别的垃圾吞吐(hardChars 默认 200000)。
  • 围栏(``)内内容不参与判定;超过skipLineChars`(默认 2000)的长行跳过且不清窗。

六种塌缩形态(规则码)

规则码 抓的是什么
short-line-tight 最近 48 行里不同短句 ≤ 2 种
short-line-dominant 整窗(128 行)里不同短句 ≤ 4 种
short-line-cycle 5–12 种短句按固定周期原样绕圈
short-line-spread 种数更多,但最多那种占一半以上
short-line-run 尾部连续 12 行以上短句,且占比满足条件(应对塌缩跟在长推理后面的情况)
paragraph-repeat 滚动原文里同一段连着重复 ≥ 3 次(累计不算)
hard-cap 单通道超过 hardChars 仍在继续

段落复读另用 4096 字符滚动原文,找连着重复三遍的周期串(段长 8–400 字),每增 48 字符扫一次;不换行的重复也走此路径。

形态随上下文变化:塌缩往往在复制上下文里高频出现的句式,规则表是「目前见过的六种」,新形状需增补规则。插件管得住一直吐到爆,管不住本不该塌的生成——README 建议从参数侧降低 reasoning_effort 等。

命中后的界面表现

界面大致提示:

模型推理通道进入重复塌缩(尾窗只剩 3 种短句,「发。」出现了 42 次,已读到 4403 字符),守卫掐断了本次流。

本轮结束,不会自动重试;再发一句即可继续。

安装与启用

官方安装命令(来自 README):

plugin_manager install_bundle target="github:otonemame/dsh-collapse-guard"

也可在 cordis.patch.yml 里手动插入类似 dsh-mcp-client 的条目,name 写 doudou-collapse-guard。

本地开发时包挂在 @local/doudou-collapse-guard,装时认 npm 包名,搜仓库认 dsh-collapse-guard。

注意:插件在当前 dsh 进程权限下运行;安装前请自行查看 GitHub 源码 与 MIT 许可证。DSH 社区插件目录(SkillHub 条目)为独立站点,与 DeepSeek / 幻方无官方从属关系。

关闭方式

任选其一,下一请求即生效(空文件方式无需重启 DSH):

  1. 创建空文件:~/.dsh/doudou-collapse-guard/off
  2. 环境变量:DOUDOU_COLLAPSE_GUARD_OFF=1
  3. 在 DSH 设置中关闭该插件

典型配置

配置优先级:默认值 → cordis.patch.yml 的 config → 环境变量 DOUDOU_COLLAPSE_GUARD_CONFIG(JSON)。

常用键(节选,默认见 README):

键 默认 说明
window 128 主判据窗口行数
distinctMax 4 主判据允许的不同短句种数
tightWindow 48 紧判据窗口
tightDistinctMax 2 紧判据允许的不同短句种数
maxLineChars 32 超过此长度算长行
hardChars 200000 单通道硬上限
watch ['reasoning-delta','text-delta'] 监听的通道
enabled true false 等于不挂

例:只监控推理通道:

DOUDOU_COLLAPSE_GUARD_CONFIG={"watch":["reasoning-delta"]}

交接记录

每次触发写一行 JSONL:$DSH_HOME/doudou-collapse-guard/fires.jsonl(未设 DSH_HOME 则为 ~/.dsh),超过 512 KB 自动轮转为 .1。行内包含时间、规则码、通道、阈值快照、sessionId、model 等,便于事后回校判据。

已知边界

  • 段落复读日志里长行可能显示为 <长行> 占位符。
  • 只读流,不改判据外内容,不碰历史与会话文件。

结尾

dsh-collapse-guard 面向 DSH 下长流式推理的塌缩止血:用六种(加硬上限)规则识别重复短句与段落复读,以 STREAM_COLLAPSE 失败结束本步,避免半截垃圾进入可见历史。适合已遇到刷屏塌缩、且希望与 dsh-llm-retry 默认策略区分的开发者。

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

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

小夜