dsh-compaction-audit
已验证dsh-compaction-audit · v0.1.0 · MIT
Compaction quality / hallucination detector: when a conversation span is compacted, check on two axes that key information survived 鈥?FIDELITY (assertions in the summary must be found verbatim in the original leaf events, else flagged as fabricated) and C
安装
dsh plugin add dsh-compaction-audit 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
作者
说明文档
dsh-compaction-audit
压缩质量 / 幻觉检测插件。当一段会话被压缩(单个 compaction/summary 事件,带一个 summary ContentBlock[] 并遮蔽一段原始事件)时,该插件沿两条轴校验关键信息是否幸存进摘要:
- 保真轴(fidelity,硬错误):摘要写下来的每条"可验证原子事实"(UUID / 绝对路径 / 带扩展文件路径 / 带项目根标记的相对路径 / 带单位数值 / 用户纠正)必须在原文叶子事件中找到逐字一致的依据;找不到 → 标记为
unverified(未验证候选)。 - 覆盖轴(coverage,加权):原文叶子事件里的关键原子事实(硬类目恒关键;数字类仅当重复次数 ≥
criticalNumberCount)未被摘要断言 → 标记为lost(信息丢失候选)。 - 合规轴(层 A,确定性,零 LLM,可选):用可配置词表(keep/drop/scope)做字面检查——专盯"用户明确要求的词是否被压缩弄丢 / 被纠正掉的旧说法是否复活"。详见下方"合规轴"章节。
合规轴(层 A,确定性,零 LLM)
沿第三条轴,用一个字面词表检查压缩是否破坏了用户明确强调或纠正的内容。零 LLM、闭集、只读信号。
- keep(应保留词):在原文字面出现、但在摘要中缺失 →
missing(如"打分/全量/持仓/公告/落盘"被压缩弄丢)。 - drop(禁用/被纠正掉的词):在摘要中出现 →
superseded(被纠正掉的旧说法复活,如"环节/营收占比")。 - scope(范围/量词):在原文出现但摘要缺失 →
scopeLost(范围/限定丢失,如"所有/全部/完整")。 - coexists_review:keep 词与 drop 词在摘要并存 → 需人工复核(仅共现布尔,不做"谁对"判定)。
语义边界(重要):
- 这是字面检查,只测"你锁定的词字面串是否在摘要里还在/被废弃词是否出现"。
- 不抓语义改写:摘要把"打分"改写成"评估",不算丢(字面不在即不判)。
missing/superseded/scopeLost/coexists_review均为候选,需人确认;检测不改压缩结果、绝不阻断会话。
默认词表(含常用高频错误词,可用 complianceVocab 覆盖):
// complianceVocab 填 JSON 字符串即可覆盖对应 key;不填用默认;坏 JSON 回退默认不崩
{ "keep":["评分","打分","全量","齐全","持仓","公告","挂","落盘","更新","HTML","公司","弹性纯度"],
"drop":["环节","营收占比"],
"scope":["全部","所有","每","完整","all","every","each","full"] }
设计不变量(红蓝对抗·共识版)
- 闭集确定性抽取:只用正则可定义的类目(UUID/路径/数值/纠正),归一化 + 去重后原子事实集。绝不"评价叙事"。
- 断言即升级:原子事实一旦在摘要中成文,即强制逐字比对,不经"是否可疑"门控。
- Ground truth 约束:仅非 summary 的 leaf 事件(经 provenance 账本,即
session.events[seq],在 summary 落地那一刻解析——由dsh-compaction-probe验证可读)可作为校验基准。 - 只读信号生产者:写具名
audit.signals记录(默认落到dsh-home/reports/compaction-audit.jsonl);绝不注入 LLM 合成/转述内容;任何 re-injection 均 opt-in(optInInject,默认关闭)。 - 绝不阻断是机制:
apply全包 try/catch;每个 handler 都隔离;失败吞日志不外抛。
语义与边界(重要,避免误用)
unverified= 候选,不代表"捏造"。它可能是真捏造,也可能是: ① 账本不完整(摘要器消费的窗口可能比shadowedSeqs记录的大,见ledgerIncomplete);② 事实表达方式不在闭集类目;③ 原文在可见账本之外。- 这是闭集硬事实保真/覆盖下限信号,不是通用叙事幻觉检测。摘要捏造一段"合理但错误"、不含硬事实的叙事,不会被检出。
scope字段在每次记录里显式写出检测范围。- 关键阈值未标定:
criticalNumberCount、PATH_MARKERS白名单、maxFactsPerCategory都是手工默认值,需按计划用 N=50 人工标注集校准后才能作为 CI 门槛。默认值只作探测。
工作原理
- 订阅
session/event,仅处理compaction/summary。 - 从 summary 文本抽取原子断言集
summaryFacts;从shadowedSeqs经session.events[seq]建立 provenance 账本,抽取叶子事实集。 - 对每个 summary 事实做逐字比对 →
verified/altered/unverified。 - 对每个"关键"叶子事实做覆盖检查 →
lost。 - 写
audit.signals记录(带 fingerprint 去重、ledgerIncomplete/truncated/scope标注),并在后端控制台打一行摘要。
一次「audit.signals」范例
{
"at": "...",
"signal": "compaction.audit",
"scope": "closed-set hard facts only (uuid | absolute/file path | number-with-unit | user correction); NOT general-narrative hallucination detection",
"sessionId": "session-...",
"compactionId": "...",
"summaryModel": "deepseek-...",
"shadowedSeqsCount": 678,
"shadowedRange": { "start": 8, "end": 173426 },
"summaryCharCount": 7847,
"summaryFactsCount": 12,
"leafFactsCount": 21,
"ledgerIncomplete": true,
"truncated": false,
"fidelity": { "verified": 4, "altered": 0, "unverified": 8, "candidates": [] },
"coverage": { "lostCount": 10, "lost": [] },
"fingerprint": "<sha1-16>",
"optInInject": false,
"blocked": false
}
配置(cordis.patch.yml)
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
关闭整个插件 |
reportFile |
""(→ dsh-home/reports/compaction-audit.jsonl) |
审计记录文件 |
checkPaths |
true |
是否抽取路径类目 |
checkIds |
true |
是否抽取 UUID |
checkNumbers |
true |
是否抽取带单位数值 |
checkCorrections |
true |
是否抽取用户纠正 |
maxFactsPerCategory |
500 |
每类目事实数上限(防爆炸) |
criticalNumberCount |
2 |
数字类"关键"所需的最小出现次数 |
optInInject |
false |
是否输出 re-injection 候选(默认关) |
debug |
false |
是否把每条 session 事件写心跳到 audit-debug.jsonl(排查用) |
checkCompliance |
true |
是否启用合规轴(层 A,字面检查) |
complianceVocab |
"" |
JSON 串 {keep,drop,scope},覆盖默认词表;空/坏值回退默认 |
complianceFpVersion |
"1" |
合规词表/规则版本;改词表时递增以强制重新审计 |
注:开启后,每次审计记录会多出
compliance字段(层 A 四布尔);blocked恒false,绝不阻断。
依赖
@deepseek-ai/cordis、@deepseek-ai/schemastery(peer)- 配套见
dsh-compaction-probe(Step-0 探针,验证compaction/summary投递 +shadowedSeqs可读性)。
说明
lib/index.js 是后端加载的产物;src/index.ts 是可维护的 TS 镜像(两者保持一致)。dsh-plugin-lint.js / check-plugins.ps1 可在重启前静态校验本插件。