본문으로 건너뛰기
H

dsh-bagu

hongdougao111/dsh-bagu

외부로 나가는 AI 텍스트를 위한 두 게이트. (1) Guard: 전송 전에 군더더기 동사+추상 명사(“코드 구조 최적화”), 공허한 형용사, 만능 문구, 틀에 박힌 도입부, git commit/PR/review 상투문, 코드를 설명하는 주석을 차단합니다. 채팅, 댓글, 이메일, commit 메시지, PR 설명/리뷰, issue, 문서, 코드 주석을 검사합니다. 통과는 OK, 차단은 바꿀 내용을 한 줄로 안내합니다. (2) 밈 검색: 모델이 속어를 추측하거나 검색하기 전에 내장 밈 위키 6,792건을 조회하고 용례 필드 “how to answer this”를 컨텍스트에 넣습니다. title/slug/alias 완전 일치만 허용하며 fuzzy 검색은 없어 일반 대화는 작동하지 않습니다. node:sqlite 로컬 SQLite, 의존성 0, 조회 1.6ms. 설정: guard on/off, strict, 프롬프트 섹션, 위키, 턴별 자동 조회, 4단계 톤(reserved/measured/follow the room/unrestrained; 표시명만이 아니라 행동 조정), 별도 AI completion(기본 off, 켜면 해당 세션 모델 사용), 붙여넣기 테스트, 임계값 3개. 게이트 검사 자체는 모델을 호출하지 않습니다.

설치

dsh plugin --profile web add github:hongdougao111/dsh-bagu

README

dsh-bagu

两道门。发出去的话像八股,打回;对方抛了个梗,接住。

这是什么

AI 说话有两个毛病,这个插件各管一半:

一是写出谁都能说的话。「优化了代码结构」「这个视频真的很不错」「首先态度要正,其次内容要实」——换个人说照样成立,等于没说。

**二是认出梗却接不上。**群里冒出一句「康神开播了」,它要么当没看见,要么开始念词条:

✗「康神开播了」出自游戏主播陈兴玉观看另一位《无畏契约》区职业选手康康直播时的经典名场面…
✓ 真的假的 我去真开播了

第一件事靠规则,第二件事靠内置 6792 条梗词库 + 在模型开始想之前就查好。

一 · 守门:发出去之前拦一道

覆盖所有对外文本:聊天、评论、邮件、commit、PR、review、issue、文档、代码注释。

拦的是这些:

这条我认!首先态度要正,其次内容要实,最后要持续更新。
感谢分享!这个视频通过生动有趣的方式展示了相关内容,受益匪浅。
feat: 优化了用户模块的代码结构,提升了可维护性
整体实现思路清晰,代码结构合理,建议后续可以进一步优化。
// 初始化计数器
注意看,这个男人叫小帅

判断一句话:换个人说,还成不成立?

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

三层规则

第一层 · 通用(不分场景)

  • 空转——说了动作没说做了什么:优化了代码结构 / 提升了可维护性 / 修复了若干已知问题
  • 空形容词——能贴到任何产品上:先进的技术架构 / 高性能、高可用 / 具备良好的扩展性
  • 万能话——放到哪都通顺:随着人工智能的发展 / 众所周知 / 值得注意的是

第二层 · 套话

  • 模板整句:这条我认 / 感谢分享 / 受益匪浅 / 说白了就是
  • 鸡汤口号:愿你所行皆坦途 / 努力不一定会成功
  • 学习腔:学到了很多 / 涨知识了 / 希望以后多发这类帖子
  • 视频开场白:注意看,这个男人叫小帅 / 话不多说,让我们直接进入正题 / 一键三连

第三层 · 场景

  • git:commit / PR 模板骨架 / review 空话 / issue 客服腔
  • 代码注释:把代码念一遍

判据来自 beagle style-criteria 和 voku/code-slop: comments must explain why, never what the code already expresses.

引用和使用的区别

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

四条判据:引号里的不算、前面有否定词、前面有指代词、后面跟评价词。

二 · 玩梗:内置 6792 条,模型开始想之前就查好

**这一步和「能查梗」不一样。**查梗要模型主动调工具——它经常不调,直接按自己理解答了,或者联网搜一圈报个百科答案。

这个插件不等它调。用户消息一进来,先查好,把怎么接塞进上下文:

用户说:康神开播了

模型拿到的:
[梗] 对方提到:康神开播了
怎么接:…观众会刷"康神开播了"来指代这一经典片段。
        要回复 真的假的 我去真开播了
这一类:主播梗/游戏梗/瓦/文字梗
照这个接,别念词条出处。

