「张主任下周来视察」——正则零命中、NER 置信度 0.58、只有 LLM-Judge 能定。检测精度决定「能不能信」,处置动作决定「信了之后怎么办」

⚖️ 合规框架切换后下方 13 类目按该法规重排「必处理」优先级
GDPR任何个人信息必须脱敏或征得同意
诚实性说明:第 1 层「正则 + 校验和」在浏览器内真实执行——15 条 pattern 是真实 JS RegExp,身份证校验和按 GB 11643 加权模 11-2 真算,改正则即时重算。 第 2 层 DeBERTa-v3 NER 与第 3 层 LLM-Judge 的命中区间是人工标注的真值,本工具不调用任何模型;三层的召回率/延迟数字引自 §8.2.5 表格的文献值,非本工具实测。

🧪 八篇陷阱样本(每篇都让某一层单独失败)

S1 职务称谓「张主任」

第 1 层完全失效真值待脱敏实体:张主任
内部通知:张主任下周来我司视察工作,请各部门做好准备。

§8.2.5 原文点名的例子。正则零命中(没有号码/邮箱这类固定形态);NER 置信度 0.58,低于常见 0.6 阈值会被直接丢掉;只有第 3 层能结合「内部通知 + 视察」的语境判定它指向某个特定自然人。

🧑‍⚖️ 本样本属 RedactionBench 的 contextual(上下文)档 —— 人在这个档位上只有 47.7% 一致
张主任(conf 0.88)—— 职务称谓是否指向特定自然人,完全取决于「内部通知 + 视察」的上下文。既然人在这个档只有 47.7% 一致,评估 LLM-judge 时不应期待 90%+ 的一致率; 上面对 span 给出的 0.8x–0.9x 这种「比人还自信」的读数本身就是可疑的。(📖 arXiv:2606.18782,200 份人工标注文档 / 11 领域 / 80+ 参与者;强制档 89.4%、安全保留档 94.1%)
合并后 span(按位置排序)
L2L3
张主任PERSONTier1conf 0.94✓ 真值
结合「内部通知 + 视察」语境,判定为指代特定个人的称谓

📊 召回 / 误报仪表

仅第 1 层 · 召回0.0%
TP 0 / FP 0 / FN 1
第 1+2 层 · 召回100.0%
TP 1 / FP 0 / FN 0
三层合并 · 召回100.0%
TP 1 / FP 0 / FN 0
三层合并 · 精确率(1 − 误报占比)100.0%
全 8 篇样本累计(真值共 9 个实体)
L1
TP 3
FP 0
L1+2
TP 7
FP 1
L1+2+3
TP 9
FP 2
注:这是 8 篇陷阱样本上的表现,样本是刻意挑选的困难案例,不代表 §8.2.5 的 ~92% / 95-97% / 99.4% 全量指标。

🏗️ 三层防御架构(§8.2.5 文献值)

第 1 层 · 正则 + 校验和(Checksum)本工具真跑
召回 ~92% · 延迟 <1ms/doc · 高精度快速过滤
第 2 层 · DeBERTa-v3 NER人工标注
召回 95-97% · 延迟 ~10ms/doc · 高召回语义识别
第 3 层 · LLM-Judge (gpt-4o-mini / Claude Haiku)人工标注
召回 ~99.4%(合并后) · 延迟 ~500ms/span · 歧义消解 + 跨句共指
三层合并后总体指标:召回 99.4%、误报 1.7%(§8.2.5 原文)。

🔀 merge 层四步(§8.2.5 原文)

span 去重

同一位置的多层命中合并为一个 span(按文本定位,本工具以字符串定位代替偏移量比对)

本样本merge 过程
第 1 层原始命中0 个
第 2 层标注命中1 个
第 3 层标注命中 / veto1 / 0
合并最终结果1 个

🔴 第 2 步「标签规范化」默认了一个已被证伪的前提

🔴 类型名对齐 ≠ 标注可比:2610.22597 合并 77 个公开数据集时发现,即便把所有类别映射到同一 schema,各数据源对「什么算一次检出」的判定仍会互相矛盾(span 边界怎么划、上下文词算不算进 span),该工作为此对 1.12M 样例全部重新打标。
对本工具的直接后果:在合并之前必须先统一「检出」的定义 —— 否则「多层交叉验证加权」是在给不可比的量做加权平均:加权后的置信度看起来更可信,实际是把口径差异伪装成了置信度。
「什么算一次检出」的定义:
只框实体本身,不含修饰词与标点
原文:患者 张伟 于上月入院
检出 span:张伟长度 2 字符
原文:联系方式:13812345678。
检出 span:13812345678长度 11 字符
原文:北京市海淀区中关村南大街5号
检出 span:北京市海淀区中关村南大街5号长度 14 字符
🧮三种定义下,加权置信度都是同一个数
把三条 span 都当作「三层一致命中」(conf 0.80 / 0.78 / 0.76)喂给 mergeConfidence(), 三种定义下算出的置信度全是 0.90 ——数值相同,含义完全不同。这就是「口径差异被伪装成置信度」的可亲手复现形态。⚠️ 修法:合并之前先统一「检出」的定义,否则加权只是在给不可比的量做平均。

