无尘阁日记

无尘阁日记

数据脱敏系统的最佳实践:规则召回打底,本地小模型精排
2026-09-16

先说结论,省得你在方案里绕:「一个模型搞定脱敏」这件事不存在。

当前真正能上生产的最佳实践是——规则做高召回兜底,本地小模型做高精度精排,约束解码根除幻觉,可逆金库管住还原链路

系统的成败从来不在模型选得多大,而在漏检率可逆性管理这两件事上。凡是拿一个 7B / 14B 模型直接吞全文、吐脱敏结果的方案,我见过的无一例外都死在三个地方:漏、幻觉改写、没法还原。

一、核心认知:脱敏是判定任务,不是生成任务

这是行业里最贵的一课。脱敏的本质是「实体识别 + 边界决策 + 策略执行」,不是「文本重写」。一旦你让模型去"重写"整段文本,它就必然引入三类不可控错误。

方案 召回 精度 幻觉改写 成本 / 延迟 数据出域
纯正则 + 词典 中(泛化差) 极低
纯 LLM 直出脱敏文本 严重 有风险
LLM 只做 span 判定 可控(本地部署)
规则召回 + 小模型精排

靠最右那种"让模型全权输出"的做法,在实际项目里一定会出现:把"张伟"改成"李明"的同时,顺手把"合同金额 500 万"改写成"约五百万"——业务系统直接解析失败。更致命的是它会漏,而漏检在合规上是红线事故,不是质量问题。

所以正确答案是把流程拆成两段,让每一段只做自己最擅长的事。

二、五层架构:把职责切干净

L0 接入与解析 结构化数据 / 文档 / 日志流 / 图片 OCR。这一层最容易被低估,也最容易翻车(后面细说)。

L1 规则召回层(高召回) 正则 + 校验位算法 + 词典 AC 自动机。设计原则是宁可多召,不可漏召——放进去的是候选,不是结论。

L2 小模型精排层(高精度) 本地 SLM 逐 span 判定真伪与类型,约束解码直接吐 JSON。这一层解决"候选里哪些是真的 PII"。

L3 策略决策层 掩码 / 保真假名 / 泛化 / 加密切换。按角色、场景、敏感级别决定怎么处理。

以上是主链。另外还必须有两个旁路模块:可逆金库(Token Vault + KMS,支持授权还原和留痕)和审计与评测(黄金集回归验证、漏检率监控、分布漂移告警)。少了这两个,系统就是一次性的玩具。

三、本地小模型怎么选:按角色分工,别指望一个大模型包打天下

小模型在脱敏系统里有三个不同岗位,混用会浪费算力或者压不住精度。

① 精排判定主力(跑量最大)—— 0.6B ~ 1.7B

Qwen3-0.6B / Qwen3-1.7B 是当前中文小模型的最优梯队,指令跟随和 JSON 输出都很稳。这个尺寸做 span 判定,单卡 4090 批处理能跑到千级 QPS,1.7B 配 LoRA 微调就足够。

② 复杂上下文兜底 —— 4B ~ 9B

Qwen3-4B、GLM-4-9B-Chat。专治隐式 PII 和跨句指代——"我们老板""那位主任""上个月来的那个姑娘"这类,小模型扛不住,得上 4B 以上。

③ 编码器轻量 NER(性价比之王)

GLiNER(零样本 NER,直接指定实体类型抽取,几百 MB,CPU 上毫秒级)、PaddleNLP UIE(中文抽取老将)、HanLP / LTP。这一层比 LLM 快 20 到 50 倍,成本几乎为零,应当承担 80% 的召回扩展工作。

关键用法——别让模型输出脱敏后的文本,让它做判定

// 输入:上下文片段 + 候选 span(由第一段给出)
// 输出(约束解码强制,物理上不可能输出别的)
{"is_pii": true, "type": "PERSON", "conf": 0.97}

