hongdougao111/dsh-bagu:AI 对外说话前的一道门

前言

智能体接入聊天、评论、commit、PR、文档之后,一个常见问题是:它写的东西看着像人写的,闻着像模板。同一个 agent,在评论里写「感谢分享,受益匪浅」,在 commit 里写「优化了代码结构,提升可维护性」,在注释里写「// 初始化计数器」。人工看到这些内容只是不舒服,但如果 agent 在自动回复、自动发版、自动评审的链路上,这些模板腔会原样发到外面。

已有的做法是事后审:要么人肉看着输出再拦,要么在提示词里多写几句「不要说套话」。前者靠不住,后者也靠不住——模板味是靠规则认形状,不是靠一次生成换个措辞就能消掉的。

dsh-bagu 把这件事挪到发出前:AI 要把文本往外发之前先过一道本地正则,过了就发,没过就打回,附一句怎么改。判断不调模型,开销固定。

这是什么

hongdougao111/dsh-bagu,作者 hongdougao111,DSH 插件,分类 admin-security。一句话定位是「AI 要对外说话之前的一道门」,覆盖聊天、评论、邮件、commit、PR、文档、代码注释这些 AI 写、人来看的输出场景。

所谓「过一道」,是指文本在发送前先交给 bagu_guard 检查。通过就回 OK,未通过就打回,并附一句修改方向。

判断标准只有一句:换个人说,这句话还成不成立。

「卖卡卖完了随便写了」              → 能发(编不出来)
「这个视频真的很不错」              → 打回(谁都能说)
「登录失败时不再清空已填的手机号」   → 能发(具体到一行)
「优化了代码结构,提升可维护性」     → 打回(改哪一行?没说)

规则结构:三层

规则搭成三层,越往下越具体。前两层不分场景,第三层是各场景长出来的。

第一层通用,分三类:空转(说了动作没说做了什么,例如「优化了代码结构」「修复了若干已知问题」)、空形容词(能贴到任何产品上的词,例如「先进的技术架构」)、万能话(放到哪都通顺,例如「随着人工智能的发展」)。

第二层套话,分三类:模板整句(「这条我认」「本鱼记下了」)、鸡汤口号(「愿你所行皆坦途」)、学习腔(「学到了很多」「非常实用」)。

第三层场景,README 里给了 git 和代码注释两组:

feat: 优化了用户模块的代码结构          → 空转
## 概述 / ## 改动 / ## 影响            → PR 模板骨架
整体实现思路清晰,建议后续优化          → review 空话
感谢反馈!这个问题我们已经记录          → issue 客服腔

// 初始化计数器                        → 打回
// 这里之所以要排序,是因为下游依赖顺序稳定的分页   → 能发

注释这条的判据是:注释要解释 why,不要解释代码本身已经表达的 what,来源是 beagle 的 style-criteria 和 voku/code-slop 的 comments-hygiene。

实测数据

README 给出的实测表列了 8 行结果,脚本都在 tools/ 里可以直接跑:

测试 样本 结果
贴吧真人(孙吧 + v吧原文) 68 条 误拦 0
B站评论(猫娘草稿法 + 鱼八股热评) 50 条 误拦 0
全域场景(18 个场景 × 2 条) 36 条 漏 0,误拦 0
真人原话(DSH + 聊天) 51 条 误拦 0
git 真人(commit + PR + review) 28 条 误拦 0
AI 八股(客服腔 + 对举 + 空夸 + 模板) 35 条 拦住 35(100%)
真实场景 25 条 漏 0,误拦 0
对抗绕过(故意换皮) 10 种 拦住 6(60%)

复现命令:

node tools/tieba-real.mjs   # 贴吧真人 68 条(孙吧、v吧原文)
node tools/all-scenes.mjs   # 18 个场景,36 条
node tools/falserate.mjs    # 真人 51 条
node tools/git-false.mjs    # git 真人 28 条
node tools/missrate.mjs     # AI 八股 35 条
node tools/evasion.mjs      # 对抗绕过
node tools/audit.mjs        # 真实场景 25 条

其中贴吧那批 68 条值得单独说一句。孙吧、v吧的真人说话里有反问、三段并列、复述后反打、直接骂、单字回复、接梗这些形状,按「八股规则」看容易误判,但这批数据零误拦——规则没把真人的这些说话方式当成模板整句。

写出这批语料的来源和措辞风格,是判断这套规则「会不会误伤真人」的关键样本。

引用和使用的区别

这是这道门最难判的一点:当一句话出现在引号里、被批评、被当例子点评时,不应该拦。

「评论区一水儿「我记下了」」        → 在讨论这句话,不是用它 → 放过
「我记下了」                        → 直接用了 → 拦
「不要只说「受益匪浅」」             → 在批评,不是在使用 → 放过
「受益匪浅」                        → 真在拍马屁 → 拦

