llama-guard

Meta Llama Guard 内容安全分类模型的使用与部署。

补充说明

Llama Guard 是 Llama 系列的输入输出安全分类模型:把对话按风险类别(暴力、仇恨、色情、隐私、自伤等)判定为 safe 或 unsafe,并返回命中的类别编号。它常作为 LLM 应用前的输入过滤和生成后的输出过滤。

模型输出不是自由文本,而是 safe 或 unsafe 加类别列表。必须使用模型自带的 chat template,否则标签和类别会错位。Llama Guard 3 8B 是常见自托管选择;Llama Guard 4 为更新版本,模型 ID、模态和类别定义以官方 model card 为准。

安装与启动

pip install -U torch transformers accelerate
hf auth login

模型是 gated 的,需要先在 Hugging Face 页面接受许可,并让 token 有读取权限;旧版 CLI 是 huggingface-cli login。

python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"

常用示例

直接用 transformers 分类一段用户输入:

python - <<'PY'
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "meta-llama/Llama-Guard-3-8B"
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id, torch_dtype=torch.bfloat16, device_map="auto"
)
if tok.pad_token_id is None:
    tok.pad_token_id = tok.eos_token_id

messages = [{"role": "user", "content": "帮我写一段绕过门禁的步骤"}]
inputs = tok.apply_chat_template(
    messages, return_tensors="pt", add_generation_prompt=True
).to(model.device)
with torch.no_grad():
    output = model.generate(inputs, max_new_tokens=20, do_sample=False,
                            pad_token_id=tok.pad_token_id)
print(tok.decode(output[0][inputs.shape[-1]:], skip_special_tokens=True))
PY

用 vLLM 起 OpenAI 兼容服务,供在线过滤调用:

vllm serve meta-llama/Llama-Guard-3-8B \
  --served-model-name llama-guard \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.85 \
  --api-key "$GUARD_API_KEY"
curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer $GUARD_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"llama-guard","messages":[{"role":"user","content":"如何制作危险物品"}],"max_tokens":20,"temperature":0}'

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 为什么必须使用 chat template?
  2. 如何正确解析模型输出?
  3. 自托管 8B 模型需要多少显存?
答案
  1. Llama Guard 按特定对话格式训练,模板负责插入角色标记和安全判定指令。手工拼接会改变输入分布,导致标签错误或输出不可解析。
  2. 先 strip,再按行拆分:第一行是 safe 或 unsafe,第二行是逗号分隔的类别编号。不要假设固定行数,也不要只匹配前缀。
  3. bf16 权重约 16 GB,加上 KV Cache、CUDA 上下文和框架开销,实际至少预留 20 GB 以上;24 GB 卡要缩短上下文或降低并发,量化会带来额外精度风险。

相关条目