五个正交的 Cordis 插件(4 认知监督 + 1 成本监督),不改 DSH 内核,只用官方接缝。 不提升模型能力——模型已经够强了;它管的是偶尔会出现的几种「跑偏」。 实测结论:几乎零成本地把「打转」削掉一半(−48%),单任务成本仅 +2%。
强模型在长任务里偶尔会停在一个低于自己水平的状态。三种症状,中了哪条装哪个插件:
| 你会看到的症状 | 它为什么坏 | 插件 | 做什么 |
|---|---|---|---|
| 第 1 轮说了硬约束,第 6 轮忘了——把「不许动」的文件也改了 | 全局目标被最近的局部信号挤掉 | dsh-contract |
把首条消息落成任务契约(含约束原话)钉进 system prompt |
| 反复读文件、就是不推进——烧掉几十步,最后啥也没改 | 轨迹塌进「打转」,没有信息增益 | dsh-convergence |
数连续只读,到阈值提示「停止读,直接改/验证」 |
| 说「已完成」,其实一次没跑过——改了文件就宣布成功 | 模型被自己的结论锚住 | dsh-evidence |
检测「声称完成 + 改了文件 + 没有一次成功验证」 |
上面三个只检测,真正「开口」的是第四个:
| 插件 | 职责 |
|---|---|
dsh-intervention |
唯一注入点:读前三个状态 → 注入提示,或在轮次收尾 agent.steer 强制再走一步 |
检测(写状态)与行动(读状态)分开 → 每个都能单独开关、单独调参,互不耦合。
B 组|成本监督(一个):dsh-budget —— token 不知不觉烧掉一大截时,到阈值软提醒一次(不中断、不做硬熔断)。与 A 组完全正交,可只装 A 不装 B。
一句话定位:给强模型加的过程保险。风险不是「模型做错」,而是「模型偶尔停住或自我说服」。适用于长任务、要它真跑起来、无人看管防打转、控成本;不适用于一句话问答。
node install.mjs # dry-run:只打印命令
node install.mjs --apply --profile <你的profile> # 真装(5 个包 + 自动自检)
node install.mjs --check --profile <你的profile> # 只自检
⚠️ 不要用add github:qlheric/dsh-cvm(不带#path:)——本仓库根是 workspace 包,那样只装到根包、一个插件都不生效。
所有阈值/关键词/提示文本都在各插件 Config(schemastery),可在 cordis.patch.yml 覆盖(跨升级存活):
- id: convergence
config:
threshold: 5 # 连续只读 5 次判定打转
- id: intervention
config:
steerAtTurnStop: false # 关掉「收尾强制再走一步」
- id: evidence
config:
enabled: false # 整个终局门禁关掉
- id: budget
config:
maxTokens: 1000000
softRatio: 0.8一句话结论:削打转 −48%,单任务成本 +2%(基本打平)。 价值在「过程」(少打转、少假完成),不在「结果」——强模型本来就不怎么掉,任务成功率测不出差异。
完整数据台账在
C1-AB数据汇总.md,下面的数字都来自各 20 次的 A/B(eval/batch-eval.mjs)。
早期实测打转确实被削了(−33%),但 token 成本反而 +28.7%。最初怀疑是「动态注入 system prompt 破坏前缀缓存」,于是加了两项观测来验证:
- 缓存命中率:
cacheReadRatio基线 96.4% → 装插件 95.2%,几乎没动——缓存根本没坏。 - 成本加权 token(cache_read ×0.1、cache_write ×1.25,区分「命中 vs 未命中」):这才是真实成本。
结论:成本上升不是缓存失效,而是「轨迹变长」——干预把「一次长打转」拆成了「多次短探索/验证」,模型被提醒后反而更谨慎、多读多验,总工作量增加。
对症下药:不是改注入机制,而是改文案方向。原来提示「换一种方法」是发散指令(诱发更多探索);改成收敛指令后成本一路压下来:
| 版本(各 20 次) | 打转 maxReadStreak | 真实成本 costTokens |
|---|---|---|
| 旧文案「换一种方法」 | −33% | +28.7% |
| 收敛文案「停止读 + 直接改」 | −48% | +12.7% |
| +「验证一次就够」✅ | −48% | +2.2% |
| 滞回冷却(边沿只注入一次)❌ | −34% | +8.6%(已回退) |
最终定案的干预文案(收敛版,也是默认):
⚠️ 运行时检测:已连续 N 次只读、无推进。停止读文件,直接改最可疑处并运行验证——验证一次就够,不要反复验证;不确定就运行最小复现命令;信息不足就用一句话说明卡点。
- 样本 20 次/组,方向性证据,未到生产级(隔离
DSH_HOME+ headless)。 - 结果指标测不出:强模型在 C5 场景基线就 20/20,价值只在过程指标(打转长度/步数),且要看 sd / 极值,不能只看均值。
- 阈值有倒 U 型最优窗口:T=5 最优,T=3(过早打断探索)和 T=8(已陷深打转)都比不装还差。
- 留着一个被撤回的假阳性当标本:差异 10pp 时 p≈0.34,样本不够就下结论会翻车(详见台账 §11)。
dsh-evidence早期把tool/result.error当「工具失败」,在调试场景误判正常报错,退化率反涨到 37.5%。修正为「验证工具成功执行才算验证过」后消除。dsh-convergence的threshold过低(T=3)会过早干预、恶化过程。dsh-budget的团队聚合是「下界」:只计当前活跃子 agent(已结束的无法归属)。
⇒ 每个插件都可配、可单独关;调参按场景标定,不照搬默认值。
- 场景文件每轮复位,复位源不能是 git HEAD(模型产物会被
git add -A一起提交)——用独立模板目录eval/scenarios/。 - A/B 数据并存:
batch-eval.mjs --label A|B,否则互相覆盖。 - 别只看均值:强模型的过程指标均值可能不动,差异在 sd / 极值 / p90。
- 单测 mock 必须对齐真实事件结构(
user/message的 payload 是 UserMessage,assistant/message才是嵌套{turn,step,message})。 - 归因要分项 token:
totalTokens简单相加看不出缓存问题,要用cacheReadRatio+costTokens(成本加权)拆「缓存失效 vs 轨迹变长」。
packages/dsh-{contract,convergence,evidence,intervention,budget}/ # 五个插件
install.mjs # 一键安装器
eval/ # 评测集 + 驱动 + cost-summary
src/domain/ # 单测
*.md # 知识底座、调研、数据台账
MIT