Jue:面向网络安全的校准决策模型
技术报告,2026 年 10 月。模型:Jue1Dev/jue(25 亿参数)和 Jue1Dev/jue-flash(3.5 亿参数)。项目主页:jue1.dev。
摘要
安全运营团队的很多工作,是回答关于某个具体对象的封闭问题:这棵进程树是不是恶意的?这是哪个 ATT&CK 技术?这条 IAM 策略放不放行这个请求?这个依赖受不受这条公告影响?生成式模型用文字回答,回答还得再解析,也没法设阈值。Jue 改为给每个选项一个概率。它接收一个状态(告警、日志、策略、CVE 描述、一次工具调用)和一组类型化问题,一次前向给所有问题打分。我们发布两个模型:Jue,在 MiniCPM5-2B 上加 LoRA adapter 的 25 亿参数解码器;Jue-Flash,带决策头的 3.5 亿参数双向编码器。在安全基准上,Jue 在 SecQA v1 上得 .973,VulDetectBench task 1 得 .921,CyberMetric-10000 得 .735,CTIBench RCM 得 .723;在 BFCL-v4 irrelevance 上得 .863,When2Call 得 .836。在 131 个外部任务的同一批题上,编码器有 14 个超过解码器。发布的 Jue 没有达到训练前定下的全部发布标准。本报告介绍两个模型、我们怎么测的,以及哪些地方不行。
1. 引言
检测工程师、SOC 分析师和漏洞管理人员每天要做大量小决定,大多数只有几个可能的答案。自动化流水线需要的是能拿来分流的数字:失陷概率在 0.3 到 0.8 之间就转人工,注入概率高于 0.9 就拦下工具调用。自由文本给不了这个。
Jev 系列决策模型把这个问题表述为针对状态的类型化问题,用校准概率作答。Jue 用开放模型实现同一接口,单张显卡或一台笔记本就能运行,重点是网络安全:安全运营与检测、威胁情报、漏洞管理、云与身份安全、DevSecOps、合规,以及调用工具的 AI 智能体的护栏。
项目最初的目标不一样,是通过在代码仓库里游走来找深层逻辑缺陷;这个目标不再进步之后,才转向安全决策(第 6 节)。有两条规矩始终没变。每次训练改动在运行前登记主指标、值得追求的最小效应,以及不能退步的检查项。每个结果都按配对比较读取,带 bootstrap 区间;失败就记作失败,不改口径。
2. 接口
一个请求包含一个状态和至多 256 个问题。问题有三种类型:
- Choice:在几个带简短说明的具名选项中选一个。
- Noul:这个命题是否为真?
- Score:序数尺度上的一个档位,例如从"信息"到"严重"。
响应给出每个问题每个选项的概率。线协议是 Jev 的 POST /v1/systemone,现有 Jev 客户端可以直接调用这两个模型。一个缩短的例子:
{
"state": {
"policy": {"Statement": [
{"Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::finance-reports/*"},
{"Effect": "Deny", "Action": "s3:*", "Resource": "arn:aws:s3:::finance-reports/*",
"Condition": {"Bool": {"aws:SecureTransport": "false"}}}]},
"request": {"action": "s3:GetObject", "context": {"aws:SecureTransport": "false"}}
},
"questions": {
"allowed": {"type": "noul", "instructions": "Under this identity policy, the request is allowed."},
"decisive_statement": {"type": "choice", "instructions": "Which statement decides the outcome?",
"criteria": {"ALLOW_S3_ALL": "The Allow statement", "DENY_INSECURE": "The Deny on insecure transport",
"IMPLICIT_DENY": "No statement matches"}}
}
}
Jue 对 allowed 给出 0.11,在 DENY_INSECURE 上给出 0.9965。
3. 模型
3.1 Jue
Jue 是 MiniCPM5-2B(42 层,25.2 亿参数)加一个秩 32 的 LoRA adapter,作用于全部注意力和 MLP 投影。状态只编码一次作为共享前缀;每个问题是一个单独的分支,只看前缀和自己。所以回答 20 个问题只需对状态做一次前向,每个答案也与单独提问时相同。答案从语言模型头读出:Answer: ( 之后各选项代码的 logits 构成选项分布,再用一个全局温度(T = 1.091)校准。
训练目标是选项分布上的交叉熵,Score 题另加排序概率分数项。优化器 AdamW,lr 1e-4,余弦衰减,一个 epoch,在一张 RTX PRO 6000 上跑了 12,645 个优化步。请求打包到最长 8,192 token,从不截断。
3.2 Jue-Flash
Jue-Flash 是 LiquidAI 的 LFM2.5-Encoder-350M(10 层门控短卷积加 6 层双向注意力)加一个决策头。决策头按问题对多个编码层做门控,让每个问题去关注状态,用选项各 token 上的后期交互(MaxSim)给选项打分,并把 Score 题各档位耦合起来,使分布保持单峰。每个问题的每个选项在一次双向前向中打分。校准按题型各用一个温度,是非题另加一个偏置。上下文 4,096 token,更长的状态保留前 70% 和后 30%。预热后在 Apple 芯片上每个请求约 0.1 秒。
4. 测量方法
外部基准被转换成类型化问题,用各基准自己的指标打分。答案取选项分布的 argmax,所以不存在解析失败,但转换会改变一部分任务。比如 CTIBench RCM 变成在列出的 CWE 中选择,而不是自由生成;SWE-bench 变成在文件中选择,而不是检索。这些数字照样报告,但标注为不能与公开榜单对比。
Jue 和 Jue-Flash 在同一批题上比较。每个基准只保留两个模型都完整作答的条目,两边用同一个打分器。Jue 只读了 750 题样本的基准,比较就在这个样本上。训练改动之间的差异用按组聚类的 bootstrap 95% 区间判定。
5. 结果
5.1 Jue 的外部基准成绩
| 基准 | Jue | 能否与公开结果对比 |
|---|---|---|
| SecQA v1 / v2 | .973 / .940 | 能 |
| VulDetectBench task 1 / 2 | .921 / .864 | 能 |
| SECURE CWET / KCV / MAET | .741 / .826 / .763 | 能 |
| CyberMetric 10000 / 2000 / 500 / 80 | .735 / .753 / .760 / .812 | 能 |
| CTIBench MCQ | .515 | 能 |
| CTIBench RCM(CVE 到 CWE,列出选项) | .723 | 不能 |
| AthenaBench rcm-open(开放 CWE,1,391 个 id) | .5515 | 能 |
| CMMLU 计算机安全 | .672 | 能 |
| SecBench 选择题(中文) | .814 | 不能(子集) |
| BFCL-v4 irrelevance / live-irrelevance | .863 / .724 | 能 |
| When2Call | .836 | 能 |
| JevBench 公开题 / hard | .783 / .577 | 仅公开题 |
| SecAlertBench(750 题样本) | .433 | 不能 |
SecAlertBench 是明显的短板。样本里 527 条良性告警,Jue 把 354 条判成攻击,成绩低于随机。
5.2 同一批题上的 Jue 与 Jue-Flash
| 类别 | 配对任务 | Jue-Flash 更高 | 中位差(Flash − Jue) |
|---|---|---|---|
| 安全 | 63 | 9 | −.178 |
| 工具调用与代码 | 64 | 5 | −.326 |
| JevBench 公开题 | 4 | 0 | −.247 |
| 合计 | 131 | 14 |
Jue-Flash 在 SecAlertBench(.637 对 .433)、CASTLE(CWE .300 对 .093)和 VulDetectBench task 2(.886 对 .864)上领先。CASTLE 和 VulDetectBench 的题型在它的开发中做过针对,只有 SecAlertBench 的领先是零样本的。它落后最多的是:需要同时选多个选项的题(BFCL parallel-multiple .035 对 .965,SecEval 多答案 .011 对 .462)、判断不该调用任何工具(BFCL irrelevance .475 对 .863)、中文题(SecBench .397 对 .814),以及装不进上下文的长智能体记录(τ-bench retail .000 对 .296)。参数只有七分之一,它适合做快速初筛,替代不了 Jue。
5.3 示例
模型卡展示了为这次发布编写的 15 个场景:EDR 进程树、Sigma 规则对 Windows 事件、两条中文 WAF 告警、钓鱼邮件头、一段 CVE 描述、一个列入 KEV 的漏洞、一个 VEX 可达性案例、AWS IAM 策略、Kubernetes RBAC 与 Pod 安全、iptables 首条匹配、测试夹具里的密钥、一次带提示注入的智能体工具调用,以及 NIS2 上报时限。展示的每个回答都是模型真实输出。Jue 在 31 个问题中答对 23 个,Jue-Flash 答对 17 个。Jue 答错的包括:把钓鱼邮件判成垃圾邮件;NIS2 早期预警答成 72 小时,正确是 24 小时;iptables 的规则号判对了,结论却判错了。
5.4 校准
在与训练相近的题型上,Jue 校准良好(Choice ECE .019,Noul .015,Score .031)。在外部基准上它欠自信:置信度比准确率低 .057 到 .068。在熟悉题型上拟合温度会让它更差,而在基准上拟合等于在测试集上拟合,所以我们没有修。在新题型上请把它的概率当作偏保守的估计。
6. 不行的地方
最后一步训练按事先定下的标准与之前的模型比较,八条中达到三条,没达到五条:
- 过度弃权。在 AthenaBench rcm-open 中候选列表里确实有正确 CWE 的条目上,Jue 有 28% 回答"都不是",之前是 4.3%。给"都不是"加偏置能压下来,但答案确实不在列表里时的召回会减半。
- 两处退步。Windows 安全描述符(SDDL)访问判断,以及必须先做的前置 API 调用(例如认证调用),都变差了。
- 外部基准上欠自信,见 5.4。
- 规则执行。需要把规则完整求值的是非题(可达性、权限、依赖解析、合并资格)有进步,但 17 个难子任务中只有 3 个显著提升,与同一状态上的选择题仍有明显差距。
我们检验过,能否改读中间层而不是最后一层来缩小规则执行的差距。在六个深度上做的线性探针,在第 36 层达到 .536,与模型自身读出(.536)相等;中间层最大增益 +.0004,登记的门槛是 .026。信息并没有藏在更早的层里,所以跨层读出帮不了这个模型。在近乎相同的案例之间加一致性损失,也没有可测的收益(+.003,门槛 +.03)。
最初的代码目标没有达成。仓库级代码游走不随训练改善,一次重复训练的研究还表明,这个基准太小,测不出现实大小的效应。深层逻辑缺陷定位从未实现,也从未测量过。
7. 用途与限制
Jue 适合用来排序、分流和预填决策,再由人或确定性检查器确认:研判队列、告警富化、检测规则检查、CVE 与 CWE 映射、策略与配置问题,以及智能体循环里的护栏。不要用它单独做拦截或执行,不要用它提供法律建议,也不要问答案不在状态里的问题,比如某个 CVE 将来会不会被利用。CVSS 计算和分析师研判分级停在多数类附近,请用计算器或其他信号。它复现的是公开规范的语义,不是某个组织自己的策略;一个错误的"允许"可能掩盖暴露面。
两个模型都是防御型的,没有训练它们写漏洞利用、载荷、规避技术或钓鱼内容。
8. 发布
| Jue | Jue-Flash | |
|---|---|---|
| 仓库 | huggingface.co/Jue1Dev/jue | huggingface.co/Jue1Dev/jue-flash |
| 内容 | LoRA adapter、校准文件、推理服务、示例 | 编码器与决策头权重、校准文件、推理服务、示例 |
| 底座模型 | openbmb/MiniCPM5-2B(Apache-2.0,不随附) | LiquidAI/LFM2.5-Encoder-350M |
| 许可 | Apache-2.0 | LFM Open License v1.0;推理代码 Apache-2.0 |
引用
@misc{jue2026,
title = {Jue: Calibrated Decision Models for Cybersecurity},
author = {{Jue1Dev}},
year = {2026},
note = {Technical report},
url = {https://huggingface.co/Jue1Dev/jue}
}