← 返回全部文章

从零开始训练一个会成长的安全模型

研究更新: 本文记录的是最初假设和早期实验。完整的 Rule2Probe 系统、 QLoRA 冻结实验、统计检验、负结果与 strong-hit 证据,已整理为论文式文章: 《Rule2Probe:基于反例引导神经符号合成的可执行检测验证》

写这篇文章,是想记录一个刚刚开始的研究方向:我们能不能不追求一个什么都知道的通用大模型,而是做一个足够小、具备基本智能、能够在工作中逐渐成长的安全模型?

需要先说明的是,在产生这个想法的时候,我们还没有训练出模型,也没有现成的数据集和实验结果。下面的内容首先是一份研究假设和实施路线,而不是对已有成果的总结。我们会把之后的成功和失败都逐步记录下来。

现在的大模型很像一个读完了大半个互联网、然后才开始工作的成年人。它拥有庞大的知识储备,也因此需要巨大的参数量、训练数据和计算资源。但人的成长并不是这样。一个人并不会先学会世界上的一切再进入某个行业,而是在拥有基本认知能力之后,一边工作、一边犯错、一边修正,最后在一个具体领域里形成自己的经验和判断。

我们想尝试把这个过程放到模型上:先训练出一个“有智能但没有多少知识储备”的小模型,让它理解指令、观察环境、使用工具、从反馈中学习;然后把它放进真实的安全工作流中,使它随着任务不断完成自训练。它不需要成为百科全书,却可能在某一个足够窄的场景下,成长为高水平的专业模型。

在讨论这个想法之前,还是要先把一件事情讲清楚:一个大模型到底是怎样从零训练出来的?

从零训练大模型到底在训练什么

所谓“从零训练”,并不是下载一个开源模型再做微调,而是从随机初始化的参数开始,让模型第一次建立对语言和世界的表示。最常见的技术路线依然是 Transformer:文本先被切分成 Token,Token 被映射成向量,再经过一层层注意力和前馈网络,最后预测下一个最可能出现的 Token。

原始数据 -> 清洗与去重 -> Tokenizer -> 预训练 -> 指令微调 -> 对齐 -> 评测与部署

这条链路看起来只有几步,但每一步都会直接决定模型最后能变成什么样。

第一步是确定目标。我们要训练多大的模型,支持多长的上下文,主要处理自然语言、代码还是安全日志,最终运行在服务器、个人电脑还是边缘设备上,这些问题必须在训练前回答。模型参数量、数据量和算力不是三个互不相干的数字,它们需要彼此匹配。参数很多而数据不足,模型只会反复记忆;数据很多而模型太小,容量又不足以吸收其中的规律。

第二步是数据工程。通常我们会收集网页、书籍、论文、代码、对话等语料,然后完成去重、质量过滤、隐私清理、危险内容标注和数据配比。大模型并不会天然区分事实、噪声和恶意样本,它只会学习训练数据中稳定出现的模式。很多时候,数据配方甚至比模型结构更重要。

第三步是训练 Tokenizer。Tokenizer 决定模型看到的最小单位。对中文、代码和安全领域来说,一个不合适的词表会把常见术语拆得很碎,不仅浪费上下文,也提高学习难度。例如 CVE 编号、函数名、协议字段和命令片段都有自己的分布,通用词表不一定能很好地表示它们。

第四步才是真正的预训练。模型不断接收一段文本,预测它后面的内容,通过预测误差反向传播并更新参数。预训练表面上只是在做 Next Token Prediction,但当规模足够大时,语法、概念关系、代码结构和一部分推理模式都会被压进参数里。模型的“知识”和“智能”也在这个阶段混合形成,很难被完全切成两个互不相干的模块。

第五步是指令微调。完成预训练的 Base Model 更像一个续写器,它未必理解用户是在提问,也未必知道什么时候应该调用工具。我们需要使用高质量的指令与回答样本,让它学会对话格式、任务拆解、结构化输出以及基本的工具使用。

