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-baguREADME
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,使用时请一并保留对其的署名。