记录一下那天晚上的排查过程。微调数据里把邮箱统一替换成 EMAIL_1 这类占位符,训练完让模型生成联系人,输出里出现了真实的公司邮箱,与训练集里某个客服的邮箱一致。

刚开始盯着「模型记住了少样本示例里的地址」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。占位符与真实邮箱在同一批数据里同时存在。还有一种是提示词模板里保留了真实邮箱作为示例。

还有一种情况,占位符编号有规律,模型能反推出映射。

扫训练集里是否还有真实邮箱格式

python -c "import re;d=open('train.jsonl',encoding='utf-8').read();print(len(re.findall(r'[\\w.+-]+@[\\w-]+\\.[\\w.]+',d)))"

随后把示例里的真实地址一并替换

python mask_email.py --input train.jsonl --placeholder EMAIL --report hit.txt

然后用随机化占位符并打乱编号顺序

python mask_email.py --random-token --length 12 --shuffle

生成 200 条样本检查是否输出真实域名

python probe_model.py --n 200 --pattern email --report leak.txt

别只看报错消失,验证要多做一步。抽样 200 条输出里没有出现训练集中出现过的真实邮箱,占位符编号无规律,示例模板也已替换。

提醒一点。占位符只能挡住字面记忆,提示示例和编号规律都会把真实值带回来,脱敏要覆盖训练、示例、评测三条路径。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189