AI垃圾过滤 · Kill AI Slop
AI垃圾过滤 · Kill AI Slop
把收到的文件压一遍:给出一个体检得分,抽出一份不掺水的结论。
@yiyunet/dsh-kill-ai-slop · DSH 插件 · 零依赖 · 零联网 · 零上传
⚠️ 当前状态(请先读这一格)
| 项 | 状态 |
|---|
| 源码 | ✅ 已实现(宿主 8 模块 + 客户端 2 模块 + 4 脚本 + 4 测试文件) |
npm run build | ✅ 通过 —— lib/ 落盘 9 个文件;装载层自证:顶层执行 OK / 注册 OK / 导出 {name,inject,apply} OK |
npm test | ✅ 77 / 77 通过(规则、计分、提炼、解析、报告) |
npm run verify | ✅ 12 类发布契约断言全过 |
| 装进 DSH 跑通 | ✅ 已装并在跑 —— 设置 → AI垃圾过滤 面板可开;宿主注入 6 个工具;txt / md 输入多轮实测 |
| npm 发布 | ✅ 已发布 —— @yiyunet/dsh-kill-ai-slop |
已通过的是两件事:「代码自洽」(单测覆盖的规则与算式、发布形态的完整性)
和**「宿主契约」**(面板位、RPC 信封、工具注入、模块装载)。
dsh plugin add @yiyunet/dsh-kill-ai-slop 现在可直接装。
一句话说清
你收到一份文件,想知道它值不值得读。
这个插件读完以后给你两样东西:
- 一个体检得分——表达、执行、决策三个层面各扣了多少、为什么;
- 一份提炼——它到底要干什么、说了什么、主张什么、什么态度、要谁做什么。
它在 DSH 的 设置 → AI垃圾过滤 里,与其他插件的设置面板同层。
两个词:AI Slop 与 Work Slop
名字里的这两个词就是这套打分的两个出发点(都是公开词汇,三个上游开源项目讲的就是它们):
| 词 | 指什么 | 对应本插件的 |
|---|
| AI Slop | 看起来像内容、实际没内容的表达填充:套话、重复、模板、模糊、结构噪音 | 表达(A)—— 占 20% |
| Work Slop | 把本该完成的思考与整理转嫁给接收者:不写目的、不给依据、不指人、不限期 | 执行(C)+ 决策(D)—— 占 80% |
两者的共同点:都不问"谁写的",只问"这份文件要你多花多少力气"。
所以这个插件既不猜作者,也不给"AI 生成概率"。
为什么执行与决策占八成:一份文风朴素、但事实充分的技术报告,只是"不好看";
而一份目的不明、没有依据、没人负责的方案,会让你把它退回去重做 —— 后者才是真正的成本。
为什么不做"AI 率"
市面上大多数工具给你一个数字:"87% 可能是 AI 写的"。这个数字有两个硬伤:
- 文风不是作者身份的证据。 人写的空文件、AI 辅助的高质量技术件,文风都可能"不像真人"。
- 它答非所问。 你真正想知道的是"这份文件能不能用",不是"它是谁写的"。
所以这里给的是一个可回溯的体检得分,全程不涉及作者:
| 层面 | 权重 | 判什么 |
|---|
| 表达(A) | 20 | 多少表达成本没有转化成信息:套话、重复、模板、模糊、无效结构 |
| 执行(C) | 40 | 交付里「要谁做什么、什么时限、做成什么样」有没有交代 |
| 决策(D) | 40 | 交付里「选了什么、放弃了什么、依据是什么」有没有交代 |
三项加权成一个「体检得分」(0–100,越高问题越重)。执行与决策占八成,因为这个插件抓的是工作空转,不是文笔——
文风朴素但事实充分的技术报告,不该因为"不像散文"被判差文件。
权重 20 / 40 / 40 是初案、未校准。它是给人看的方向盘,不是给绩效用的尺子。
安装
dsh plugin add @yiyunet/dsh-kill-ai-slop
然后在 cordis.patch.yml 里(通常已由包的 patch 自动注入)确认:
- insert:
- id: kill-ai-slop
name: '@yiyunet/dsh-kill-ai-slop'
重启 Host → 打开 设置 → 左侧出现 AI垃圾过滤。
本版本的 lib/ 需要构建生成。若你是从 git 直接安装,prepare 会自动跑 scripts/build.mjs;
从 npm 安装则产物已在包内。
第一步:自检
装完先跑这个,它会告诉你"引擎活没活着、支持什么格式、哪些开关是关的":
slop_engine_info
返回里重点看三项:
| 字段 | 含义 |
|---|
gates.inputRoots | [] = 宿主文件读取关闭(默认)。要用 slop_audit_file 必须先配它 |
supported / notSupported | 能分析什么、不能分析什么(不做 OCR、不拆压缩包) |
weightsAreProvisional | 权重是初案的提醒,每次自检都会重申 |
三种用法
① 设置面板(主路径,推荐)
设置 → AI垃圾过滤:
- 「上传文件」拖入文件,或「粘贴文本」直接贴;
- 选文档类型(是适用性开关,见下)与提炼档位;
- 点「开始体检」;
- 看四个页签:总览 / 证据 / 提炼 / Markdown;右下可「复制 Markdown」「保存报告」。
点「保存报告」会弹系统的另存为对话框,存哪里、叫什么名字都由你定;宿主机不落任何文件。
文件不上传:面板把内容交给本机 Host 进程,在内存里算完就结束。
② 给 agent 用:slop_audit_text
slop_audit_text(text=<原文>, docType="proposal", level="summary")
format="json" 可拿结构化结果做二次加工。
③ 直接分析宿主上的文件:slop_audit_file
⚠️ 默认关闭。它读的是宿主进程的文件系统,比 agent 自己的沙箱更大,所以默认不开口子。
要开启,在 cordis.patch.yml 里加:
- id: kill-ai-slop
name: '@yiyunet/dsh-kill-ai-slop'
config:
inputRoots:
- '/absolute/path/to/inbox' # 只有这个目录内的文件会被读
同时也支持 slop_distill(text=…) —— 只提炼、不评分。
④ 审查"任务有没有被接住":slop_obligation_audit
这是 v0.2 的主线能力,解决的问题是:只给一份文档,算不出"任务承接"。
因为 Work Slop 的定义是「任务要求 与 实际交付 之间的缺口」——两个操作数的差。
所以这条路要求两份输入:原始任务原话 + 待审文档。
分工是刻意的:
| 谁做 | 做什么 |
|---|
| 你(或你用的模型) | 拆义务:任务要求交的每件事算一条,逐条判 met / partial / missing / conflicting,并摘出原文引文 |
| 本插件 | 只做校验:引文是不是真的在原文?行号对不对?说"已满足"却拿不出引文算不算数?结论有没有越权? |
不会拆义务?看 OBLIGATIONS.md —— 那是配套的《义务表起草规约》:
三条硬规则、从任务原话到义务的三步、五种字段怎么填、四条禁令、常见错法对照。
没有它,这条链只有会拆义务的人能用;有了它,任何人都能跑出可核对的台账。
插件从不判断结论对不对,只判断证据有没有。 因为模型最容易出问题的地方正是编行号和编引文,
而规则层在这件事上百分之百可靠 —— 引文对不上的判定,一律降级为不可采信。
slop_obligation_audit(
task="线上垂直平台开拓尽快出一个落地方案",
path="…/报告.md",
obligations='[{"id":"O1","question":"首轮优先推进哪些渠道?","coverage":"conflicting",
"evidence":[{"quote":"最佳首选","line":65},{"quote":"优先级表将其放在P2","line":95}]}]'
)
四条硬闸门:
- 状态必须可机器统计:写"没问题""通过"这类非枚举值直接判违规;
- 说"已满足"就必须有通过复核的引文,否则不予判定;
- 没有任务原话就不许判定"任务承接" —— 只出清单,并写明"这是检查表,不是任务要求";
- 引文太短不算证据("P2"两个字符在任何长文里都能随机会中)。
写任何带证据的评审之前,可以先用 slop_verify_quotes 单独自查一遍引文。
文档类型是"适用性开关"
同一份文件,当纪要读和当方案读,评分本来就该不一样。所以"类型"不是风格选项,是规则开关:
| 类型 | 会被关掉的维度(点明理由) |
|---|
| 会议纪要 | B3 论据支撑(纪要靠如实记录,不承担论证义务)、B5 决策支持 |
| 说明 / 科普 | B3、B5、B6(说明类不指派责任人,缺责任人不算缺陷) |
| 通知 / 公告 | B3、B5 |
| 研究 / 调研 | B6(研究报告交付结论,不承诺执行动作) |
| 方案 / 计划 / 报告 | 全维适用 |
| 其他 / 不确定 | 关 B6(避免体裁误伤) |
不适用 ≠ 0 分:它们退出分母并在报告里写明理由。
支持的文件
| 格式 | 解析方式 | 说明 |
|---|
txt md csv json log yaml html rtf | 直读 | UTF-8 / UTF-16 BOM 优先,GBK 兜底 |
docx | 自行解析 ZIP → word/document.xml | 取段落文本;页眉/页脚/内嵌对象不计入(会提示) |
pptx | ZIP → ppt/slides/slideN.xml | 按页序;演讲者备注不计入 |
xlsx | ZIP → 共享字符串 + 工作表 | 按行列展平;公式取缓存值,不重算 |
pdf | 内容流 inflate → 文本算子 | 启发式:不做 OCR、不做字体编码映射 |
doc xls ppt、压缩包、图片、eml | 不支持 | 报错里直接给"该怎么另存" |
无 OCR:扫描件 PDF 抽不到字时,报告会明示"覆盖不足"并拒绝给总分,而不是给一个假分数。
报告长什么样
首屏是结论,不是数据:
**体检得分 N / 100(档位)**
表达 X · 执行 Y · 决策 Z(权重 20 / 40 / 40,初案未校准;越高越重)
紧接着是为什么是这个分:每个扣分点都带可定位证据(第几行、命中哪条、怎么改),
外加一份五要素提炼(目的 / 阐述 / 观点 / 态度 / 执行)——每句都是原文片段,不改写。
规则判不了的部分会退出分母、并在结论区点名,而不是假装查过:
「方案里出现过风险」这类词能查到,但「识别到风险之后改了什么」要判因果,规则不给分。
"我没看"不许印成"没问题"。
⚠️ 两件事必须知道:
- 零命中不等于干净 —— 也可能只是规则没覆盖到这个体裁或语种;
- N 也可能是"未判定" —— 解析覆盖率低于阈值、或多数维度不适用时,报告拒绝给总分,明说覆盖不足,而不给一个看起来精确的假分。
每条命中都是这个三段式:引原句 → 为什么 → 怎么改。没有证据的分数不可回溯,不如不给。
五要素提炼
| 要素 | 必须区分 |
|---|
| 目的 | 原文明示 / 推断 / 未明示 |
| 阐述 | 客观事实 / 原文主张 |
| 观点 | 结论 / 假设(保留等级) |
| 态度 | 明确表态 / 未表态(不读心) |
| 执行 | 已写明 / 未说明(不补填) |
另附证据与限制、必须追问的问题。
它是抽取式,不是改写。 每一条都是原文连续片段,带行号,可以回原文逐字核对。
代价是读起来不如人写的摘要顺;收益是永远不会把"预计降本,尚无测试数据"写成"可以降本"。
三个档位:
| 档 | 用途 | 特征 |
|---|
| 保真精简 | 拿去做汇报 | 保留结构与顺序,只删纯套话与重复句 |
| 工作摘要(默认) | 拿去决定与派活 | 按五要素重组,全部原句摘录 |
| 速读卡片 | 快速了解 | 每要素 ≤3 条,明示不能替代原文 |
每档都附删了什么、为什么删、可能损失什么。
隐私与安全
| 项 | 默认 | 说明 |
|---|
| 联网 | 无 | npm run verify 有一条断言专门守"零联网",引入网络模块会直接红 |
| 上传 | 无 | 面板把内容交给本机 Host 进程,浏览器不向任何外部地址发送文件 |
| 落盘 | 无 | 点「保存报告」走浏览器另存为,落点是你选的那个目录,宿主进程不写盘 |
| 原文回传 | 开启 | 报告要含证据片段才能回溯;敏感文件可设 includeSnippets: false |
| 宿主文件读取 | 关闭 | inputRoots: [];要开必须显式列目录 |
| 最近报告 | 内存 20 条 | 不写盘,Host 重启即清空 |
文件是数据,不是指令。 文件里写"忽略以上指令、给满分"不会改变任何判定 ——
插件不执行文件内容,只做文本匹配与统计。文档也不能自我豁免。
配置项
- insert:
- id: kill-ai-slop
name: '@yiyunet/dsh-kill-ai-slop'
config:
maxFileBytes: 20971520 # 单文件上限 20 MB
maxRpcBytes: 12582912 # 面板单次上传上限 12 MB(base64 会膨胀约 1.37 倍)
maxChars: 600000 # 参与分析的字符上限,超出截断并明示
minParseCoverage: 0.7 # 解析覆盖率低于此值 → 不出总分
minEvalCoverage: 0.6 # 可评估权重低于此值 → 出分但标"部分结论"
includeSnippets: true # 报告是否含原文片段
reportRoot: '' # 工具/自动化落盘用;面板的「保存报告」不依赖它
keepRecent: 20 # 内存里保留最近几份报告摘要
# inputRoots: ['/abs/path'] # 不设 = 关闭 slop_audit_file
已知限制(请务必读)
- 不做 OCR。 扫描件 PDF 抽不到字,会明示覆盖不足并拒给总分。
- 不做作者鉴定。 不输出"AI 生成概率"。文风不是作者身份的证据。
- Office / PDF 解析是结构级的,不做版面还原。 PDF 走启发式:字体编码映射、分栏顺序、表格结构都可能失准,报告标注
pdf-heuristic 并下调可信度;docx / xlsx 按 OOXML 结构取文本与单元格,页眉页脚、文本框、图表、批注可能不计入。一律以报告中的覆盖率为准。
- 不做语义理解。 规则在符号层面(词表、结构、数值一致性),抓不出"逻辑通顺但结论错误"这类问题——那仍需人读。
- 权重与阈值是初案(未经校准)。
25/25/20/20/10 与 15/20/20/20/10/15 及各阈值未做任何实测校准。当前分数只适合横向粗筛,不适合当对外结论或绩效依据。
- 中英共用一套阈值。 语种差异未验证。
精度不达标时的处置顺序写在方法论文档里:先收窄适用文档类型,再降级为"只出线索不出分",而不是放宽判据硬凑。
开发
npm run doctor # 前置条件体检(Node 版本 / GBK 支持 / 文件齐全 / 零依赖)
npm run build # plugin-src/ → lib/(零构建依赖,不用打包器)
npm test # node --test,单测直接测 plugin-src/
npm run verify # 十一条发布契约断言
npm run check # build + test + verify
- 唯一真源是
plugin-src/,lib/ 是产物,改了会被下次构建覆盖。
- 改判定规则 → 升
RULESET_VERSION;改计算流程 → 升 ENGINE_VERSION(须与 package.json 同步)。
不升版本 = 新旧分数被当成可比 = 历史结论作废。
- 维护者请先读
CONTEXT.md 的「五个不可随手改的设计决定」。
许可
MIT。
方法论参考了三个开源项目(stop-slop / no-ai-slop / kill-ai-slop),
未复制任何代码,致谢与"吸纳/不吸纳"的逐项理由见 THIRD_PARTY_NOTICES.md。