第六步是对齐。通过人工偏好、规则反馈、奖励模型或可验证结果,我们让模型知道什么样的回答更好,什么行为不能接受。安全模型的对齐尤其不能只做“拒绝训练”,因为一个什么都拒绝的模型确实安全,却没有任何工作价值。真正需要建立的是边界判断:它应当理解授权范围、风险级别、证据强弱和操作后果。

最后是评测与部署。困惑度下降并不代表模型真的能工作。我们仍然要测试它在真实任务中的准确率、幻觉率、工具调用成功率、延迟、显存占用和安全边界。上线以后,数据分布还会继续变化,所以训练也不应该被理解成一次性的终点。

“有智能但没有知识”是什么意思

严格来说,一个完全没有知识却拥有智能的语言模型并不存在。语言能力本身就是从知识和经验里学出来的,推理也不可能脱离对基本概念的表示。我们真正希望得到的,不是一张绝对空白的纸,而是一个低知识先验的学习者。

它需要保留几种最基础的能力:理解语言,维持上下文,分解目标,比较结果,使用工具,以及根据反馈修改行为。但它不需要在参数中记住大量人物、历史、地理和长尾事实,更不需要试图回答所有领域的问题。外部事实可以按需检索,长期经验则在实际工作中逐渐积累。

可以把它简单地拆成三层:

基础智能:理解、推理、规划、工具使用
外部记忆:文档、案例、日志、知识库
任务能力:在工作反馈中持续形成的专用参数

这种设计的关键,是把“记住整个世界”和“学会怎样解决问题”分开。通用模型往往把两者一起塞进参数,而我们的模型只保留一个较小的基础智能核心,把可变化的事实交给检索系统,把反复使用且稳定有效的工作经验逐步固化进轻量参数。

这并不是简单地做一个 RAG,也不是每天把新日志拿来微调一次。RAG 解决的是“此刻去哪里找信息”,持续训练解决的是“经历过许多类似任务后,模型的判断方式有没有真正变好”。一个会成长的模型应当同时拥有短期上下文、可检索的长期记忆,以及经过验证后才更新的技能。

让模型伴随工作完成自训练

假设我们先把场景限制在安全告警研判。模型每天会看到规则命中的事件、请求与响应、资产信息、历史案例以及分析人员最后的结论。它一开始可能只会整理证据和调用工具,但随着任务积累,它应该逐渐学会哪些告警值得优先处理、哪些特征经常意味着误报、什么情况下需要继续取证,以及怎样给出可复核的判断。

一次完整的学习循环可以是这样的:

观察任务 -> 检索已有经验 -> 给出判断 -> 人或环境验证
    -> 保存轨迹 -> 筛选高质量样本 -> 更新轻量适配器 -> 回归评测

这里最重要的不是“自动”,而是“反馈可验证”。如果模型把自己的输出直接当成正确答案,再拿去训练自己,错误会被不断放大,最终形成非常自信的幻觉。安全工作中的标签应该优先来自可验证结果,例如沙箱执行、规则匹配、人工复核、后续处置结果或多个独立信号的交叉确认。模型可以提出假设,但不能同时充当唯一的出题人、答题人和裁判。

每一次工作轨迹也不应该全部进入训练集。我们需要记录任务输入、模型决策、工具调用、证据、最终结果和修正原因,再经过质量评分、去重和敏感信息处理,只保留真正有学习价值的样本。普通重复任务用于巩固,模型不确定或判断错误的边界样本则拥有更高价值。这实际上是一种伴随真实工作的主动学习。

参数更新也应当从最轻的方式开始。基础模型保持相对稳定,不频繁改动;新的场景能力先写入独立的 LoRA 或 Adapter;外部事实保存在可更新的知识库;当某项能力经过足够多任务验证后,再考虑合并或蒸馏。这样做不仅节省训练资源,也方便回滚和定位某一次学习造成的能力退化。

为什么它可能做到极致轻量化

