[MODEL] 14 分鐘閱讀OraCore 編輯部

Shieldstral 把審核政策收成一個模型

我拆 Shieldstral 怎麼把內容審核從一堆規則收斂成可調的單一模型,順手給你可直接套用的 prompt、資料轉換與 LoRA 模板。

分享 LinkedIn
Shieldstral 把審核政策收成一個模型

以前內容審核靠一堆規則拼湊,現在 Shieldstral 把政策收進一個可調的模型。

我做 moderation 流程有一陣子了,最煩的就是大家嘴上都說「先簡化」,結果最後長出來的是 classifier、policy layer、例外規則、人工覆核表,還有一堆只有某個人看得懂的 if-statement。模型明明在跑,產品也說有在管,實際上每次改規則都像在拆炸彈。你以為自己在維護一個系統,結果是在維護一坨互相打架的定義。

這次讓我停下來看的,是 Dawn Liphardt 的文章 Mistral AI Overhauls Content Moderation: Substantive and Stylistic Changes,裡面拆了 Mistral 的 Shieldstral 怎麼做。官方相關頁面我也一起看了:Mistral AIMistral on Hugging Face。我最在意的不是它多會講故事,而是它把 moderation 這件事改寫成訓練問題、資料轉換問題、以及可版本化的政策問題。

把分類表丟掉,直接問政策問題

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

“Mistral AI reduced moderation tasks to closed-ended questions expressed in natural language.”

翻譯一下就是,它不先逼模型背一棵超大分類樹,而是直接問一句政策問題:這段內容有沒有在鼓吹對某族群的暴力?有沒有在教自殘?有沒有在煽動仇恨?這種寫法很土,但土得很對。因為 moderation 的核心從來不是「你把它分到哪一類」,而是「這件事過不過線」。

Shieldstral 把審核政策收成一個模型

我以前最受不了的就是 taxonomy 先行。團隊開會開半天都在吵「這算 harassment 還是 abuse」,結果模型根本還沒學會辨識政策邊界。你把 policy 藏在 label 裡,後面就會變成 label 的政治學。Shieldstral 這一招比較老實:把規則寫成問題,讓模型回答問題。政策變了,就改問題;這比改一整套分類名詞乾脆多了。

實操上,我會直接把 moderation prompt 寫成一個 closed-ended question,而且每個 surface 都分開。公共社群、青少年產品、企業內部工具,根本不該共用同一個問法。你可以共用底層模型,但 policy question 要分版本、分場景、分嚴格度,不然你最後只是在拿同一把尺量不同東西。

  • 每個政策決策只留一個問題。
  • 問題文字保留給人看,不要只存在 label id 裡。
  • 問題一改就版本化,別偷改 production。

我自己現在看 moderation 設計,第一眼先看的是「問題有沒有寫清楚」。如果問題都寫不乾淨,後面 accuracy 再高也只是把混亂包裝得比較漂亮。

資料不是天生相容,先做轉接器再說

“Mistral AI performed a template-based conversion, developing a dataset-specific processing pipeline for each dataset.”

白話就是:不同資料集本來就不是同一種語言。這個標的是 broad category,那個標的是細粒度 severity,另一個還混了 annotator 文化偏差。你如果假裝它們能直接混在一起訓練,模型學到的通常不是政策,而是混亂。Mistral 的做法是先做每個資料集自己的處理管線,再轉成同一種 prompt 模板。

這點我很買單,因為 moderation dataset 本來就很髒。有人標得很粗,有人標得很細,有人標的是意圖,有人標的是結果。你不先做轉接器,直接把所有資料丟進同一個訓練 loop,最後模型會把 taxonomy 差異當成訊號,然後在 production 裡亂飄。這不是模型不行,是你沒先幫資料翻譯。

我自己的做法會更硬一點:每個來源資料集都保留原始 label、原始 metadata、來源名稱,另外再做一層 shared schema。訓練用 shared schema,稽核看原始資料。這樣你未來要追 false positive,才知道是哪個來源資料在拖累哪個 policy question。

  • 每個資料集先做 adapter,再進訓練。
  • 原始 taxonomy 不要丟,日後稽核會救你。
  • 所有來源最後都收斂到同一種 prompt 格式。