判据有四条:引号里的内容不参与判断;套话前面有否定词(不要/别/避免)时表示在批评;套话前面有指代词(这句/这个/这条)时是在指代前文;套话后面跟评价词(雷/反面教材/课后题)时是在拿它当例子。

它拦不住什么

对抗测试里 10 种绕过手法拦住了 6 种,剩下 4 种是已知边界:

  • 换同义词——「功能多牛啊,用起来也顺手」,词换了形状没换
  • 换成英文——英文只做了留白词,句式没做
  • 加脏话伪装——「真他妈不错」,脏话把评价词淹了
  • 去掉分组标记——「目标是明确的,任务是拆过的」

README 把这件事说得比较直接:规则只能认形状,认不了「这句话是不是真的」。这是止血带,不是解药。

长文和短句

300 字以上的文本不跳过,长邮件、长周报、长 PR 一样会八股。但长文的门槛不同:同一个信号要出现两次以上才算,出现一次不打回。否则长文里偶尔一个「优化了」就会被整体打回。

短句也有专门处理。聊天回复二三十字是常态,密度指标在这个长度上分母太小,所以六十字以下切换成绝对计数,不看密度,看命中了什么。

「这不是技术问题,而是认知问题。」   → 打回
「卖卡卖完了随便写了」               → 能发

用法

默认模式是守门,调用一次,通过回 OK,打回回一行 40 字内的修改方向:

bagu_guard({ text: "这条我认!首先态度要正,其次内容要实,最后要持续更新。" })
→ "改:模板三连 · 直接说事,不用「首先其次最后」"

bagu_guard({ text: "登录失败时不再清空已填的手机号" })
→ "OK"

输出预算写得很明确:通过 2 字,打回一行 40 字内。按严重度排,只报第一条——README 给出的理由是报三条的话 agent 会挑最轻的去改。

另外两种模式:

bagu_guard({ text, mode: 'report' })    // 详细报告,给人看
bagu_guard({ text, mode: 'ask' })       // 只要问句

梗库:选装,默认关

插件带一个梗库模块,数据来自梗Wiki 公开 API。它判的是另一件事——「这个梗过气了没」「这词什么意思」——跟「谁都能说」不是一回事,所以默认关着,要用在设置页开。

开之后多两件事:bagu_meme({ q }) 可以查一个词是什么意思;bagu_guard 的结果后面会附一句「梗:XXX」,不改判定。守卫器本身不依赖梗库,从梗库里提炼出来的视频开场白(「注意看」「这个男人叫小帅」「话不多说」「一键三连」)已经写进规则里的 VIDEO_STOCK,开不开梗库都不影响。

数据文件在 data/memes.json,120 条有完整锚点的词条(59KB),全量是 3180 条。

node tools/fetch-memes.mjs data/memes.json 20    # 抓梗库

安装与启用

dsh plugin --profile web add dsh-bagu

装完重启一次 dsh,「设置 → 八股检测」里可以看到设置页。

设置页

设置页有四项:挡不挡(总开关)、多严(正常只拦硬信号,严格连破折号也拦)、提示那一节(关掉只留工具,不往系统提示里塞话)、试一段(五种样本,当场看能不能过)。

运行开销

判断全在本地正则里跑完,不调模型。固定开销:

项 大小
系统提示注入 31 字
工具描述(1 个) 54 字
守门器输出 2 字(通过)/40 字内(打回)

系统提示只有一句:「要发出去的话,先过 bagu_guard。被打回就改,别硬发。」

开发与许可

npm test    # 70 个单元测试

package.json 里 main 是 lib/index.js,Node 版本要求 >=18,构建产物包含 lib、test、data、client.js、dsh-plugin.json、cordis.patch.yml。许可证 MIT。

数据来源方面,README 给了四类:两轮对照实验(1169 篇、520 万字)、10 万条真人评论和 2180 条 AI 评论的密度实测、sloplint 的评分公式、beagle 和 code-slop 的注释判据。

适用场景与注意

适合这类人:已经在用 DSH 跑自动回复、自动发版、自动评审、自动写文档的 agent,不想让模板腔原样发到外面,同时希望检查在本地完成、开销可控、不依赖模型调用。

两点需要自己判断。第一,插件以当前 dsh 进程的权限运行,能读到该进程能读到的所有上下文,安装前把 dsh-bagu 的源码和 cordis.patch.yml 过一遍。许可证是 MIT,但许可证解决的是能不能用,不是会不会出事。第二,它的判断是正则形状匹配,不是语义理解——同义词替换、英文句式、脏话伪装这些手法在对抗测试里确实绕过了。在你把它放进自动发送链路之前,先用设置页里的「试一段」跑一遍你自己的真实语料。

结尾

这套方案的价值在于把「AI 味」从提示词玄学挪成了可复现的本地检查,误伤真人的风险用贴吧、B站这类真人语料做了校准。它的定位写得很诚实:止血带,不是解药。

目录页:https://www.skillhub.cn/plugins/hongdougao111/dsh-bagu

GitHub:https://github.com/hongdougao111/dsh-bagu

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