前言¶
写过智能体循环的人都会遇到同一种情况:模型进入「解题状态」后失去元认知,反复用同一方向攻击同一个问题。设计出偏向当前假设的实验(确认偏误)、不肯换方向(沉没成本)、急着给故事收尾(叙事闭环)。官方的 repeat-tool-reminder 是建议性的,只是提醒模型它重复了完全相同的调用,提醒本身没有强制力。
dsh-pain-point-check 走的是另一条路:否决式(veto)守卫。同一问题两次实验未收敛后,插件注入三问,在模型于回复文本中回答三问之前,拒绝所有非调查类工具调用,并阻止同方向重试。下面介绍这个插件的定位、原理和启用步骤。
这是什么¶
dsh-pain-point-check 是一个面向 DeepSeek Harness(dsh)的强制式 pain-point-check 守卫插件,由 ICCuse 维护,许可证为 MIT,当前版本 0.1.0,尚未发布到 npm,需要直接从 GitHub 仓库安装。
它解决的是一个具体问题:让智能体在连续失败后被迫回到卡点本身。门控会强制模型在下一枪之前先回答卡点相关问题,把负面结果变成信息,而不是被直接跳过。这也符合 dsh「一切皆插件」的扩展方式——守卫逻辑不侵入主循环,以插件形式挂载。
工作原理¶
插件通过四个 hook 协作完成门控:
tools/result:按 agent 统计当前问题的实验次数,计入失败(报错)调用与连续相同调用。agent/pre-step:真实用户插入(新问题)时重置计数器;门控待决时,在下一步追加三问检查块。tools/pre-execute:门控待决时拒绝所有非调查类调用。allowlist 内的工具仍可调用,包括read、read_image、glob、grep、web_search、ask_user_question、skill、todo_write——调查和求助不被阻断。session/event:从模型回复文本中识别三问回答(卡点=… 排除=… 性价比=…,也接受英文标记),识别到即解除门控。
注入的三问是:
- 该卡点是否仍是最关键问题?
- 上一次负面结果实际排除了什么?
- 哪条路径性价比最高(不一定最便宜)?
其中第二问是关键:如果模型说不出负面结果排除了什么,它就没有可证伪的假设,检查文本会要求它先写出一个假设,而不是再开一枪。
安装与启用¶
包尚未发布到 npm,直接从仓库安装:
npm install github:ICCuse/dsh-pain-point-check
# 或:pnpm add github:ICCuse/dsh-pain-point-check
安装后在 profile 组合中挂载。以 web profile 为例,在 ~/.dsh/profiles/web/cordis.patch.yml 中添加一行:
- id: pain-point-check
name: 'dsh-pain-point-check'
config:
failureThreshold: 2
repeatThreshold: 2
重启 harness(dsh web)后,守卫对每个会话生效。
配置¶
可用配置项如下:
| 字段 | 默认值 | 含义 |
|---|---|---|
failureThreshold |
2 |
累计多少次失败调用后触发门控 |
repeatThreshold |
2 |
连续多少次相同调用后触发门控 |
allowlist |
调查类工具集合 | 门控待决期间仍可调用的工具 |
两个阈值必须为 >= 1 的整数,配置错误会在插件加载时直接抛出,不会带病运行。
插件声明了两个 peerDependencies:@deepseek-ai/cordis ^4.0.1 和 @deepseek-ai/schemastery ^3.18.1。
开发与测试¶
lib/ 目录已预构建(由 DeepSeek Harness monorepo 工具链构建),可以直接安装使用。如果要跑测试:
npm install
npm test
测试套件对脚本化 mock adapter 驱动真实的 agent loop,无网络依赖,覆盖触发、拒绝、allowlist、解除、部分回答、重置与配置校验。
适用场景与注意¶
适合的场景:调试、排查、实验类长任务——模型容易在同一个方向上反复开火的地方。如果你的工作流里模型经常连续提交相似的失败实验,这个门控能把它拉回卡点本身。如果只是偶发的重复调用,官方建议性的 repeat-tool-reminder 可能已经够用,两者的取舍在于你是否需要强制力。
几点注意:
- 插件以当前 dsh 进程的权限运行,安装前应检查源码并确认许可证(MIT)符合你的使用要求。
- 门控待决期间,allowlist 中的调查类工具不受影响,模型仍可以读文件、搜索、向你提问。
- 阈值默认为 2,意味着两次失败或两次相同调用就会触发;如果任务本身试错频繁,可以按需调高。
- 包未发布到 npm,版本演进以 GitHub 仓库为准。
这个插件的价值在于把「负面结果」从被跳过的噪声变成被消化的信息。目录页见 https://www.skillhub.cn/plugins/ICCuse/dsh-pain-point-check ,源码见 https://github.com/ICCuse/dsh-pain-point-check 。