這種流程看起來很麻煩,但 moderation 本來就麻煩。你想省掉轉接器,通常只是把麻煩延後到上線後再爆。

對比樣本才是讓模型長腦袋的地方

“The other centerpiece in training Shieldstral was the use of contrastive training pairs.”

翻譯一下就是,Shieldstral 不只看正例,還很重視近似但不該命中的反例。比如同樣是暴力語句,目標族群不同就該分開;同樣是敏感字詞,教育脈絡和煽動脈絡也不能混。這種 contrastive pair 的價值在於,它逼模型學「差在哪裡」,不是只學「長得像不像壞東西」。

Shieldstral 把審核政策收成一個模型

我以前碰過一個分類器,超愛誤判。後來回頭看資料,才發現我們給它的正例太多,反例太爛。它看到一些教育內容、新聞內容、引用內容,就以為自己抓到壞東西。其實不是模型笨,是資料訓練它只會看表面。補上近似反例後,它才開始理解 policy 邊界,而不是靠語氣猜拳。

如果你要抄這招,我會建議每個正例至少配一個結構相近、政策不同的反例。可以換目標族群、換意圖、換場景,或是同樣詞彙但安全脈絡不同。不要拿一堆無關垃圾當反例,那種資料只會讓模型覺得世界很簡單,然後在真實流量裡出事。

  • 反例要近,不要亂。
  • 測試時要看 category confusion,不要只看總 accuracy。
  • 把 false positive 拆到 policy family 層級看。

這一段我覺得最值得偷。因為它不是在追求更會背答案,而是在逼模型學會政策邊界。這才是 moderation 真正值錢的地方。

影像審核缺資料,就拿旁系資料來補

“In the face of the scarcity of image moderation datasets, Mistral AI added classification and object-detection datasets.”

意思很直接:影像 moderation 資料太少,不能傻等。Mistral 先拿分類和 object detection 這類旁系資料來補,再透過語言模型把它們包成 moderation 問題。這不是偷吃步,這是現實。影像審核本來就很難收集到足夠多、足夠細、又足夠貼近政策的真實資料。

我也做過類似的事。當某個政策邊界的真實樣本不夠時,我會先用接近的 vision dataset 當腳手架,讓模型先學會視覺 grounding,再把它轉成政策語句。重點不是把旁系資料假裝成原生 moderation 資料,而是先把視覺能力補起來,然後再用政策問句把它拉回來。

實操上,我會把旁系資料當 raw material,而不是 final truth。你可以拿 object detection 教模型認出刀、槍、藥品、裸露、血跡,但「認得出」不等於「該不該擋」。這兩件事一定要分開測,不然你的 moderation stack 會變成一個看到東西就先嚇一跳的系統。

  • 旁系 vision dataset 只拿來補視覺 grounding。
  • 政策判斷一定要包回 moderation prompt。
  • 另外留一組真實 moderation case 做 evaluation。

這裡最容易犯的錯,就是把 object detection 的準確率當成 moderation 的準確率。那兩個不是同一件事,混在一起看只會讓你誤判模型能力。

LoRA 才是能長期維護的做法

“The training of Shieldstral did not rely on supervised fine-tuning, but on the LoRA method.”

白話講,就是 Mistral 沒有把整個基座模型大改特改,而是用 LoRA 去做適配。這很合理,因為 moderation 政策變得超快。今天多一條規則,明天換一個 surface,後天法務又要加限制。你如果每次都 full fine-tune,維護成本會高到讓人想翻桌。

我很喜歡 LoRA 用在 moderation,原因很簡單:政策變化是常態,沒有人會永遠滿意同一套規則。用 LoRA 你可以保留 base model 穩定,另外掛不同 adapter 去對應不同資料集、不同政策、不同場景。Mistral 甚至做了兩個 checkpoint,一個只吃公開 moderation 資料,另一個再加 synthetic 與影像資料,然後再跟 Ministral-3B-Instruct 合併來強化 instruction following。這個思路很務實,因為 moderation 模型如果連指令都聽不懂,就只是個分數機器。

