前言¶
智能體接入聊天、評論、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