cxumol:
AI 网站泄密并非新事, 2025 年年初先后爆出过 DeepSeek 拖库事件 和 OmniGPT 拖库事件, 前不久还有沉浸式翻译暴雷事件。 AI 聊天对话记录能藏的东西太多, 服务商要存也只拿明文存, 导致泄密风险很高。
考察过已有的数据脱敏方案, 大部分是用正则替换实现的, 比如 langfuse, 还有你到 github 上随便搜, 也基本上是正则替换。 正则的缺点是只能预设有限的规则, 例如手机号, 身份证号等, 但对于姓名, 住址, 密码等格式不确定的情况无能为力。
还能想到的一个方案是 NER (命名实体识别), 这是传统 NLP 的东西, 有算法也有模型。 这样子姓名, 住址就能覆盖到了。 有个好处是能对敏感信息进行分类, 把张三替换为 [PERSON]
, 把东胜神州傲来国花果山水帘洞替换为 [LOCATION]
。 这样语义信息能保留, 但信息量不一定够。 比方说涉及到复杂人际关系时, 替换为 [PERSON_1]
, [PERSON_2]
, [PERSON_3]
很容易让 AI 感到迷惑, 毕竟只相差一个字符/词元, 相似度高; 所以更好的办法是, 替换为此人身份角色代称, 这能让 AI 无需耗费额外 token 推理也容易理解人物之间关系。
基于正则、 NER 的脱敏方案还有个限制是保密定义的模糊性。 对于人名地名而言, 网友的真名实姓和家庭住址通常是不便透露的, 但换成让 AI 分析新闻、 制订旅游规划, 这时人名地名如果也被 "脱敏", 就怪不了 AI 随便乱答了。
上述问题导致传统数据脱敏方案在 AI 对话场景中, 要么敏感信息覆盖不完整, 要么容易降低 AI 服务的质量。 如果换成让 LLM 脱敏, 就好解决了。 奇形怪状的明文密码 / API Key 能轻松识别, 人名可以替换为角色身份, 地名也可以根据情景判断是否保密。 又因为保密本身的需要, 来做这项工作的大模型最好是跑在本地/内网环境里的。
我没有过上锦衣玉食的生活, 想象不到持有大显卡的快乐, 只能在内存/显存/算力有限的情况下研发, 跑小模型。 所幸, 小模型进步很大, 精心设计过提示词工程/上下文工程后, 验证了就算 1B 左右的模型也可以用于脱敏。 设计提示词有两个关键点: 1. 偏重模式匹配 (few-shot / 多样本学习) 而非指令遵循 2. 使其输出尽可能短, 否则容易超时/爆显存/幻觉篡改。
为了让输出尽可能短, 我的想法是, 不能让本地模型直接输出打码后的文本, 而是输出一段 json 格式的映射表, 比如 {"Jensen Huang": "${CLIENT_1_NAME}"}
。 这就让输出长度只取决于保密这部分的信息量, 而不取决于原文长度太长。 映射表还有个好处是, 不但可以脱敏, 还可以还原。 比如 GPT-5 从语义上理解了形似环境变量的占位符的含义, 因此在回答中也包含了相同占位符, 就可以把回复内容里的 ${CLIENT_1_NAME}
换回 Jensen Huang
, 从而不降低用户体验。
流程设计示意图:

如图, 因为中间层隔离了需要保密的信息, 所以用户侧只会看到无码的文本, 而云端只能看到打码的文本。 因为云端 AI 看到的是语义丰富的占位符, 因此不会降低回答质量。
在工程实现层面, 优雅的方案, 同样需要舒服的用户体验。 有两种方式可以融入已有的 AI 工具/流程里:
- 在 python 代码/脚本中, 可以无缝替换 OpenAI 官方 SDK, 只要改一行代码, 实现自动脱敏打码, 自动还原去码
# from openai import OpenAI 换成
from promptmask import OpenAIMasked as OpenAI
- 客户端填写 OpenAI 格式 /chat/completions API 时, 填写本地网关的地址, 本地网关负责实现自动脱敏打码, 自动还原去码, 并反代上游 /chat/completions API
pip install "promptmask[web]"
promptmask-web
并且在配置文件中指定上游 (默认 OpenAI 地址) 即可
[web]
upstream_oai_api_base = "https://generativelanguage.googleapis.com/v1beta/openai"
运行用于打码脱敏本地模型, 需要搭配跑本地模型的服务器。 默认对接端口是 ollama 的 11434, 如果用其它端口不同的服务器, 比如 llama.cpp, vllm, 或者部署在内网地址, 甚至要用公网服务 (假设有非常放心的 AI 服务商), 都可以修改配置文件来指定。
开源在 GitHub 上, 源码地址是 https://github.com/cxumol/promptmask
对于 "小尺寸 LLM 也能干活" 有疑虑的朋友, 也可以看看我的跑分 https://github.com/cxumol/promptmask/blob/master/eval/benchmark.md
当然跑分对用户也是有益的, 假如需要定制在特定场景下脱敏的 prompt, 可以自己跑分来优化脱敏 prompt 并挑选模型。 对于很小的模型, 预设的通用 prompt 在特定场景下估计比不过定制化的 prompt.
另外写了篇英文博客, 更加详细地讲解来龙去脉 https://xirtam.cxumol.com/promptmask-how-not-give-ai-secrets/
做这东西估计反正不会有任何商业价值。 我经济状况长期处于比较微妙的境地, 而这周起我的主要救济粮来源也断供了。 所以还特地去开了个 GitHub Sponsor, 希望多少有点收入吧。
世间安得双全法, 爽用 AI 不泄密?
小模型脱敏, 大模型答。
"神机假面"者, 藏己以利人, 隐真以成事。
善操蛇者, 应有"代李之术"。 旧符驭新马, 执其要而应无穷。
普罗大众, 应有"私设之关"。 坐享其成, 而不劳其神。
故秘事自隐,而神智畅游