毒性評分管線
建置 LLM 輸出過濾毒性評分管線的逐步詳解,涵蓋模型選擇、多維評分、閾值校準與即時評分的生產部署。
即使輸入是良性的提示詞,LLM 也可能產出毒性內容,尤其是被越獄或討論敏感議題時。毒性評分管線會對模型每一次輸出賦予多維分數,並依照可配置的閾值採取行動(標記、警告、封鎖)。本詳解使用開源模型與 API 類評分服務,建置一條生產等級的管線。
步驟 1:建立毒性評分器
首先定義結構化的分數資料型別。ToxicityScores 記錄各類別的分數(整體毒性、仇恨、威脅、騷擾、性、自殘、暴力);ScoringResult 除了分數外,還記錄原文、最高分數、最高分類別、是否標記、以及建議動作(allow / warn / block)。
接著實作兩種評分器:
- TransformerToxicityScorer:使用微調過的 Transformer(預設
unitary/toxic-bert)進行多標籤毒性分類。透過 HuggingFacepipeline的text-classification模式,並設定return_all_scores=True、truncation=True、max_length=512。將toxic、severe_toxic、identity_hate、threat、insult、obscene等標籤對應到內部類別,並取最大值合併。 - OpenAIModerationScorer:呼叫 OpenAI Moderation API,將回傳的各類別分數映射到
ToxicityScores結構,overall取所有類別的最大值。
安裝依賴:pip install transformers torch(開源模型)或 pip install openai(API 方式)。
步驟 2:建置評分管線
定義 ThresholdConfig(category、warn_threshold、block_threshold),並提供預設閾值:整體 0.5/0.8、仇恨 0.4/0.7、威脅 0.3/0.6、騷擾 0.5/0.8、性 0.5/0.8、自殘 0.3/0.6、暴力 0.4/0.7。威脅與自殘類別因風險較高而使用較低閾值。
ToxicityPipeline.evaluate(text) 先呼叫評分器取得分數,再逐類別比對閾值:分數達 block 閾值即設為 block、達 warn 閾值則為 warn,否則 allow。同時記錄最高分數與其所屬類別,回傳 ScoringResult。
步驟 3:加入情境感知評分
ContextAwarePipeline 包裝基礎管線,接受 context 字典(含 purpose 欄位)。當 purpose 屬於白名單情境(educational、security_research、content_moderation、quoting_example、defining_term)時,將閾值提高到 0.9 以上,以避免誤封教育或研究相關的合理討論。若原本未被標記或無情境資訊,則不調整。
步驟 4:批次評分與快取
為降低生產環境延遲,加入以 SHA-256 前 16 字元為 key 的 ScoringCache(最大容量 5000,LRU 汰換)。CachedToxicityPipeline.evaluate(text) 先查快取,若命中則直接重建 ScoringResult;未命中則呼叫底層管線並將分數寫回快取。
步驟 5:部署為服務
用 FastAPI 暴露 /score 端點,接受 ScoreRequest{text, context},回傳 ScoreResponse{action, max_score, max_category, flagged, scores}。啟動方式:uvicorn toxicity.api:app --port 8550,並可用 curl POST 驗證。
步驟 6:建立監控儀表板
ToxicityMonitor 以固定視窗(預設 1000)滑動保留各類別分數,追蹤標記總數。每累積 100 筆,若標記比率超過 10% 即發出警告。report() 輸出各類別的平均、P95、最大值以及總體標記率,可接入 Prometheus 或自製儀表板。
步驟 7:測試管線
撰寫 pytest 測試:以 MockScorer 注入固定分數,驗證良性文字被放行、高毒性被封鎖、中毒性被警告,以及威脅類別在較低閾值下即被封鎖。執行:pytest tests/test_toxicity.py -v。
相關主題
- Output Content Classifier —— 更廣泛的輸出分類
- Response Boundary Enforcement —— 主題與內容邊界
- PII Redaction Pipeline —— PII 專用輸出過濾
- Building an AI SOC Dashboard —— 毒性指標視覺化
為什麼威脅類別的封鎖閾值(0.6)應低於騷擾類別(0.8)?