通用模型之所以巨大,是因为它要在同一组参数里覆盖无数领域、语言和任务。如果问题被限制在一个明确场景里,模型需要处理的状态空间会小得多。一个只负责某类安全日志研判的模型,不需要写诗、讨论艺术史或记住全世界的旅游信息,它只需要理解固定的数据结构、少量工具和一套可以不断修正的决策过程。

因此,我们可以同时从几个方向压缩模型:减少基础模型参数,把事实知识移到外部记忆,用稀疏的任务适配器保存能力,通过量化降低推理成本,再把已经成熟的工作轨迹蒸馏给更小的学生模型。最终的目标不是让小模型在通用榜单上击败大模型,而是让它在自己的单一场景中,以更低的延迟、成本和数据暴露面完成同等甚至更好的工作。

这里有一个很容易被忽略的优势:模型越小,持续更新越现实。一个超大模型即使每天获得了新的工作经验,我们也很难高频重新训练;而一个足够小的模型,可以在单机甚至本地环境中完成适配器训练。它的成长周期能够从几个月缩短到几天,甚至在任务批次结束后就完成一次受控更新。

但轻量化也不意味着可以无限缩小。模型至少要有足够的容量理解任务、处理上下文并学习稳定模式。到底需要多大,不能靠感觉决定,而应该通过模型尺寸、数据规模和任务成绩之间的消融实验来寻找拐点。

自训练真正危险的地方

这个方向最吸引人的地方,是模型能够自己成长;最危险的地方,也恰恰是模型能够改变自己。

首先是错误自举。早期模型能力不强,如果高置信度的错误被当作训练数据,后续更新只会强化偏差。其次是灾难性遗忘,模型学会新的告警类型以后,可能丢掉旧任务上的能力。再次是数据投毒,攻击者如果能够控制模型看到的日志、网页或反馈,就可能把恶意模式逐步写进模型。对于安全模型来说,这甚至会形成一种新的持久化方式:恶意行为不留在文件里,而是留在参数里。

因此,持续学习系统必须同时保留数据版本、模型版本和完整评测集。每次更新前后都要跑回归测试,对旧能力、新能力和安全边界分别评分;出现明显退化时能够直接回滚。训练数据需要追踪来源和可信度,高风险更新需要人工批准,模型执行外部操作时仍然要经过最小权限和沙箱限制。

还有一个必须面对的问题是经验污染。真实工作里存在大量客户数据、漏洞细节和内部资产信息,它们可以参与当前任务,却不应该被模型永久记忆。什么进入临时上下文,什么进入外部知识库,什么可以进入参数,必须有明确的数据分级。否则所谓自训练,很容易变成不可控的信息泄露。

我们准备怎样逐步开展这项研究

第一阶段,我们不会直接挑战“会自我进化的通用模型”,而是选择一个结果容易验证的窄场景,例如安全告警分类、Web 请求风险识别或漏洞报告去重。先建立固定的数据格式、工具集合、人工工作流和离线评测集,得到一个不会移动的基线。

第二阶段,训练一个最小可用的基础模型。我们会比较两条路线:从随机参数开始做小规模领域预训练,以及从现有小型 Base Model 出发,尽量削弱不需要的知识并保留基础智能。前者更接近真正的从零训练,研究价值更高;后者成本更低,也更容易快速验证核心假设。

第三阶段,搭建记忆系统和经验数据管线。模型的每次判断都形成结构化轨迹,但只有经过验证、脱敏和质量筛选的内容才能进入经验池。事实进入检索库,成功的决策过程进入训练候选集,失败案例则专门用于构造边界测试。

第四阶段,引入受控的持续训练。先只训练可插拔的轻量适配器,不让模型直接修改基础参数;每次训练都要通过旧任务回放、独立验证集和安全回归测试。我们重点观察三个指标:单位任务需要多少新样本,能力能够保持多久,以及新增能力会不会伤害原有能力。

