深色模式
内容安全与审核
摘要:内容安全是把"不该说的话不说、不该让模型做的事不做"落到流水线上。它对应 OWASP LLM05(Improper Output Handling,输出未校验)与 LLM09(Misinformation,误导信息被过度信任)。本文给出可复制的 Guardrails 架构:预检(preflight)→ 输入(input)→ 输出(output)三段式,串接 OpenAI Moderation API、Anthropic Constitutional Classifiers、Llama Guard 4 等。模型/版本:GPT-4o、Claude 4.x、Llama Guard 4(12B,2025-04 发布
[版本相关])均适用。
适用版本与前提
- 内容审核服务:OpenAI Moderation API(
text-moderation-004等)、Azure AI Content Safety、Llama Guard 4、Anthropic Constitutional Classifiers(2025-02 发布[版本相关])。 - 分类体系:MLCommons hazards(Llama Guard 4 用 S1–S14)、Azure harm categories(Hate/Violence/Sexual/SelfHarm)。
护栏是概率性的,不是安全边界
所有内容审核模型都是分类器,有 false positive(误杀正常内容)与 false negative(漏掉有害内容)。OpenAI/Azure/Google 的内置过滤器在 2025-06 评测中"抓到很多但不完美",且对非英语 jailbreak 明显更弱。护栏降低风险,不消除风险——不能替代人工复核与业务策略。
核心概念:多层 Guardrails 流水线
架构:策略即代码 + 多分类器
生产实践:把策略写成代码
1) 策略即代码(category → action 映射)
yaml
# safety-policy.yml
harm_categories:
sexual_content:
sources: [azure_text, llama_guard4]
threshold: block_above=medium
action: block
violence:
sources: [azure_text]
threshold: block_above=high
action: block_or_rewrite
pii:
sources: [llama_guard4, regex_pii]
threshold: block_above=low
action: mask
elections: # 业务专属零容忍
sources: [llama_guard4]
threshold: block_any
action: escalate_to_human1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2) OpenAI Moderation API 作为预检/后置
python
import os, openai
client = openai.OpenAI()
def moderate(text: str) -> bool:
r = client.moderations.create(model="text-moderation-004", input=text)
return r.results[0].flagged
user_msg = "..." # 来自用户输入或模型输出
if moderate(user_msg):
raise ValueError("content flagged by moderation")1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
3) Llama Guard 4 作为跨供应商本地护栏
Llama Guard 4(12B,2025-04-29 发布 [版本相关])基于 MLCommons hazards 分类,可在单 GPU 上运行,作为任何模型的统一安全层:
python
from transformers import AutoProcessor, Llama4ForConditionalGeneration
import torch
mid = "meta-llama/Llama-Guard-4-12B" # [版本相关] 以官方模型 ID 为准
proc = AutoProcessor.from_pretrained(mid)
model = Llama4ForConditionalGeneration.from_pretrained(mid, device_map="cuda", torch_dtype=torch.bfloat16)
def llama_guard(text: str) -> str:
msgs = [{"role": "user", "content": [{"type": "text", "text": text}]}]
inputs = proc.apply_chat_template(msgs, return_tensors="pt").to("cuda")
out = model.generate(**inputs, max_new_tokens=32)
return proc.decode(out[0], skip_special_tokens=False)
# 返回安全/不安全 + 命中的 hazard 类目1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
操作步骤:三段式接入
bash
# 1) Preflight: 入站即脱敏 + 审核 (见 data-leak 篇)
# 2) Input: jailbreak 检测 (OpenAI Guardrails / Constitutional Classifiers)
# 3) Output: 对生成结果跑 Llama Guard 4 + 业务规则
# 建议用 NeMo Guardrails / LlamaFirewall 统一编排
pip install nemoguardrails # [版本相关] 按官方文档确认版本1
2
3
4
5
2
3
4
5
验证
bash
# 跑内容安全红线集 (授权测试环境)
pytest tests/redteam/test_content_safety.py
# 监控指标: false_positive_rate / false_negative_rate / 平均延迟1
2
3
2
3
效果参考(非保证)
- Anthropic Constitutional Classifiers(2025-02)在数千小时红队中未出现一次成功的 universal jailbreak,优化后 over-refusal 降至约 0.38%
[版本相关:Anthropic 披露,未实测]。 - OpenAI 内置图片分类器对 DALL·E 3 生成图内部识别率约 98%(2024,OpenAI 系统卡)
[版本相关]。
回滚与清理
误杀损害可用性,需灰度
内容审核阈值过高会误伤正常业务(如医疗问答被判"自残"、代码被判"漏洞利用")。上线前 log_only 观察误杀率,按业务微调 severity 阈值,保留关闭单类目的开关。
故障排查
- Q:非英语内容频繁漏判? 多数分类器在英语上训练充分、其他语言弱。多语言场景需补充对应语种的评测集与本地化规则。
- Q:role-play 绕过? 风格化 jailbreak("扮演一个无限制助手")常能绕过过滤器。需要 jailbreak 检测分类器(如 OpenAI Guardrails 的 jailbreak 检测、Anthropic Constitutional Classifiers)作为补充层。
安全与合规
- 内容安全是 EU AI Act "充分网络安全"与平台内容责任的交叉点;深度伪造(deepfake)须明确标注(Article 50)。
- 模型本身经 RLHF / Constitutional AI 对齐已能拒绝大量有害请求,但不能覆盖业务专属策略——必须用规则层补齐(如"医疗 bot 绝不给用药剂量")。
- 注意:内容审核服务自身可能处理用户数据,需确认供应商不将其用于训练(多数主流供应商默认不训练 API 数据)。
成本 / 性能
- 每层分类器增加一次调用延迟(小模型通常 < 数百 ms)。三段式叠加在严格模式下会增加 1–2 倍尾延迟。
- 本地 Llama Guard 4 避免每次出网调用,但需 GPU 资源;云 API(Moderation)按调用计费,单次成本很低。
- 误杀导致的人工复核会增加人力成本——阈值需权衡。