先把当时的情况摆出来。把历史工单灌进知识库做检索,上线三天后被合规抽查发现某条分片里完整包含客户身份证号和住址,要求全量排查 4 万个分片。
这类报错背后常见的原因有几处,逐个排除就行。清洗只做了长度过滤,没有 PII 识别。也可能是工单正文里客户自己粘贴了证件信息。
还有一种情况,附件 OCR 文本直接拼接进分片。另外,向量库只存向量不存原文,但 payload 里留了全文。
动手时先抽样统计 PII 命中分布
python -c "import re;s=open('chunk.txt',encoding='utf-8').read();print(len(re.findall(r'\d{17}[\dXx]',s)),len(re.findall(r'1[3-9]\d{9}',s)))"
随后用正则加校验位批量扫描全部文本
python -c "import re,id_validator;print([x for x in re.findall(r'\d{17}[\dXx]',open('all.txt',encoding='utf-8').read()) if id_validator.valid(x)][:5])"
命中项做掩码后回写再重新向量化
python mask_and_reindex.py --collection kb --field text --mask id-card,phone
剩下的就是把 PII 扫描加进入库流水线的卡点
python ingest.py --source tickets/ --pii-check block
怎么算真的好了,看的是同一批现象。全量扫描命中 412 条,掩码后重新向量化完成,复查抽样 PII 命中为 0,入库流程在 PII 检测不通过时会直接拒绝。
提醒一点。向量库的 payload 常被当成附属字段,实际它就是原文仓库,PII 检查必须放在切分之后、入库之前。这类问题最好一次改到位,反复小改反而容易把原因搅混。
