【免费下载链接】HolyCyber
🔒 HolyCyber 是一个面向防御性网络安全的大型指令微调数据集(51,805 行、1.27 亿 tokens),覆盖 ATT&CK、CWE、CAPEC、Sigma 等权威来源。它的亮点在于:每一行都自带实测元数据——tokens、core_share、appendix 三个字段。本文将带你用这三个字段快速筛选训练数据:按 token 预算控制批处理、按核心内容占比挑选"干货"行、按附录开关做 loss 掩码,全程无需重新分词。
一、先认识 HolyCyber:一个"带计量表"的安全数据集
HolyCyber 的每一行都是一次完整的"三回合对话"(system / user / assistant),内容是针对某个具体安全实体(如 ATT&CK 攻击技术 T1568、某条 KEV 漏洞记录)的长篇防御性问答 briefing。核心指标一览:
| 指标 | 数值 |
|---|---|
| 总行数 | 51,805(train 40,998 / val 5,105 / test 5,702) |
| 总 tokens | 127,643,325 |
| 领域层数 | 17 个(检测工程、漏洞管理、AI 安全、云安全……) |
| 单行长度 | 最小 2,050 / 中位数 2,324 tokens |
| 任务类型 | 19 种提问形态 |
数据集本体是三个全局文件,另有 17 个按领域切分的"层"数据集:
- train.jsonl / val.jsonl / test.jsonl:全局训练/验证/测试集
- samples.jsonl:17 个完整样例行(每个领域一行),用来快速体验格式
- layers/:每个领域独立的
train/val/test.jsonl+ 数据卡片
💡 想先看看数据长什么样?不用加载 1.2 GB 的全量文件,直接打开 SAMPLES.md,它就是
samples.jsonl的渲染版,每个领域各展示一行完整记录。
二、三大元数据字段详解
以下三个字段都是构建时逐行实测的,不是估算值,所以你拿来即用。
1️⃣ tokens 字段:不用重新分词,就能控制批处理长度
tokens 记录用 tiktoken cl100k_base 分词器实际数过的 token 数,分三个子字段:
"tokens": {"user": 180, "assistant": 2350, "total": 2530}
| 子字段 | 含义 |
|---|---|
user | 提问部分的 token 数(通常几十到两百) |
assistant | 回答部分的 token 数(大头) |
total | 两者之和,即整行占用的上下文长度 |
用途:训练时按 batch 设置上下文预算,直接用 tokens.total 过滤即可,省掉一次全量 re-tokenize。官方统计保证所有行 tokens 之和与构建总账精确一致。
2️⃣ core_share 字段:一眼看清答案里有多少"干货"
有些安全实体本身记录很短(比如一条 KEV 漏洞条目只有几百 token),HolyCyber 会用同领域的其他实体记录把它"垫"到 2,000 token 下限——垫进去的内容放在带明确标记的 ## Reference: 附录里。core_share 就是答案中属于该实体自身内容的占比(即 1 − 附录占比):
| core_share 取值 | 意味着 |
|---|---|
1.0 | 纯干货:整行答案都在讲这个实体本身(如 cryptography、safety_boundary 领域,中位占比 100%) |
0.5 | 一半是自己内容,一半是参考附录 |
0.02 ~ 0.2 | 自身内容较短,附录占大头(如 threat_intelligence 中位数仅 14%) |
用途:如果你只想训练模型"就事论事"讲实体本身,过滤 core_share >= 0.5 就行;做评估集时选高分行也更"干净"。
3️⃣ appendix 字段:一个布尔开关,标记附录存不存在
"appendix": true,
"core_share": 0.41
appendix: true—— 该行带有## Reference: ...参考附录(全集中共 40,144 行,占 77.5%)appendix: false—— 纯核心内容,与core_share: 1.0等价
用途:做监督微调(SFT)时,如果你不想让模型在"垫脚"的引用文本上计算 loss,直接按 appendix 筛选,或对答案文本做两行式的切块掩码即可(附录有固定标题,是纯文本操作)。
三、实战:三个最常见的筛选场景
用 HuggingFace datasets 加载后,三种典型过滤都是一行 filter 的事:
场景 A:按 token 预算裁剪 batch
short = ds["train"].filter(lambda r: r["tokens"]["total"] <= 2600)
场景 B:只要"实体本体"占比高的行
core = ds["train"].filter(lambda r: r["core_share"] >= 0.5)
场景 C:附录掩码(loss 只算核心部分)
def mask_reference(answer: str) -> str:
i = answer.find("\n## Reference: ")
return answer[:i] if i != -1 else answer
三条组合起来就是一套完整的"数据质检流水线":先按 domain 选领域,再按 core_share 挑纯度,最后按 tokens.total 控预算。
各领域核心占比速查
不知道某个领域 core_share 大概什么水平?看这张中位数表(来自 layers/INDEX.md):
| 领域 | 行数 | 中位 tokens | core_share 中位数 |
|---|---|---|---|
detection_engineering | 7,970 | 2,213 | 12% |
ai_ml_security | 4,602 | 2,888 | 100% |
vulnerability_management | 3,493 | 2,246 | 8% |
governance_risk | 3,176 | 2,281 | 13% |
network_security | 2,383 | 2,338 | 19% |
cryptography | 2,101 | 2,873 | 100% |
safety_boundary | 2,200 | 2,906 | 100% |
可以看到:基于论文语料的领域(AI 安全、密码学、安全边界)几乎全是干货;基于框架实体的领域(ATT&CK、KEV 类)附录占比更高——这正是 core_share 字段存在的意义:它诚实地告诉你每行"讲正事"的比例。
四、如何快速验证与上手
- 看格式:打开 samples.jsonl,每行一个完整 JSON 对象,字段齐全(
id、row_key、domain、tokens、core_share、appendix、references、messages)。 - 查口径:DATASET_CARD.md 有逐字段定义和质量控制清单;README.md 的 "Using the metadata" 一节给出了官方示例。
- 看审计:附录复用率、段落重复率等"不完美但被如实度量"的指标都在 research/AUDIT_REPORT.md 里,选数据前值得一读。
- 加载方式:
from datasets import load_dataset
ds = load_dataset("json", data_files={
"train": "train.jsonl",
"validation": "val.jsonl",
"test": "test.jsonl",
})
📌 完整字段字典见 README.md 的 "Record format" 一节;数据来源与许可逐条记录在 research/SOURCE_TABLE.md。
五、常见问题 FAQ
Q:core_share 和 appendix 不是重复信息吗? appendix 是布尔开关(有没有附录),core_share 是连续比例(附录占多少)。有附录的行占比从 2% 到 63% 不等,只有两者结合才能精确控制"干货浓度"。
Q:tokens 用的哪个分词器? tiktoken cl100k_base。如果你的训练框架用其他分词器,实际 token 数会略有出入,但 tokens 字段依然可作为可靠的长度排序和预算近似。
Q:能按领域单独训练吗? 可以。layers/ 下每个领域都是独立可运行的数据集(含自己的 train/val/test.jsonl 和 DATASET_CARD.md),且所有行同样带三个元数据字段。
Q:数据是纯英文吗? 是的,当前版本(2.3.0,见 VERSION)仅英文。
六、总结
HolyCyber 把"数据计量"做成了数据本身的一部分:tokens 让你按预算切批次,core_share 让你按干货浓度挑行,appendix 让你按开关做掩码。三个字段全部逐行实测、账目精确,意味着你筛选 5 万行数据时不需要再跑一遍分词器——这正是大规模指令数据集最省时间的地方。🚀
【免费下载链接】HolyCyber
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



