DSH(DeepSeek Harness)是一个插件化平台。在实际开发中,模型有时会出现 “退化复读” 的现象:思考链或正文反复输出同一小段内容(如 “好的”、”好的,执行”、”好”),且长时间不产出有效结果,导致 token 白白烧掉。
现有的社区方案(如 dsh-thinking-loop-guard)通常挂在 agent/turn-stopping 上,只在回合边界检测完整输出。这存在一个明显缺陷:回合边界 = 这一轮的 token 已经烧完了。它能阻止循环蔓延到下一轮,却救不回正在烧的那一轮。
dsh-loop-breaker 挂载在 DSH 的 llm/stream 瀑布事件上。通过逐块统计 reasoning 和 text,它能在流式输出过程中实时检测复读形态,命中后当场取消底层 HTTP 请求(停止计费),并注入补救提示让模型重新作答,同时通过 L0 消毒机制防止复读原文污染会话历史。
核心功能¶
- 流式拦截:挂载在
llm/stream事件,在流式输出层进行检测。 - 多形态检测:支持检测碎片周期循环(如 “做。→执行。→好。”)、字符塌缩、句子回收、16-gram 回收及短句冗余。
- 熔断计费:命中规则后,适配器生成器执行
consumer.abort(),底层 HTTP 请求立即取消,停止 token 计费。 - 补救机制:注入补救提示引导模型重新作答。
- L0 消毒:写回会话历史时,保留开头部分,其余替换为占位符,防止复读原文污染后续生成。
- 工具块推迟:检测到非
text/reasoning的工具调用块未关闭时,推迟熔断,避免误杀。
安装¶
在终端中执行以下命令:
git clone https://github.com/CHIP-PHILO-GH/dsh-loop-breaker
cd dsh-loop-breaker
pwsh -File install.ps1
install.ps1 是幂等的,可重复执行。默认安装路径为 $env:DSH_HOME\profiles\node_modules\dsh-loop-breaker。改动配置后需重启 dsh web 生效。
注意:使用 Windows PowerShell 5.1 跑
install.ps1可能因中文编码报错,建议使用 PowerShell 7 (pwsh)。
配置¶
在 DSH 的配置文件中添加以下片段(示例):
- id: loop-breaker
name: 'dsh-loop-breaker'
config:
enabled: true # 总开关
recover: true # 命中后是否注入补救提示
maxRecoveriesPerTurn: 2 # 同一轮最多补救次数
nudge: '' # 补救提示文本,留空使用内置文案
# --- L0 消毒 ---
sanitize: true # 是否改写正文
sanitizeHeadChars: 240 # 保留原文开头的字数(0=全丢)
degradePlaceholder: '' # 替换复读原文的占位符
# --- 检测阈值 ---
windowChars: 1600 # 滚动统计窗口
periodMax: 48 # 短周期检测最大周期
periodMatch: 0.92 # 短周期自吻合率阈值
periodMaxPieces: 6 # 窗口内片段种类上限
collapseUniqueRatio: 0.10 # 去重字符占比阈值
sentRecycle: 0.80 # 句子回收率阈值
gramRecycle16: 0.80 # 16-gram 回收率阈值
tightRedundancy: 0.90 # 窗口字面冗余度阈值
maxChars: 200000 # 单次输出硬上限
maxReasoningChars: 120000 # 单次思考链硬上限
测试¶
插件提供了回归测试和集成测试脚本。
- 回归测试:验证核心检测逻辑。
node test.mjs
- 集成测试:在装了 DSH 的环境里运行,验证流协议合法性、熔断和消毒逻辑。
node tests/guard.test.mjs
适用场景与注意事项¶
- 主要针对:紧邻的短周期复读(如 “做。→执行。→好。”)。此类复读通常由少量短碎片连续拼装而成。
- 已知边界:长间隔重复、较短英文周期、或长度不足的样本可能漏检;正常的长技术报告、含大量近似函数的代码等正常长输出可能因结构性重复而误杀。
- 环境依赖:
- 需要 Node.js >= 18。
- 需要宿主环境提供
@deepseek-ai/dsh-llm和@deepseek-ai/schemastery。 - 使用前请检查源码与许可证(MIT)。
插件通过在流式传输中即时切断无效生成,避免了类似 Ollama 报告中失控跑 31M token 的情况,确保每一轮交互都在可控范围内。