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

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

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

小夜