Instructions to use louivis/encoder-guard with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use louivis/encoder-guard with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="louivis/encoder-guard")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("louivis/encoder-guard", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Encoder-Guard v15 (bf16)
把 Qwen2.5-0.5B 改造为双向 encoder,接 11 个线性分类头,一次前向(17.7ms,p50)输出文本的完整安全画像:违规二判 + TC260 / 语言风险(LM)/ 隐私(PII)/ 内容分级(DC)四套体系的大类与小类 + 安全放行闸门。
- 判别式安全模型,非生成式 guard:无自回归、全头并行输出,单条 17.7ms vs 生成式 8B guard 的 281ms+(同数据重训对比)。
- backbone 为 HF
Qwen2Model结构(Qwen/Qwen2.5-0.5B 权重转 bidirectional 微调产物),**推理时需全可见 attention(双向,非 causal)**。 - 生产推理推荐配套的纯 C 本地引擎 verdict(CPU / Apple Metal GPU,零 Python 依赖,支持加密 .vmd 打包分发)。
输出维度(11 头)
| 头 | 维度 | 说明 |
|---|---|---|
safety |
1 | 违规二判概率(配套 threshold.json 阈值) |
safety_release |
1 | 放行闸门:safe 且 release 概率低于 release_gate 才放行 |
tc260_major / tc260_minor |
5 / 31 | TC260 标准内容风险大类 / 小类 |
lm_major / lm_minor |
10 / 54 | 语言模型风险(LM01–LM10)大类 / 小类 |
pii_major / pii_minor |
7 / 10 | 个人信息风险大类 / 小类 |
dc_type / dc_level / dc_minor |
4 / 3 / 36 | 未成年人内容分级:类型 / 级别(GB/T 42127-2022)/ 子类 |
类别码表与推理引擎严格同源:见 verdict vd_labels.c。
性能(test 1454 条,macro-F1;同一 v6_9a 数据对 qguard 公平重训后对比)
| 轨道 | Encoder-Guard | qguard-0.6B(重训) | qguard-8B(重训) |
|---|---|---|---|
| TC260 大类 | 0.874 | 0.801 | 0.669 |
| LM 大类 | 0.652 | 0.373 | 0.490 |
| PII 大类 | 0.937 | — | 0.472 |
| DC type / level | 0.786 / 0.738 | — | 0.716 / 0.624 |
| safety | F1 0.986 / recall 93.6% | — | — |
| 延迟 p50 | 17.7ms | 96ms | 281ms+ |
0.5B 判别式 encoder 在全部轨道超过生成式 8B guard:判别任务与判别架构匹配、双向 attention 全句表征、一次前向出全部轨道(生成式需逐 token 或多次调用)、损失工程按轨独立。
使用
方式一:verdict C 引擎(推荐,生产)
# 从仓库打包 .vmd(加密)后直接推理,CPU 或 Metal GPU
./verdict -m model.vmd -t "待检测文本" --device metal
# batch 模式:M4 Max 450 条 1.2s
./verdict -m model.vmd --batch input.txt --batch-out out.jsonl
方式二:PyTorch(本仓库权重)
import torch, json
from transformers import AutoModel
from safetensors.torch import load_file
backbone = AutoModel.from_pretrained(
"louivis/encoder-guard", subfolder="backbone", torch_dtype=torch.bfloat16)
heads = load_file("heads.safetensors")
threshold = json.load(open("threshold.json"))["safety_threshold"]
tok = AutoTokenizer.from_pretrained("louivis/encoder-guard", subfolder="backbone")
enc = tok("待检测文本", return_tensors="pt", truncation=True, max_length=1024)
with torch.no_grad():
out = backbone(**enc, torch_dtype=torch.bfloat16)
# 关键:双向 encoder,mean-pool 全部 token(全可见 attention 下)
pooled = out.last_hidden_state.mean(dim=1).to(torch.bfloat16)
safety = torch.sigmoid(pooled @ heads["heads.safety.weight"].T + heads["heads.safety.bias"]).item()
unsafe = safety >= threshold
⚠️ backbone 是
Qwen2Model结构但按双向 encoder 训练:直接用默认 causal mask 推理结果无效。生产请使用 verdict 引擎(已正确实现全可见 attention);PyTorch 侧集成需自行构造全可见 4D attention mask。
阈值(threshold.json)
safety_threshold=0.95,校准方法 fpr_constrained_max_recall@0.02(FPR≤2% 约束下最大召回),校准集 finetune_final_v6_8_val(259 safe / 1176 unsafe,实测 FPR 1.93%)。该阈值仅对训练分布可靠:偏离训练分布时 FPR 会上升(见局限)。release_gate=0.8055 为 safe 样本放行闸门,减少深误杀。
训练
- 数据:v6_9a,17589 条(双模型生成 + 交叉验证过滤);四轨标签张量化 ~160 维 0/1,未标注位置 None 掩码。
- 配置:lr 2e-5、bf16、20 epochs(epoch 18 停)、Qwen2.5-0.5B backbone 转双向 encoder(
is_decoder=false,全可见 attention)后全参微调。 - 损失:11 头独立 BCE,sum 回传;头结构见
model_config.json的head_dims。 - 完整过程:
train_log.jsonl;工程细节与踩坑(全可见 mask 修复、阈值校准失败重来)见 verdict 训练文档。
局限
- LM 中频类偏弱:LM.03–08 小类 macro-F1 0.42–0.56,生成风险中频检测覆盖不足。
- OOD FPR 翻倍:safety FPR 从域内 5.9% 升到域外 14.5%,固定阈值在分布外可能不再最优。
- 未对抗评测:仅在标注体系内做过 OOD 测试,未测真正对抗样本。
- 未量化:本 bf16 权重未做 INT8/FP8 量化(仓库另有 fp32 master 用于 C 引擎)。
训练/评估数据为中文为主的双语合成+标注混合分布,主要适用中文内容审核场景;纯英文长文与非上述体系的风险类型(如代码安全)未经评测。
引用
@software{encoder_guard_v15,
author = {wenqiang li},
title = {Encoder-Guard v15: bidirectional-encoder content safety classifier},
year = {2026},
url = {https://huggingface.co/louivis/encoder-guard}
}
Model tree for louivis/encoder-guard
Base model
Qwen/Qwen2.5-0.5B