前言¶
DeepSeek Harness (DSH) 在处理长链推理时,偶尔会出现模型已完成思考,却卡在「准备输出」阶段反复空转的情况。这种静默卡死会消耗大量算力与字符数,直到用户手动停止。
dsh-reasoning-loop-guard 插件挂在 llm/stream 钩子上,通过测量流式推理文本,评估五条判据。一旦命中循环特征,它会立即停止向上游拉取数据,并返回终止块,将静默故障转化为可见的错误信息。
插件介绍¶
名称:himi-li/dsh-reasoning-loop-guard
所有者:himi-li
类别:模型推理
许可证:MIT
本插件专注于检测并提前中断 DSH 中的推理复读,提供火警日志和 reasoning_loop_log 工具,支持恢复功能与 GUI 面板。
安装¶
本包尚未发布到 npm,需从 GitHub 源码安装。DSH 按 profile 隔离,桌面版使用 desktop,网页版使用 web。
- 桌面版:必须使用 DSH Desktop 内置命令运行时,且需先启动应用初始化。
- 网页版:任意 dsh CLI 均可,web profile 不存在时会自动初始化。
# 桌面版
dsh plugin --profile desktop add github:himi-li/dsh-reasoning-loop-guard
# 网页版
dsh plugin --profile web add github:himi-li/dsh-reasoning-loop-guard
安装后需重启 DSH 进程,而非仅刷新页面。
配置与启用¶
安装后,在 profile 的 cordis.patch.yml 中启用并配置参数:
- insert:
- id: reasoning-loop-guard
name: dsh-reasoning-loop-guard
config:
enabled: true
# 判据阈值配置
minUnits: 4 # periodic-run:连续重复单元数
kgramThreshold: 12 # kgram-repeat:尾部 k-gram 的出现次数
lineCount: 3 # line-repeat:重复行出现次数
lineShare: 0.1 # line-repeat:重复行占窗口的最低比例
blockCount: 4 # block-repeat:同一块的重复次数
fillerRun: 400 # filler-run:末尾连续装饰字符数
minChars: 800 # 低于这么多字符不做判定
every: 200 # 每 N 个字符评估一次
failureCode: REASONING_LOOP_GUARD
# 日志配置
journal: true
journalPath: "" # 默认:$DSH_HOME/dsh-reasoning-loop-guard/fires.jsonl
journalMaxBytes: 524288
journalPreviewChars: 120
logTool: true # 注册 reasoning_loop_log 工具
工作原理¶
插件每 every 个字符在滚动缓冲区上评估五条判据:
periodic-run:缓冲区尾部存在 ≥minUnits个连续相同的单元。block-repeat:同一blockMin字符的块在窗口内出现 ≥blockCount次。line-repeat:同一散文行(≥lineMin字符)出现 ≥lineCount次,且占窗口比例 ≥lineShare。kgram-repeat:末尾kgram个字符在窗口内出现 ≥kgramThreshold次。filler-run:原始文本末尾连续 ≥fillerRun个装饰字符。
五条判据是析取关系,任意一条命中即触发中断。插件只测量 reasoning-delta,不测量 text-delta 或 block-end,以避免误杀正常的长输出(如表格、代码)。
功能特性¶
- 检测与中断:检测推理循环并提前切断,返回终止块。
- 零依赖 Cordis 插件:独立运行。
- 火警日志:记录触发情况的 JSONL 文件。
- 工具支持:注册
reasoning_loop_log工具。 - 恢复功能:提供中断后的恢复能力。
- GUI 面板:提供可视化界面。
注意事项¶
- 本插件不测量
text-delta,不测量block-end。 - 不报告代码行、标记或 diff 行认定为代码。
- 装饰(如分隔线)不是复读,但持续输出装饰会触发兜底规则。
- 桌面版必须使用 DSH Desktop 内置命令运行时。