关键在那个「要回复 真的假的 我去真开播了」——词库的 usage 字段里本来就有。 有了这句,模型不用自己想该接什么。

不含梗的消息一句都不注入。闲聊一句都不浪费。

为什么能接住

匹配只认精确命中:标题、slug、别名真的出现在话里。不做反向模糊匹配。

**因为 6792 条里任何两个汉字的组合都能撞上东西。**早先试过「按 2-3 字滑窗去 LIKE 查标题」, 结果「帮我看看这个报错」撞出「让我看看你的战斗表情」——全是误报,直接废掉。

宁可漏接,不许乱报。

玩梗尺度

四档,0–100。默认交给模型自己判断,想手动接管才打开滑杆:

档位什么行为
很收着(≤20)只接正面的、自嘲的。带贬义的外号不复读,不跟着起哄。
有点度(≤45)损发挥可以,损长相、损身体不行。别人先开的头,接半句。
跟着玩(≤70)社区玩什么就接什么,不自己发明。分寸跟着对方调子走。
放得开(>70)带刺的也能接。但对方认真了就立刻停。

档位不写在提示里当标签,写行为——写标签模型只会背标签。

三 · 数据

**内置 data/memes.db,6792 条,17MB SQLite。**零依赖,只用 Node 自带的 node:sqlite。

表结构:

CREATE TABLE memes (
  title TEXT PRIMARY KEY,  -- 词条名
  slug  TEXT,              -- 别名
  tags  TEXT,              -- 标签,逗号分隔
  usage TEXT,              -- 怎么用 / 怎么接  ← 最值钱的就是这个
  origin TEXT,             -- 出处
  other TEXT,              -- 演化 / 相关 / 备注
  summary TEXT,            -- 释义
  aliases TEXT             -- 别名,逗号分隔
);

99% 的词条有 usage(6709/6792),这就是它能「接」而不是只能「查」的原因。

性能:首轮建索引 54ms,之后每次查询 1.6ms(内存索引,索引里带 usage,不碰数据库)。

四 · 八组测试

全部在 tools/ 里可复现:

测试样本结果
贴吧真人(孙吧 + v吧原文)68 条误拦 0
B站评论(两个讨论「AI 味」的视频热评)30 条误拦 0
全域场景(18 个场景 × 2 条)36 条漏 0,误拦 0
真人原话51 条误拦 0
git 真人28 条误拦 0
AI 八股35 条拦住 35(100%)
真实场景25 条漏 0,误拦 0
对抗绕过10 种拦住 6(60%)
node tools/tieba-real.mjs   # 贴吧真人
node tools/bili-real.mjs    # B站评论
node tools/all-scenes.mjs   # 18 个场景
node tools/evasion.mjs      # 对抗绕过

五 · 拦不住什么

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

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

规则只能认形状,认不了「这句话是不是真的」。 止血带,不是解药。

六 · 成本

场景配置成本
纯浏览 / 日常聊天默认0
守门默认0(本地正则)
每轮自动查梗默认开0(本地 SQLite,1.6ms)
要它替你想一句具体接话+ AI 接梗开每条一次会话模型调用

系统提示:守门 31 字;开了玩梗加约 120 字。判断全在本地跑,不调模型。

七 · 装

dsh plugin --profile web add dsh-bagu

装完重启一次 dsh。设置 → 八股检测。

八 · 设置页

  • 挡不挡——总开关 / 严格模式 / 提示那一节
  • 玩梗——梗库开关 / 每轮自动查 / 尺度开关 + 滑杆
  • AI 接梗——开关 + 显示当前会话模型 + 另配接口(兜底)
  • 试一段——八种样本,当场看能不能过
  • 阈值——留白词下限、结构腔倍数、具体物下限

九 · 开发

npm test    # 110 个单元测试

致谢

词库来自 梗Wiki。

6792 条词条是那个站点一条一条攒出来的——来源、用法、标签、别名、摘要,全部来自它的公开 API。 最值钱的 usage 字段(「怎么接」)也是它整理的,不是这里编的。

没有那个站,这个插件只会有几十条手抄的梗,接不住任何东西。

也感谢 thawline/dsh-memewiki—— 「不等模型来查,先把答案摆在它面前」这个做法是它先做的,词库打包分发的方式也是跟它学的。

规则部分的判据参考自 beagle style-criteria、 voku/code-slop、 sloplint、 lieflat-less-ai-tone。

许可

MIT。词库数据来自梗Wiki,使用时请一并保留对其的署名。

관련 플러그인