第五阶段,再尝试更强的自主性。当模型能够稳定判断自己“不知道什么”,可以主动请求标注、选择最有价值的样本,并在更新后解释能力变化时,才逐步减少人工介入。自主训练不应该是第一天就赋予模型的权力,而应当是经过验证后逐级开放的能力。

我们最终想验证什么

这项研究并不是为了证明小模型在任何方面都能取代大模型,而是想验证另一个方向:模型的价值是否一定来自它出生时记住了多少知识,还是也可以来自它在真实环境中持续学习的速度?

如果这个假设成立,未来的专业模型可能不再是同一个巨大模型的不同提示词,而是一批拥有共同基础智能、却有着不同成长经历的小模型。它们随团队一起工作,理解本地工具和流程,记住经过授权的经验,在一个狭窄领域里形成自己的能力,同时仍然能够被审计、回滚和重新训练。

这更像人的成长:出生时并不掌握所有知识,但拥有学习能力;通过一次次真实经历建立经验;犯错以后得到纠正;最后在长期重复的工作中成为专家。

现在这还只是一个研究起点。接下来我们会从最小模型、最窄场景和最容易验证的反馈开始,一步一步观察它到底能不能成长,以及这种成长究竟需要付出多少数据、算力和安全成本。相比再做一个无所不知的模型,我更期待看到一个足够小、会在我们身边慢慢学会工作的模型。

研究日志 0:先证明我们真的能从零训练

2026 年 8 月 5 日,我们建立了第一个独立训练工程 SeedSec,并确定了首个正式候选 SeedSec-32M:8 层 Transformer、512 隐藏维度、8 个注意力头、8192 词表和 512 Token 上下文,实际初始化参数量约为 33.592M。这个尺寸不是因为它已经足够强,而是因为它能在一台 M4 Pro、24GB 内存的个人电脑上被反复从头训练,适合做数据配比和持续学习实验。

在启动正式训练前,我们先用一个 0.527M 参数的模型做了 200 步冒烟实验。Tokenizer 由本地合成语料从零训练,模型也从随机参数开始,最终验证集 loss 从随机初始水平降到了 0.6983,perplexity 为 2.01。模型成功学会了重复的输出格式和一条简单告警规则,但面对没有见过的加法和排序输入时仍然会给出错误答案。

这次结果不代表我们已经得到了一个安全模型,甚至不能说明它具备可靠的推理能力。它只证明 Tokenizer、数据管线、Metal 训练、验证、检查点保存和重新加载已经全部跑通,也给出了第一个很重要的反例:语言模型损失下降,不等于智能已经形成。

下一步不会立刻运行 1 亿 Token 的长训练。我们要先建立与训练分布隔离的能力评测集,再确定基础结构语料、可验证能力语料和安全场景语料的配比,同时解决许可证、授权和脱敏问题。等这些条件满足以后,SeedSec-32M 才会开始第一次正式训练。

研究日志 1:把目标缩小到规则拨测 Agent

继续讨论以后,我们把模型目标进一步缩小了。它不需要回答所有安全问题,第一项真正的工作是理解 Sigma 与 Esper 规则,并为每条规则规划一个最小、稳定、可追踪的拨测用例。模型需要知道一条规则依赖什么事件、哪些字段必须满足、是否存在先后顺序、关联主体是什么,以及最后应该到哪个窗口和 strong-hit 结果里验证。

我们对集群 3 的 297 条线上 Esper YAML 做了第一次只读导入,所有文件均成功解析。按照实际 EPL 结构,它们被分成 151 条叶子规则、100 条关联规则、15 条窗口或表等基础设施规则,以及 31 条仅用于测试的规则。另外又导入了 2 条标准 Sigma 规则,用来验证两种规则能够进入同一套中间表示。

这套中间表示会记录规则元数据、EPL statement、输入与输出窗口、前置 rule_name、时间窗口、谓词字段、强信号字面量以及 join、pattern、group by、having 等结构。叶子规则倾向于在授权服务器制造单一主机行为,关联规则则需要复用多个前置拨测,并保持同一个关联主体和正确的时间顺序;窗口、表和重入规则本身不直接执行攻击行为,只检查数据是否正确流入。