我自己的建議是:先做參數效率高的適配,別一開始就想 full fine-tune。保留一個乾淨的 baseline checkpoint,再保留一個包含 synthetic 或 multimodal 擴充的版本。合併之前先測 policy accuracy、false positive rate、instruction following,別只看單一分數。很多團隊愛在 demo 裡看起來很猛,結果一進 production 就開始亂講話。

  • 政策常變,就用 LoRA。
  • 保留乾淨 checkpoint 當基準。
  • 合併模型前先驗證指令跟政策兩邊都正常。

這種做法的好處很現實:你不用每次改政策都重來一次。對 moderation 來說,能維護比看起來很強更重要。

可調政策才是重點,分數只是表面

“You can adjust the moderation policy during inference without retraining.”

這句我看了很有感。因為它代表政策開始變成 runtime input,而不是寫死在權重裡。也就是說,同一個模型可以在不同 surface 上回答不同問題。公開論壇一套,青少年產品一套,企業內部工具又一套。核心模型不動,動的是政策問句、嚴格度、以及場景設定。

這才像真的在做 moderation。因為 moderation 從來不是一個抽象的「好壞判斷」,而是上下文判斷。你如果把情境抹平,只會得到一個看起來一致、實際上很愛誤殺的系統。Runtime policy 的價值在於,你不用把所有規則都塞進權重裡,但前提是你有完整記錄 policy version、rigor、surface、以及每次推論的上下文。

我會直接把 model capability 和 policy config 分開。模型版本是一回事,政策版本是另一回事。你要能回答的不是「這個模型為什麼擋了」,而是「它在什麼政策版本下擋了,擋的是哪個問句」。如果你說不清楚,那你就不是在做 adaptive moderation,你是在做黑箱加註解。

實操寫法很簡單:每次推論都把 surface、rigor、policy_question、content_type、policy_version 一起記錄。評估時不要只看整體準確率,要按政策版本、場景、資料來源切。這樣你才知道問題是在模型、資料,還是政策本身。

可抄的模板

# Shieldstral-style moderation template for your stack

## 1) Runtime policy schema
surface: public_chat | teen_chat | workplace | marketplace | community
rigor: low | medium | high
policy_version: v1.0.0
policy_question: "Does this content promote violence against a protected group?"
content_type: text | image | text+image

## 2) Prompt format
You are a moderation model.
Answer the policy question with one of: yes, no, uncertain.

Surface: {surface}
Rigor: {rigor}
Policy version: {policy_version}
Question: {policy_question}
Content type: {content_type}
Content: {content}

## 3) Dataset adapter rules
- Keep original_dataset_name
- Keep original_label
- Keep original_taxonomy
- Map every source label to one policy_question
- Convert every sample into the same prompt shape
- Preserve source metadata for audits

## 4) Contrastive pair recipe
For each positive sample, add one near-miss negative by shifting one axis:
- target group
- intent
- severity
- safe vs unsafe context
- educational vs promotional framing

## 5) LoRA plan
Adapter A: public moderation data only
Adapter B: public moderation + synthetic + image data
Merge only after validating:
- policy accuracy
- false-positive rate
- instruction following
- context-specific thresholds

## 6) Evaluation checklist
- Did the model answer the exact question asked?
- Does it separate similar categories correctly?
- Does it behave consistently across surfaces?
- Can policy change at inference without retraining?
- Are all decisions logged with policy version and rigor?

## 7) Operational rule
If the policy changes, update the question first.
If the dataset changes, update the adapter.
If the surface changes, update the rigor.
If false positives spike, add contrastive negatives before retraining.

這份模板是我把 Shieldstral 的思路翻成能直接塞進你系統的版本。原始觀點來自 Dawn Liphardt 的文章與 Mistral 的公開頁面,模板結構跟操作建議是我自己的整理與延伸。你如果現在就在做 moderation,我會先從 prompt schema 和 dataset adapter 兩段開始抄,別急著先換模型。

來源致謝:原始拆解看 Dawn Liphardt 的文章,以及 Mistral AIHugging Face 上的 Mistral 頁面。我這篇是把它的 moderation 方法論翻成台灣開發者比較能直接落地的版本。