LLM 隐私保护
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/llm-privacy。
技能介绍
问题出在哪里
当你把 CSV、SQL 结果、API 响应或命令输出交给模型时,只要里面出现姓名、电话、邮箱、地址,原始 PII 就已经进入上下文了。事后才想"刚才那段是不是该脱敏"已经没有意义——看过一次就留在那里了。而如果一律改成 SELECT COUNT(*) 这类聚合,又会丢掉你真正需要的逐行处理逻辑。
它是怎么工作的
llm-privacy 把脱敏做成一条可逆流水线:mask → 用 token 干活 → restore。
- 读取前先 mask:数据先过 masker,你看到的只有
⟦PII_…⟧占位符。同一个真实值永远映射到同一个 token,可以照常分组、计数、join、比较。 - token 是不透明标识符:不去猜背后是什么,不因为被 mask 就说值缺失,更不改动拼写——还原靠精确匹配。
- 用户看到之前 restore:把带 token 的草稿写进文件或管道,过一遍 restore 再呈现。还原后的文件含真实 PII,交给用户即可,但不要再读回上下文。
- 映射存在本地 vault:默认
$LLM_PRIVACY_VAULT,否则~/.llm-privacy/vault.json(创建权限 0600),从不进入上下文。
三类识别方式
- 内置通用实体:邮箱、IBAN、国际 +CC 电话、IPv4/IPv6、MAC、美国 SSN、ETH/BTC 地址;信用卡需显式开启
--entities incl. credit_card且通过 Luhn。 - 按地区开启:
--locales覆盖 48 国的本地电话与国民 ID,带校验位的(PESEL、CPF、TCKN、Aadhaar、DNI 等)会先做校验,避免等长随机数被误伤。 - 结构化字段与来源标签:CSV/JSON 用
--fields name,customer,street整列、整键递归脱敏;自由文本的人名地址没有可靠正则,需要自己包标签,例如 SQL 里的chr(57344) || 'NAME:' || customer_name || chr(57345),Python 侧用tag("NAME", value),各语言脚本都支持。
故意不脱敏的部分
订单号、物流号、UUID、哈希、日期、价格保持原样——宁可保守,也不破坏业务标识符的可用性。
边界与注意点
- 输出可能含 PII 就先 mask,不要"先读一下再决定"。
- 尽量在源头做聚合(
COUNT/SUM),只有必须流动的行级 PII 才过 masker。 - token 没法回填到后续命令:要么在源头过滤,要么走 restore → exec → mask,让真实值只出现在本地 shell。
- vault 是敏感文件:不打印、不提交,任务结束清空;一次任务用一个 vault。
- 不要
cat/diff还原后的文件,那等于把真实值拉回上下文。验证还原要靠盲测:grep -c 'PII_' final_answer.md必须输出0。
运行环境:Python 3.9+,仅用标准库。
使用场景
- 把含客户姓名电话的 CSV 或 SQL 查询结果交给模型分析前,用 --fields 整列脱敏,分析完再还原最终答复。
- 排查线上问题时命令输出里混有邮箱和 IP,先 mask 再阅读日志,避免真实地址进入模型上下文。
- 处理多语言客服记录,自由文本里的人名地址没有规律,生成查询时加来源标签,让脱敏不受语言限制。
- 生成按客户分组的报表,源头聚合后仍需展示行级明细时,只让占位符流入上下文,展示前再还原。
适合人员
- 后端工程师:常把数据库查询结果喂给模型排查问题,不想 PII 泄露进上下文。
- 数据分析师:汇总多份含个人信息的表格做分析,但交付前必须还原成真实值。
- Agent 开发者:给工具接入大模型时,希望敏感字段只存在本地 vault、不进提示词。
- 客服主管:批量处理多语言客户工单,既要保护隐私又要向用户交付完整答复。