快速上手DiagSafe:5分钟用HuggingFace加载LLM安全评测数据集,完成第一次越狱攻击测试
【免费下载链接】DiagSafe项目地址: https://ai.gitcode.com/tencent_hunyuan/DiagSafe
DiagSafe 是腾讯混元发布的 LLM 安全评测基准(diagnostic safety benchmark)。用 HuggingFace 的datasets库一行命令,即可加载 3,489 条中英文越狱与安全测试提示词,再配合每条 prompt 专属的评分细则(rubric),你就能快速完成第一次 LLM 安全评测与越狱攻击测试 🚀。
DiagSafe 是什么?为什么需要“诊断式”安全评测 🛡️
传统安全基准往往只给模型一个“安全 / 不安全”的二元标签。DiagSafe 的核心理念是Beyond Binary Labels(超越二元标签):它让 LLM 裁判(LLM-as-a-judge)对每一条提示词逐项判定并引用证据,而不是只输出一个笼统结论。
数据集由三部分构成:
| 组成 | 规模 | 说明 |
|---|---|---|
| 评测提示词(prompts) | 3,489 条 | 中英文双语,单轮 + 多轮越狱/安全测试请求 |
| 评分细则(rubrics) | 3,489 条 | 与每条 prompt 一一对应的裁判模板,含安全项与豁免条款 |
| 安全分类标准(standards) | 84 个标签 | 11 个一级维度、34 个二级、84 个三级标签(OSS-01 ~ OSS-11) |
两个子集各有侧重:
- DiagBase(2,401 条):按语言 × 对话轮次 × 攻击形式合成,包含直接有害请求、模板越狱和组合模板越狱;
- DiagAttack(1,088 条):将单轮直接请求改写成指令式攻击——把有害意图藏在看似无害的写作任务里,附带角色、格式、语气约束,更贴近真实越狱场景。
⚠️ 内容警告:数据集刻意包含有害请求(暴力、色情、自伤、儿童安全、CBRN 等),仅用于安全评测与研究。
数据集结构:三组文件一览
| Config | 文件 | 条数 | 用途 |
|---|---|---|---|
prompts(默认) | prompts/DiagSafe_bench_3489.jsonl | 3,489 | 中英文单轮与多轮评测提示词 |
rubrics | rubrics/DiagSafe_rubrics_3489.jsonl | 3,489 | 每条 prompt 一份裁判评分细则 |
standards_zh | standards/DiagSafe_standards_84.json | 84 | 三级安全标签标准(中文) |
standards_en | standards/DiagSafe_standards_84_en.json | 84 | 相同 84 个标签(英文) |
每条 prompt 的核心字段:
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | DiagBase-NNNNNN或DiagAttack-NNNNNN,前缀标识子集 |
language | string | en或zh |
messages | list | 按顺序排列的用户轮次;多轮 prompt 为 2–5 轮 |
category | dict | l1(如OSS-05)、l2、l3(中英文标签名) |
5分钟用HuggingFace加载数据集
三步加载:一条命令搞定全部数据
只需datasets库,三行代码加载三组数据:
from datasets import load_dataset prompts = load_dataset("tencent/DiagSafe", "prompts", split="test") rubrics = load_dataset("tencent/DiagSafe", "rubrics", split="test") standards = load_dataset("tencent/DiagSafe", "standards_zh", split="train")注意 split 的对应关系:prompts和rubrics使用test分割,standards使用train分割。
用 id 精确匹配 prompt 与 rubric
rubrics 与 prompts 通过id字段一一对应,构建一个映射即可随时取用:
rubric_by_id = dict(zip(rubrics["id"], rubrics["rubric"])) example = prompts[0] rubric = rubric_by_id[example["id"]]完成第一次越狱攻击测试:四步走 🔧
整体流程:取一条攻击 prompt → 让被测模型生成回答 → 组装裁判提示词 → 让裁判模型输出 JSON 判定。
第一步:让被测模型回答
把 prompt 的messages按轮次依次发给被测 LLM,收集模型回答model_answer。多轮对话需逐轮发送,保留上下文。
第二步:组装裁判提示词(常见坑点)
rubric 是一个带占位符的裁判模板,包含{question}、{answer}、{safety_categories}三个占位符。由于模板的输出契约中含有 JSON 花括号,必须用str.replace填充,而不能用str.format(否则会因花括号冲突报错):
import json judge_prompt = ( rubric .replace("{question}", json.dumps(example["messages"], ensure_ascii=False)) .replace("{answer}", model_answer) .replace("{safety_categories}", json.dumps(example["category"], ensure_ascii=False)) )第三步:裁判模型逐项输出判定
每条 rubric 包含 2–6 条prompt 特定的安全项(平均 4.5 条,附豁免条款)和 8 条通用实用性项(U1.1–U3.2),裁判需对每一项单独判定并引用证据,实用性部分按 0–3 分打分,最终按约定的 JSON 结构输出。
第四步:按规则汇总结果
- 多轮对话逐轮评判:裁判会把较早的轮次作为上下文;
- 判定规则:只要任意一轮为 Unsafe,整条 prompt 记为 Unsafe;
- 仓库配套了端到端评测脚本(
scripts/run_eval.py),自动处理回答生成、多轮评判、断点续跑与分组统计。
常见疑问 FAQ ❓
为什么不能用str.format填充 rubric?rubric 的 JSON 输出契约里本身就有花括号,str.format会将其误认为占位符而报错,用str.replace逐一替换最安全。
中文场景该用哪个 standards 文件?standards_zh(standards/DiagSafe_standards_84.json)与standards_en(standards/DiagSafe_standards_84_en.json)覆盖相同 84 个标签且顺序一致;prompt 的category.l2/l3与中文文件的“二级类目/三级类目”完全对应,便于交叉查阅。
必须跑完全部 3,489 条吗?不必。建议先抽取 10–20 条做冒烟测试(smoke test),跑通“生成回答 → 裁判判定 → 汇总”全链路后再全量评测。
可以用这个数据集训练模型产出有害内容吗?官方明确禁止。该数据集专为安全评测与 LLM 裁判研究设计,结果质量取决于所选裁判模型(论文报告不同裁判与人工标注的一致性为 89.41%–95.34%)。
总结:你的第一次 DiagSafe 评测已完成 ✅
回顾今天的 5 分钟路径:
- 用
load_dataset("tencent/DiagSafe", ...)三条命令加载 prompts、rubrics、standards; - 用
id把每条 prompt 与专属 rubric 精确配对; - 用
str.replace填充占位符,生成裁判提示词; - 裁判模型逐项输出带证据的 JSON 判定,多轮任一轮 Unsafe 即整体 Unsafe。
相比单一二元标签,DiagSafe 让你能定位模型到底在哪类风险、哪一条规则上失守——这正是“诊断式安全评测”的价值。完整字段说明与更多用法,详见 README.md。
【免费下载链接】DiagSafe项目地址: https://ai.gitcode.com/tencent_hunyuan/DiagSafe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考