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 训练文档。

局限

  1. LM 中频类偏弱:LM.03–08 小类 macro-F1 0.42–0.56,生成风险中频检测覆盖不足。
  2. OOD FPR 翻倍:safety FPR 从域内 5.9% 升到域外 14.5%,固定阈值在分布外可能不再最优。
  3. 未对抗评测:仅在标注体系内做过 OOD 测试,未测真正对抗样本。
  4. 未量化:本 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}
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for louivis/encoder-guard

Finetuned
(736)
this model