dsh-degeneration-kit
DSH 防退化套件|不止打断,还会清创:把退化的思考块从模型可见历史里折叠掉,下一轮不再回传。复读分两型——A 型同一句死磕、B 型短句轮换(最难抓,实测英文 8 块全漏)。两个插件一套闭环,缺一个都会漏。
一句话定位
DSH 防退化套件|不止打断,还会清创:把退化的思考块从模型可见历史里折叠掉,下一轮不再回传。复读分两型——A 型同一句死磕、B 型短句轮换(最难抓,实测英文 8 块全漏)。两个插件一套闭环,缺一个都会漏。
安装方式
在 DSH 的 web profile 中执行下面的命令;装完刷新页面即可。
$ dsh plugin --profile web add 'git+https://github.com/walksls/dsh-degeneration-kit.git#fd7bbf66f47246e0159608c6c2319c389ee69bd7'
兼容的 DSH 版本
未声明
作者与热度
walksls · ★ 22 · 更新于 2026-10-30
关于这个插件
DSH 防退化套件 —— ⚠️ 两个插件,两个都得装才完整
[English](README.en.md) | 中文
> 上下文越长,模型越容易陷进「我要做 X」的空转(复读),而且回合看起来还是成功的,
> 不加检测根本发现不了(本机实测:24 个真退化块里 18 个回合正常结束,只在思考里烂)。
>
> 这个仓库里有两个插件,各治一半:
>
> - 少产生 —— thinking-guard:把退化的思考块从模型可见的历史里折叠掉,不让它每轮重放;
> - 清库存 —— dsh-auto-checkpoint:到水位压缩(把已经累积的污染整体清掉),或换一个新会话。
>
> 缺一个都会漏(理由见下表后面的三条)。只装一个也比裸奔强,但要真想彻底解决,两个都要装。
复读长什么样:两种形态,判据完全不同
「复读」不是一种东西。我们把本机 493 个会话日志里全部 reasoning 块按同一个口径过了一遍
(ra = 同一段里同一句的最高重复次数),它们分成两类:
| | A 型 · 同一句死磕 | B 型 · 短句轮换 |
|---|---|---|
| 重复次数 | 10³–10⁴ | 20–200 |
| 上下文 | 短(29k–42k) | 长,随长度单调上升 |
| 典型样子 | (读×3369、做×1024、「好」×10848 | Let me write it. → Go. → Now. → OK. |
| 读起来像 | 正常思考:有主语、有下一步动作、句句合规,信息量为 0 | 正常推进 —— 最难认出来的就是它 |
| 多不多 | 罕见(中文单元全机 5 例) | 常见 |
| 跟模式的关系 | 只在「强制中文思考」的模式里见过(其它 31 个会话:0 例) | 无关 |
⚠️ 两条容易搞反的:
- 「中文更容易退化」是体感,不是数据。 成立的是「最严重的案例全是中文」(差 1–2 个数量级);
按数量算,最常见的是英文碎片型。体感记住的是最扎眼的那一个,不是最多的那一个。
- 中文那 5 例全部出现在同一个模式里,所以「是中文的锅」还是「那套格式约束的锅」,
我们分不开 —— 别把相关当因果。
B 型为什么特别难抓:判据原本要求「单个单元占窗口句数 ≥20%」,而轮换让每个短词只占 ~15%,
没有一个够门槛 ⇒ 整块放行。实测:英文为主的 8 个块全被这道门拦掉。
这就是第二把尺子 rotationGuard 存在的原因(细节见 [thinking-guard/README.md](thinking-guard/README.md))。
为什么复读会自己喂自己:DSH 会把历史里的 reasoning 块原样回传上游。
所以一条复读不只是一步出错 —— 它留在上下文里,之后每一步都再发一遍,
模型读到的是「我刚才一直在重复这个」。thinking-guard 折叠的就是它。
为什么是两个、而且两个都需要
| 插件 | 干什么 | 时机 |
|---|---|---|
| thinking-guard | 把退化的思考块从模型可见的历史里折叠掉 | 当场(下一次 pre-step,趁它还没被反复回传) |
| dsh-auto-checkpoint | 到水位压缩(清掉累积污染),或换一个新会话 | 事后 |
三条理由,缺一条都会留下漏洞:
1. 折叠管不到一次生成内部。 一条复读正在生成的时候它拦不住 —— 只能等下一步再剪。那一步的污染已经产生、已经回传过一次。
2. 只有压缩能清"库存"。 多次漏检攒下来的污染块,折叠一块块剪很慢;压缩能一次性把累积的压下去(本机实测:一个会话 12 次压缩,凡有累积污染时压缩后都下降,最强一次 43 → 0,此后零复发)。
3. 压缩之间还有步子。 只装压缩的话,两次压缩之间的每一步仍在被污染重放 —— 那正是折叠负责的那一段。
⇒ 一句话:折叠 = 少产生,压缩 = 清库存。两个都在,才是闭环。
> 💡 两个插件之间有一处联动(2026-10-15 补):thinking-guard 里的急停阀当场掐断复读之后,
> dsh-auto-checkpoint 会顺带压一次 —— 不看水位阈值,也不看那会话在面板上选的处理方式。
> 阀清的是"正在喷的那一段",压缩清的是"历史累积",接得上。
> ⚠️ 这一步要有阀才有(只装 dsh-auto-checkpoint 的话没有);想关掉只能全局改常量
> AUTO_COMPACT_ON_VALVE_ABORT(默认 true)再重启,详见 [auto-checkpoint/README.md](auto-checkpoint/README.md)。
实测:一个会话跑满 23 亿 token 也没崩
这是一个真实会话的用量面板:383 轮、9,227 步、累计 23.2 亿 token(缓存命中 99.6%),
上下文占用仍然只有 24%。
原因不神秘:dsh-auto-checkpoint 到水位就压缩或换会话,不让历史无限堆积;
thinking-guard 把退化的思考块折叠掉,不让它每一轮重放。
⚠️ 这张图只说明会话没崩,不构成「它比别的方案更快更省」的证明。
装(3 分钟)
→ 看 [INSTALL.md](INSTALL.md)(两条命令 + 验证方法 + 常见问题)
它不解决什么(以及配套推荐)
这套件治的是「别崩」:模型陷进复读,或者上下文里堆了污染,它当场掐掉、把库存清掉。
它不治「别失忆」。三件事分开看:
| 你怕丢的 | 压缩会不会弄丢 | 归谁管 |
同分类对比
同一分类下 Star 最高的 5 个,便于横向比较。
| 插件 | 作者 | Star | 版本 | 更新 |
|---|---|---|---|---|
| EverOS | EverMind-AI | 13.9K | 0.0.0 | 2026-11-10 |
| billion-context | ranxianglei | 5.9K | 0.1.213 | 2026-11-10 |
| dsh-context | bowenliang123 | 4.8K | 0.83.1 | 2026-11-10 |
| memsearch | zilliztech | 2.9K | 0.0.0 | 2026-11-10 |
| dsh-mnemon | omdsh-dev | 957 | 0.5.43 | 2026-11-08 |