PrivAiTe:本地化 LLM 代理,自动脱敏 PII 并支持工具调用
PrivAiTe 是一款自托管 LLM 代理,可在请求发出前可逆地替换姓名、邮箱、卡号、密钥等敏感信息,并在回复中还原,…
PrivAiTe 是一款自托管的 LLM 代理,运行在用户应用与模型服务之间,能够在敏感数据离开本机之前对其进行可逆替换,并在模型回复中把真实值还原。它重点覆盖了消息文本、工具调用参数以及多模态内容中的 PII,弥补了多数同类工具只扫描对话文本的盲区。所有检测均在本地完成,零外发遥测,任何兼容 OpenAI 接口的客户端都可以直接指向它。
核心思路:本地假名化而非匿名化
PrivAiTe 属于「假名化(pseudonymization)」方案,而非不可逆的匿名化。用户仍是数据控制方,代理会把「Marie Dupont」「marie@acme.com」等真实实体替换为 <PERSON_1>、<EMAIL_ADDRESS_1> 等占位符,模型看到的是脱敏版本;当回复返回后,代理再把占位符替换回原始值。官方明确说明检测是「尽力而为」,并非绝对保证,并提供了详细威胁模型文档说明保护范围与不保护范围。
双引擎检测架构
PrivAiTe 默认同时运行两套检测引擎,互相补盲。
Presidio(微软):正则 + spaCy NER
这是默认引擎,主打结构化 PII 与基础命名实体识别。
- 邮箱、电话、信用卡、IBAN、IP 地址、美国 SSN:通过正则匹配,信用卡与 IBAN 还会做 Luhn 校验和与格式校验;
- 姓名:2 个及以上大写词组成的姓名由 spaCy NER 识别;单字或小写姓名依赖上下文正则(如「je m'appelle X」「my name is X」等触发词);
- 日期:针对法语、德语写法的自定义正则。
Presidio 速度很快(每次请求约几十毫秒),在代码、新闻、技术文本上误报极少,但无法识别 spaCy 不认识的姓名,也无法检测密钥与密码。
OpenAI Privacy Filter:上下文 ML 模型
这是 OpenAI 开源的 PII 检测模型(15 亿参数、5 亿激活,Apache 2.0),通过 ONNX Runtime 在本地运行,体积约 800 MB,无需 PyTorch。它补齐了 Presidio 的弱项:
- 任意大小写、任意格式的姓名(基于上下文理解,不依赖大写规则);
- 密码与密钥(如「SuperSecret2024!」、形如「sk-proj-…」的 API Key);
- 银行账号、保单号等技术性编号;
- 多语种日期。
该模型单次请求约 400 毫秒,偶尔会把技术编号误判为账号(例如「CMD-2024-98765」)。因此它作为第二道关卡与 Presidio 并行运行。
三档预设配置
项目提供三档预设,用户可按场景权衡召回率、误报与延迟:
- onnx(默认):Presidio + Privacy Filter 全部启用,在 AI4Privacy 基准 120 文档测试中召回率 84.5%(token 级严格口径约 80%),14 份样本中出现 2 次误报,延迟约 0.5 秒,能识别密钥与密码;
- light:仅 Presidio,召回率降至 62.4%,14 份样本中 3 次误报,延迟约 60 毫秒,不检测密钥;
- max:onnx 基础上叠加 GLiNER 零样本 PII 模型,在分布外语料上把召回率从约 84% 提升到约 89%,代价是更多误报与 PyTorch 依赖,属于可选项。
官方专门提醒了一个「陷阱」:在 light 预设下不要把 detectors.presidio.entities 限制为短白名单,否则召回率会跌到约 35%,启动时代理会打印警告。安装包默认已包含 onnxruntime 与分词器,onnx 预设开箱即用;max 预设需额外安装 privaite[gliner],否则会启动失败并给出安装提示。
适用场景与边界
- 推荐 onnx:需要最大覆盖、愿意接受技术编号上的偶发误报、关心密钥与密码外泄的场景;
- 推荐 light:追求零干扰与最快速度,主要处理代码、新闻、商务文本,只脱敏经典 PII。
需要强调的是,PrivAiTe 是端到端流程中的一道防线,并不替代更上游的数据治理。它不能阻止用户在系统中主动上传文件中的敏感信息,也不解决模型侧记忆或训练数据泄露问题。对于企业级合规场景,建议结合威胁模型文档与本项目的基准数据,评估其是否满足自身的数据保护要求。
