🚀 DuoGuard-0.5B 模型
DuoGuard-0.5B 是一个基于大语言模型的分类器,专门用于对输入文本序列的安全性进行分类,可实现细粒度的潜在不安全或违规内容检测。
🔍 模型信息
属性 |
详情 |
模型类型 |
基于多语言、仅解码器的大语言模型的分类器 |
基础模型 |
Qwen/Qwen2.5 - 0.5B |
训练数据 |
未提及 |
许可证 |
Apache - 2.0 |
🚀 快速开始
模型概述
本模型的主要目标是对输入文本序列的安全性进行分类。DuoGuard-0.5B 是一个多语言、仅解码器的基于大语言模型的分类器,专为跨 12 个不同子类别进行安全内容审核而设计。每次前向传播会产生一个 12 维的对数几率向量,每个维度对应一个特定的内容风险领域,如暴力犯罪、仇恨言论或色情内容。通过对这些对数几率应用 sigmoid 函数,用户可以获得一个多标签概率分布,从而实现对潜在不安全或违规内容的细粒度检测。
对于简化的二元审核任务,该模型可以通过取 12 个子类别概率的最大值并将其与给定阈值(例如 0.5)进行比较,来生成单个“安全”/“不安全”标签。如果所有类别中的最大概率高于阈值,则内容被视为“不安全”;否则,视为“安全”。
DuoGuard-0.5B 基于 Qwen 2.5 (0.5B) 构建,这是一个支持 29 种语言(包括中文、英语、法语、西班牙语、葡萄牙语、德语、意大利语、俄语、日语、韩语、越南语、泰语和阿拉伯语)的多语言大语言模型。DuoGuard-0.5B 主要针对英语、法语、德语和西班牙语进行了安全内容审核的专门微调,同时仍保留了从 Qwen 2.5 基础模型继承的更广泛的语言覆盖范围。该模型的权重是开放的。
该模型在论文 DuoGuard: A Two-Player RL-Driven Framework for Multilingual LLM Guardrails 中有所介绍。代码请见:https://github.com/yihedeng9/DuoGuard。
💻 使用示例
基础用法
以下是一个快速代码片段,展示了如何在应用程序中加载和使用该模型:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B")
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForSequenceClassification.from_pretrained(
"DuoGuard/DuoGuard-0.5B",
torch_dtype=torch.bfloat16
).to('cuda:0')
prompt = "How to kill a python process?"
inputs = tokenizer(
prompt,
return_tensors="pt",
truncation=True,
max_length=512
).to('cuda:0')
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
probabilities = torch.sigmoid(logits)
threshold = 0.5
category_names = [
"Violent crimes",
"Non-violent crimes",
"Sex-related crimes",
"Child sexual exploitation",
"Specialized advice",
"Privacy",
"Intellectual property",
"Indiscriminate weapons",
"Hate",
"Suicide and self-harm",
"Sexual content",
"Jailbreak prompts",
]
prob_vector = probabilities[0].tolist()
predicted_labels = []
for cat_name, prob in zip(category_names, prob_vector):
label = 1 if prob > threshold else 0
predicted_labels.append(label)
max_prob = max(prob_vector)
overall_label = 1 if max_prob > threshold else 0
print(f"Prompt: {prompt}\n")
print(f"Multi-label Probabilities (threshold={threshold}):")
for cat_name, prob, label in zip(category_names, prob_vector, predicted_labels):
print(f" - {cat_name}: {prob:.3f}")
print(f"\nMaximum probability across all categories: {max_prob:.3f}")
print(f"Overall Prompt Classification => {'UNSAFE' if overall_label == 1 else 'SAFE'}")
📄 引用
@misc{deng2025duoguardtwoplayerrldrivenframework,
title={DuoGuard: A Two-Player RL-Driven Framework for Multilingual LLM Guardrails},
author={Yihe Deng and Yu Yang and Junkai Zhang and Wei Wang and Bo Li},
year={2025},
eprint={2502.05163},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2502.05163},
}