自学习机制也有了一条明确的底线:模型生成的拨测计划最初只能是草案,不能直接拿自己的输出继续训练自己。只有计划经过人工批准、拨测服务器实际执行成功、strong-hit 已配置并且确实命中目标规则,这条轨迹才允许进入训练数据。失败轨迹会被保存用于分析,但不会被伪装成正确答案。

目前 299 条规则都已经生成草案,但训练数据导出仍然是 0 条,因为还没有任何计划完成真实服务器验证。这不是进度停滞,而是我们第一次把“模型觉得正确”和“环境证明正确”真正分开。下一步会选择一条已有稳定拨测用例的叶子规则,完成第一条从规则理解、人工审核、服务器执行到 strong-hit 回收的闭环。

研究日志 2:第一轮本地规则学习

在接触服务器拨测之前,我们决定先回答一个更小的问题:完全从随机参数开始训练的小模型,能不能只靠本地 Sigma 和 Esper 规则,学会最基础的规则分类与拨测规划?

第一轮模型只有 10,238,208 个参数,采用 4 层 Transformer、384 隐藏维度、6 个注意力头、4096 词表和 512 Token 上下文。Tokenizer 只用训练切分中的本地规则训练,模型也没有加载任何外部预训练权重。299 条规则按规则 ID 隔离成 238 条训练规则、30 条验证规则和 31 条测试规则,同一规则派生的任务不会跨越不同切分。

模型先在规则全文和解析结果上预训练 2000 步,再针对“规则分类”和“拨测策略”两个任务进行监督微调。预训练约用了 202 秒,微调 500 步约用了 56 秒,单个 checkpoint 大约 39MB。这种训练规模已经体现了轻量模型最现实的优势:我们可以在个人电脑上快速重复实验,而不必把每次数据设计都变成昂贵的长周期任务。

我们只根据验证集选择模型。500 步 checkpoint 在 60 个验证任务上完整匹配 36 个,优于继续训练到 1000 步的 34 个;验证 loss 同样在中途开始恶化,说明只有数百条监督样本时,小模型很快就会过拟合。因此最终固定 500 步模型,再评估此前没有参与训练和模型选择的测试规则。

在 31 条测试规则派生的 62 个任务上,模型生成的 JSON 62 个全部合法,完整答案匹配 41 个,字段级准确率为 140/186。其中规则分类完整匹配 17/31,拨测策略完整匹配 24/31。这个结果比最初的合成数据冒烟实验前进了一步:模型不仅会续写固定格式,也开始在未见规则上学习本地解析结果到任务答案的映射。

但这仍然不是一个已经会自主拨测的安全 Agent。当前答案来自确定性规则解析器和规划器,并不是攻击在服务器上真实执行后的结论;模型学到的“拨测策略”也主要是计划类别、目标和前置条件,而不是一套经过 strong-hit 验证的攻击步骤。测试规则只有 31 条,分数波动会很大,更不能把一次 66.1% 的完整匹配率包装成高水平安全能力。

这轮实验还暴露了两个很有价值的工程问题。第一版 Tokenizer 没有把 <answer> 等结构边界注册为专用 Token,导致训练和推理时答案起点的分词不一致;旧 checkpoint 需要预填充 JSON 起始符才能正确生成。第二,普通语言模型训练会同时计算长输入和短答案的 loss,模型花在复述规则上的容量远多于真正回答任务。下一轮会加入结构标记专用 Token,并实现只对答案区域计算损失的样本级训练。

截至这一步,所有规则读取、训练和评估都在本地完成,没有连接拨测平台,也没有使用 WEBIDS_BASE_URLWEBIDS_SERVICE_TOKEN。我们现在拥有的不是成熟产品,而是第一个可以复现、可以被失败结果纠正的本地学习基线。下一项研究会先改进训练目标,再由人工审核少量规则计划,为真正的“执行—验证—学习”闭环准备第一批可信经验。