🧩 第 1 层正则表(§8.2.1,浏览器内真实执行)

🐛 找 bug 卡:本工具自己的银行卡正则曾漏检 16/17 位卡号(off-by-two,已修)
修复前 \b62(?:2202|...|2240)\d{12,15}\b:6 位 BIN + 12–15 位 = 总长 18–21 位, 而银联卡号标准 16–19 位 → 16 位与 17 位卡号整体漏检。工具 S8 样本恰好取了 19 位,所以这个 bug 从未暴露。现已改为 16–19 位。
16 位
旧✕新✓
17 位
旧✕新✓
18 位
旧✓新✓
19 位
旧✓新✓
⚠️ 顺带一提:书籍自己的正则 BIN 白名单漏了 22 → 它连 §8.1.1 类目表里自己举的 622202xxxxxxxxxxxx 都匹配不上。建议反馈书籍编辑。
身份证校验和按 GB 11643 加权模 11-2 真算:权重 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],校验码表 1,0,X,9,8,7,6,5,4,3,2。 S3 的 11010119900307231X 校验位应为 6,实际 X,因此被判为无效号码。

📋 13 类 PII「必处理」优先级 · 按 GDPR 重排(§8.1.1 原表)

#类目例子风险等级必处理
1身份证号110101199001011234极高必脱敏
2护照号E12345678极高必脱敏
3银行卡号622202xxxxxxxxxxxx极高必脱敏
4信用卡号4532-xxxx-xxxx-xxxx极高必脱敏
5医疗信息糖尿病、HIV极高必脱敏
6种族宗教维吾尔族 / 穆斯林高视场景
7生物特征指纹 / 虹膜 / 人脸极高必脱敏
8邮箱user@gmail.com高必脱敏
9电话+86 138-xxxx-xxxx高必脱敏
10API Keysk-xxxxxxxxxx高必脱敏
11AWS KeyAKIA...高必脱敏
12姓名地址张三 / 北京市海淀区...高视场景
13IP 地址192.168.1.1中推荐脱敏
排序 = 风险等级(极高 3 / 高 2 / 中 1)+ 该法规的侧重加权;风险等级与「必/推荐/视场景」标记全部照抄 §8.1.1 原表,加权为本工具为实现排序所加。 切到 HIPAA 看医疗信息如何跃居首位。
内容参考《AI 数据全书》第 8 章「PII 识别与脱敏」· 阅读原章节 → · 系列首页:数据工程·全景驾驶舱 →
第 1 层「正则 + 校验和」在浏览器内真实执行(15 条 JS RegExp + GB 11643 加权模 11-2 校验位),改正则即时重算; 第 2 层 DeBERTa-v3 NER 与第 3 层 LLM-Judge 的命中区间为人工标注的真值,不调用任何模型; 三层召回率/延迟(~92% / 95-97% / 99.4%,误报 1.7%)为引自 §8.2.5 表格的文献值,非本工具实测 —— 且这三个数字全章无脚注、无引用、无评测集描述,是工程经验值、不是公开基准实测,不能当 SLA 用(口径限定与 REDACT 反证见 Tab ⑤)。 哈希为 FNV-1a 32bit、加盐为 mulberry32 确定性伪随机,均为演示用途,不是密码学强度。 章节中标注「待验证」的内容(§8.2.5 Tier 分级、§8.4.1 可逆脱敏失败模式、Presidio 三条兼容性必测项)已在对应面板标注出处。
数据与口径快照:2026-10-29(📖 / 🧮 / ⚠️ 三标记:📖 = 论文或书籍文献值;🧮 = 浏览器内真算;⚠️ = 教学模型或编辑判断,非论文结论)。 REDACT 覆盖 25 语种 / 9 种书写系统,锁定语言分层样本 1,000 条;25 语种分摊后单语种样本量很小,中文上宜作相对比较而非绝对 SLA。
🔗 一手源:REDACT(多语种 PII 检测基准) · Strong Multilingual Privacy Tagging at Encoder Speed · Broad and Efficient PII Detection with Unified Labels · RedactionBench(人工一致率分档) · RAT-Bench(重识别风险) · Veil-Then-Reveal(可逆伪匿名化) · Meddies-PII(合成临床语料) · PyPI · presidio-analyzer