微调路线:不需要人工标数据。用大模型(Qwen-Max / GPT-4o / Claude)批量生成 (context, span) → label 样本,人工只抽检 10%,每类实体攒 2 到 5 千条,用 LLaMA-Factory(省事)或 Unsloth(快 2 倍、省显存)跑 LoRA r=16~32,1.7B 单卡几小时完事。重点是把难负例喂进去:"朝阳区"里的"朝阳"、"张三丰"里的"张三"、"华为技术有限公司"里的"华为"

四、约束解码是整个方案的技术命门

用 SGLang(内置 XGrammar)、Outlines 或 llama.cpp 的 GBNF,把输出空间锁死在合法 JSON schema 内。这样幻觉不是"概率低",而是解码时就不存在

这也是本地小模型能对标甚至超过大模型 API 的根本原因——调 API 你控制不了解码过程,而自部署可以把约束加在解码器上。

五、只有踩过坑的人才会写进设计里的那些事

  • 校验位是免费的精度。身份证 GB 11643 校验、银行卡 Luhn、统一社会信用代码校验放在规则层跑一遍,能干掉六成以上的误报,成本是模型的万分之一。
  • 文档内一致性靠实体消解。同一个"张伟"全篇必须映射到同一个假名,否则下游关联分析直接失效。必须先做同指归并,再统一分配假名。
  • 假名必须保分布。随机生成是外行做法。姓名要按百家姓频次 + 性别 + 年代采样,地址保住行政区划层级,金额保住数量级。医疗科研和统计分析场景,假名失真等于数据废掉。
  • 跨模态遗漏是翻车重灾区。PDF 元数据、Excel 隐藏 sheet、图片里的证件 OCR、日志 URL 的 query、Word 修订历史、剪贴板。OCR 必须接进接入层,别以为处理了正文就完事。
  • 重识别风险 ≠ 文本脱敏。"某三甲医院呼吸科主任,2023 年 3 月上任"——姓名全脱了,照样能定位到具体的人。这是效果评估要专门测的那一项。
  • 高安全场景不要保持原长度。姓名 2 字还是 4 字本身就是信息,用定长占位符。
  • 流式场景要滑动窗口 + 边界重叠。日志准实时脱敏,窗口切分会把实体拦腰截断。

六、评测才是项目成败的分水岭

  • 黄金集按实体类型分层抽样,每类不少于 500 条
  • 指标用 Entity-level P/R/F1,不是 token-level,另加"边界严格匹配"指标;
  • 把「漏检率」单列为核心 KPI,而不是看 F1。合规事故只由漏检触发,误检顶多让业务方抱怨两句;
  • 按 GB/T 42460-2023 做重识别风险评估(k-匿名、prosecutor risk);
  • 每次规则或模型更新跑全量回归,线上加 PII 命中率突变告警——这是分布漂移的先行指标。

七、合规锚点

GB/T 37964-2019《个人信息去标识化指南》→ GB/T 42460-2023《个人信息去标识化效果评估指南》(评估方法论直接按它做,很多团队漏掉这一份)→ GB/T 35273-2020《个人信息安全规范》→ 金融 JR/T 0171-2020、JR/T 0197-2020 → 医疗 GB/T 39725-2020 → 国际 ISO/IEC 20889:2018、GDPR Recital 26、HIPAA Safe Harbor 十八类标识符。

八、落地节奏:四个阶段,别想一步到位

P0(1-2 周) 规则 + 黄金集先跑通,量化基线。跳过这步的团队,后面根本判断不出模型到底有没有用。

P1(2-4 周) 接入 GLiNER / UIE 做召回扩展,规则仍占主导。

P2(4-8 周) SLM 精排层 + 约束解码上线,规则与模型互为校验。

P3(持续) 可逆金库、审计评测、重识别评估常态化。

结语

规则管"不漏"(高召回 + 校验位),小模型管"不错"(精排 + 约束解码),金库管"能还"(授权还原 + 留痕),评测管"可信"(漏检率为王)。

这套组合在 1.7B 模型加一张消费级显卡上就能跑出大模型 API 达不到的稳定性,而且数据一步不出域。