← 返回项目

模型安全

[unisound 实习] Uni-Guard 文本安全审核

[unisound 实习] Uni-Guard 文本安全审核项目介绍

项目概述

Uni-Guard 是一套面向用户输入文本的内容安全审核系统,目标是在保证风险召回的同时,降低正常内容误杀,并控制大模型审核带来的推理延迟和算力成本。

项目不是依赖单一模型完成全部判断,而是采用规则、BGE-M3 和 Qwen3Guard-Stream 协同的分层架构:规则处理确定性风险,BGE-M3 快速筛选高置信样本,Qwen3Guard 复审复杂语义和灰区请求,最终输出 allow、block 或 review。

用户文本
  → 文本预处理
  → 规则层
  → BGE-M3 高置信分流
      ├─ 高置信 Safe   → allow
      ├─ 高置信 Unsafe → block
      └─ Grey           → Qwen3Guard 复审
                            ├─ Safe          → allow
                            ├─ Unsafe        → block
                            └─ 不确定/冲突   → review
  → 风险记录与审计

系统设计

规则层

规则层用于处理判断标准明确、需要提供可解释证据的风险,例如确定性的高风险表达、提示词攻击模式、特殊实体及白名单场景。

  • 命中明确高风险规则时,可以直接拦截。
  • 命中中风险规则时,继续交给模型判断。
  • 白名单可以抑制特定语境下的误命中。
  • 每次规则判断都会保留命中规则和证据,便于审计和错误分析。

BGE-M3 层

BGE-M3 原本是文本向量模型。在本项目中冻结其 Encoder,基于 CLS Embedding 分别训练两个轻量分类头:

  • Safety Head:判断文本属于 Safe 或 Unsafe。
  • Risk Head:识别暴力、违法、色情、隐私、自残、政治敏感、版权、越狱等九类风险。

BGE-M3 的职责不是审核全部请求,而是处理最有把握的两端样本:

  • Safe 概率达到高置信标准时直接放行。
  • Unsafe 概率达到高置信标准时直接拦截。
  • 无法达到任一高置信标准的请求进入 Grey 区,交给 Qwen3Guard。

这种设计利用了 BGE 推理快、分类结果稳定的特点,同时避免轻量模型对复杂语义做过度决策。

Qwen3Guard 层

Qwen3Guard-Stream-8B 主要处理 BGE 无法稳定判断的复杂内容,例如:

  • 敏感主题的正常讨论与实际危害请求之间的区别;
  • 敏感材料的翻译、改写、摘要和分类;
  • 角色扮演、复杂系统提示和长文本;
  • 间接诱导、越狱及规避检测;
  • 表面主题相似,但用户最终请求不同的内容。

项目基于 Qwen3Guard-Stream-8B 完成多版本 LoRA 微调,并将 LoRA Adapter 与基础模型合并后使用 SGLang 部署。SGLang 用于提升大模型推理吞吐、管理显存与请求调度,并统一离线评测和部署时的推理方式。

BGE-M3 模型训练

项目没有从头训练 BGE-M3 基础模型,而是冻结 Encoder,只训练安全分类头,从而降低训练成本并快速开展多组实验。

Safety Head 实验覆盖:

  • Linear、MLP256、MLP512 和更深 MLP;
  • CrossEntropy 与 Focal Loss;
  • 不同 Unsafe 类别权重;
  • 不同学习率、训练轮数、Scheduler 和 Early Stopping;
  • 不同安全阈值和双侧高置信阈值。

最终采用的 Safety Head 配置为:

Encoder:冻结 BGE-M3
Pooling:CLS
Head:MLP512
Dropout:0.1
Loss:CrossEntropy
Safe/Unsafe 权重:1.0/1.0
Learning rate:3e-4
Epochs:12
Batch size:64
Max length:128

在同源测试集上,Safety Head 达到:

  • Accuracy:97.12%
  • Macro-F1:96.89%
  • Unsafe Recall:97.34%

在人工开发集上进一步扫描双侧阈值。较严格运行点下,BGE 高置信直接拦截 Precision 达到 99.50%。此时 BGE 只拦截最有把握的风险样本,其他请求进入 Qwen 复审。

Qwen3Guard 多版本微调

Qwen3Guard 的优化重点不是频繁修改 LoRA 方法,而是通过多版本微调验证不同数据构建方案。

主要工作包括:

  • 对比 Qwen3Guard-Stream 0.6B、4B 和 8B 原模型;
  • 以 8B 为主要基础模型进行 User Prompt/Query 风险分类微调;
  • 比较不同训练数据来源、边界样本组合、样本权重和学习率;
  • 统一训练与 SGLang 推理的输入位置和评测口径;
  • 根据 FP、FN 和具体错误样本不断调整训练数据。

最终较优版本在 2,000 条人工开发集上达到:

  • Accuracy:89.60%
  • Unsafe Recall:94.19%
  • F1:90.76%
  • FN:由原始 8B 的 146 条降至 63 条

由于该人工数据参与了数据分析和模型选择,因此这些结果属于开发集指标,不作为完全独立测试集结果。

多方法安全数据构建

数据构建是项目投入最多、也是模型效果提升最关键的部分。

人工数据与运营数据整理

首先整理人工金标、运营日志和安全测试数据,统一文本字段、标签格式和数据来源信息,并进行去重、格式清洗和训练集划分。

多模型一致性筛选

使用 Q3、MiniMax 等不同模型复审原始数据:

  • 多模型一致判定为合规的数据作为高置信 Safe 候选;
  • 多模型一致判定为违规的数据作为高置信 Unsafe 候选;
  • 判断不一致的数据单独保留,不直接作为干净标签。

Strict/Loose 与 A/B 交叉判断

