PII redact Skill 个人敏感信息无感脱敏
在消息发给 LLM 前自动替换 17 类 PII(个人可识别信息),用户无感,LLM 返回后自动回填还原。
要求:Python 3.x(推荐 3.8 及以上)
脱敏类型
| # | 类型 | 匹配规则 | 示例 |
|---|---|---|---|
| 1 | 身份证号 | 18位格式 | 110101199001011234 → 身份证****1234 |
| 2 | 护照号 | 字母+8位数字 | E12345678 → 护照****5678 |
| 3 | 军官证号 | 军/士/文+字第+数字 | 军字第12345678号 → 军官证****5678 |
| 4 | 港澳通行证号 | 上下文+CHM+8位 | 通行证C12345678 → 通行证****5678 |
| 5 | 台胞证号 | 上下文+8位数字 | 台胞证01234567 → 台胞证****4567 |
| 6 | 统一社会信用代码 | 18位含字母 | 91110108MA01A1B2C3 → 信用代码****B2C3 |
| 7 | 纳税人识别号 | 上下文+15~20位数字 | 税号123456789012345 → 税号****2345 |
| 8 | 手机号 | 11位(无条件) | 13812345678 → 手机****5678 |
| 9 | 座机号 | 区号-号码 | 010-87654321 → 座机****4321 |
| 10 | 邮箱 | 标准邮箱格式 | user@example.com → 邮箱**** |
| 11 | 银行卡号 | 上下文+16~19位数字 | 银行卡6222021234567890 → 银行卡****7890 |
| 12 | 车牌号 | 省简称+字母+数字 | 京A12345 → 车牌**** |
| 13 | 微信号 | 上下文+字母开头ID | 微信号wx_xiaoming → 微信号**** |
| 14 | QQ号 | 多种格式支持 | QQ12345678 / QQ号:12345678 → QQ号**** |
| 15 | 详细地址 | 上下文关键词+行政关键词 / 省市区路 / 直辖市+区+路 / 市+区+路 / 省+市+镇+路 | 地址北京市朝阳区建国路88号 → 地址****;广东省深圳市南山区科技路1号 → 广东省深圳市****;北京市朝阳区建国路88号 → 北京市**** |
| 16 | 金额 | 中文/阿拉伯数字 | 500万元 / 人民币壹佰万 → [金额已脱敏] |
| 17 | 姓名 | 上下文关键词+2~4字 | 我叫王小明 → 我叫王** |
快速使用
脱敏(发给 LLM 前)
# 聊天消息(管道模式)
echo 我叫张三丰,手机13812345678 | python redact.py -
# 保存映射表(用于还原)
python redact.py input.txt output.txt 2>mapping.json
还原(LLM 回复后)
echo 张**的手机手机****5678有问题 | python restore.py - mapping.json
文件清单
| 文件 | 说明 |
|---|---|
redact.py |
脱敏脚本 |
restore.py |
还原脚本 |
install_windows.bat |
Windows 安装脚本 |
install_linux_mac.sh |
Linux/Mac 安装脚本 |
README.md |
详细使用说明 |
注意
- 姓名:需上下文关键词(我/甲方/乙方等),无关键词不匹配
- 座机号:必须有
-分隔符,纯数字不匹配 - 银行卡号:需前置关键词(银行/账号/卡号等)
- 详细地址:支持5种匹配模式——上下文关键词+≥1个行政关键词、省+市+区+路、省+市+镇/路(无下辖区城市)、直辖市+区+路、市+区+路
- 映射表:临时文件,会话结束建议清理