使用同一个 Qwen3-4B-Instruct 基座训练 Strict 和 Loose 两种 LoRA 分类器:

  • Strict 模型提高 Unsafe 数据权重,更倾向于拦截边界请求;
  • Loose 模型提高 Safe 数据权重,更倾向于放行边界请求。

数据进一步拆分为 A、B 两部分,形成 A-Strict、A-Loose、B-Strict、B-Loose 四路交叉判断:

  • Strict 和 Loose 都判 Safe:高置信 Safe;
  • Strict 和 Loose 都判 Unsafe:高置信 Unsafe;
  • Strict 判 Unsafe、Loose 判 Safe:候选边界数据;
  • 反常或多路分歧样本进入过滤或复核。

这种方法用于发现处于 Safe/Unsafe 决策边界的样本,而不是直接依赖单一模型生成最终标签。

三方安全 API 复审与十桶分层

项目进一步使用腾讯、阿里和百度三方安全审核 API,对原始 8,001 条 Safe 和 16,182 条 Unsafe 数据进行复审。

根据三家 API 返回的 Pass、Review 和 Block 结果,以及它们与原始标签的一致程度,将数据划分为十个类别:

原始标签 三家合规 两家合规 其他 一家合规 零家合规
Safe 4,992 1,568 406 727 308
Unsafe 2,215 3,108 1,925 4,641 4,293

其中:

  • 原始 Safe 且多数 API 合规的数据,适合作为高置信 Safe;
  • 原始 Unsafe 且多数 API 判风险的数据,适合作为高置信 Unsafe;
  • 原始 Unsafe 但多数 API 判合规的第 6、7 桶,是最重要的标签冲突数据。

通过分桶,可以分别控制不同置信度数据的使用方式、采样比例和训练权重,而不是把所有数据等价地加入训练。

数据对齐

为什么需要数据对齐

第 6、7 桶原始标签为 Unsafe,但多数或全部 API 判为合规。早期将这些数据统一作为风险或边界数据,会让模型过度依赖敏感主题,造成正常讨论、翻译和教育内容被误杀。

因此,项目以 2,000 条人工审核开发集为参考,重新整理第 6、7 桶的数据标签和训练用途。

对齐过程

第一步,分析人工开发集中 Safe 和 Unsafe 样本的判定特点:

  • Safe:可能涉及敏感主题,但最终请求是讨论、教育、防御、分类或材料转换,没有要求实施危害。
  • Unsafe:明确要求实施或促进危害,存在攻击目标、欺骗目的或可执行步骤。
  • Boundary:语境不足、意图不明或不同证据冲突,无法稳定判断。

第二步,隔离训练数据与人工开发集的重合样本。第 6、7 桶原有 5,323 条,其中 212 条与开发集重合,被移出训练,只用于分析标签口径。

第三步,对剩余 5,111 条数据进行重新判断:

  • 按人工审核标准进行初步规则判断;
  • 使用字符级 TF-IDF,从人工开发集中查找相似的 Safe/Unsafe 案例作为参考;
  • 对规则和相似案例结论冲突、或置信度不足的数据使用大模型复核;
  • 仍无法稳定判断的样本保留为 Boundary,不强行生成确定标签。

最终结果:

对齐标签 数量
Safe 1,939
Unsafe 681
Boundary 2,491

这里的“数据重构”不是修改文本,而是重新确定数据的标签、类别和训练用途。

FP/FN 驱动的数据迭代

模型训练后继续分析两类错误:

  • FP:实际 Safe,但模型判为风险,即正常内容误杀;
  • FN:实际 Unsafe,但模型判为 Safe,即风险内容漏放。

错误分析发现,训练数据中普通分类任务 Safe 较多,但政治讨论、敏感翻译、短文本和复杂角色提示等“困难 Safe”不足。因此,后续不是简单增加 Safe 总量,而是针对模型薄弱场景补充相同主题下的 Safe/Unsafe 对照数据。

整个数据闭环可以概括为:

多模型与多 API 复审
  → 置信度和冲突分桶
  → 人工口径对齐
  → LoRA 微调
  → FP/FN 与错误样本分析
  → 补充困难 Safe/Unsafe
  → 下一轮训练与评测

项目成果

项目最终完成了:

  1. 一套规则、BGE-M3 和 Qwen3Guard 协同的分层安全审核方案;
  2. BGE-M3 Risk Head、Safety Head 的训练与阈值校准;
  3. Qwen3Guard-Stream-8B 的多版本 LoRA 微调与 SGLang 部署;
  4. 包含人工数据、多模型判断、Strict/Loose 交叉筛选、三方 API 十桶分层的数据构建体系;
  5. 针对标签冲突数据的 Safe/Unsafe/Boundary 对齐流程;
  6. 从数据处理、训练、评测、错误分析到模型交付的完整闭环。

个人工作总结

该项目主要体现了以下能力:

  • 系统设计:根据准确率、召回率、延迟和成本设计多模型级联方案;
  • 模型训练:完成 BGE 分类头训练及 Qwen3Guard 多版本 LoRA 微调;
  • 数据构建:使用多模型一致性判断、Strict/Loose 交叉筛选和多 API 分桶构建安全数据;
  • 数据对齐:依据人工审核标准重新处理标签冲突数据,并通过 FP/FN 分析持续修正训练分布;
  • 工程交付:完成模型合并、SGLang 部署、批量评测、延迟测试及交付文档整理。

一句话概括:

设计并实现 Uni-Guard 分层文本安全审核系统,通过 BGE 高置信分流、Qwen3Guard 灰区复审、多方法安全数据构建和人工口径数据对齐,持续平衡风险漏放、正常内容误杀、推理延迟与算力成本。