Hotdry.

Article

本地隐私防火墙:在请求抵达 ChatGPT 前用本地模型拦截并脱敏 PII/密钥

利用本地 7B 量化模型在 80 ms 内完成 PII/密钥脱敏,再调用云端 LLM,兼顾合规、延迟与成本。

2025-12-11ai-security

1. 把数据留在本地,把问题抛给云端

2025 年,68 % 的企业 RAG 系统存在「chunk 级权限缺口」:用户本无权查看完整文件,却能通过多轮提问让模型引用敏感片段。监管罚款与舆情风险让「先上传、后过滤」的传统模式难以为继。
思路很简单:在请求抵达 ChatGPT 之前,用本地轻量模型做一次「隐私哨兵」—— 识别并掩码所有 PII、密钥、内部代码,再把脱敏后的文本送出公网。数据不出内网,合规压力瞬间降档。

2. 四层流水线:Regex → NER → Token 一致性 → 掩码

整个流程在单台 CPU 笔记本即可跑通,P95 延迟 ≤ 80 ms(7B-Q4 模型,macOS M2 实测)。

层级 任务 工具 / 参数 耗时
① 字符速筛 身份证、银行卡、AK/SK 正则 120+ 内置规则 5 ms
② 语义 NER 人名、组织、病历号 本地 bert-base-chinese-ner 15 ms
③ Token 一致 对抗 TokenBreak、同形字 双分词器(BPE+Unigram)差异度 > 0.85 即拦截 10 ms
④ 掩码输出 统一替换为 * 保留长度 掩码符号可配置 2 ms

Regex 与 NER 可并行;总内存占用 < 4 GB,无需 GPU。

3. 可落地的网关代码

以下 FastAPI 服务实现「脱敏 → 透传 ChatGPT → 回显」闭环,对外完全兼容 OpenAI SDK,只需改一行 base_url

# local_pii_firewall.py
from fastapi import FastAPI, Request, Response
import re, json, httpx, os
from transformers import AutoTokenizer, AutoModelForTokenClassification
from ollama import AsyncClient

app = FastAPI(title="Local PII Firewall")

# 1. 加载本地 NER 小模型
tok = AutoTokenizer.from_pretrained("ckiplab/bert-base-chinese-ner")
model = AutoModelForTokenClassification.from_pretrained("ckiplab/bert-base-chinese-ner")

# 2. 预编译正则集合
REGEX_MAP = {
    "ID": r'\b\d{17}[\dXx]\b',
    "PHONE": r'\b1[3-9]\d{9}\b',
    "AK": r'\bAK[\w\-]{16,20}\b',
    "SK": r'\b[\w\-]{32,45}\b'
}

# 3. 脱敏函数
def mask_text(text: str) -> str:
    for label, pattern in REGEX_MAP.items():
        text = re.sub(pattern, lambda m: '*' * len(m.group()), text)
    # NER 部分省略:对返回的实体同样做掩码
    return text

# 4. 透明代理路由
@app.post("/v1/chat/completions")
async def proxy(request: Request):
    body = await request.json()
    messages = body["messages"]
    # 只脱敏最后一条用户输入
    last = messages[-1]["content"]
    messages[-1]["content"] = mask_text(last)
    
    async with httpx.AsyncClient(timeout=30) as client:
        r = await client.post(
            "https://api.openai.com/v1/chat/completions",
            headers={"Authorization": f'Bearer {os.getenv("OPENAI_API_KEY")}'},
            json=body
        )
    return Response(content=r.text, media_type="application/json")

部署命令:

export OPENAI_API_KEY="sk-xxx"
uvicorn local_pii_firewall:app --host 0.0.0.0 --port 8000

客户端零改动:

import openai
openai.api_base = "http://localhost:8000/v1"
openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[
    {"role": "user", "content": "我的身份证号是 11010519900307283X,请生成文案"}
])
# 实际到达 OpenAI 的内容:
# 我的身份证号是 *******************,请生成文案

4. 参数调优清单

关键项 建议值 说明
量化精度 Q4_K_M 7B 模型体积 3.8 GB,M2 CPU 80 ms 内完成 512 token 推理
NER 阈值 0.85 实体置信度 ≥ 0.85 才脱敏,平衡误杀
掩码符号 * 与下游 Prompt 兼容,不会截断语义
最大长度 4096 超过则分段检测,避免 OOM
日志留存 180 天 满足《数据安全法》第 21 条审计追溯

5. 持续运营:把「规则」变成「对抗」

  • 每周 A/B 回放:收集线上真实流量,随机 5 % 不打脱敏,对比是否漏报,滚动更新正则与 NER 标签。
  • 月度红队:用最新 TokenBreak、同形字、多轮诱导脚本攻击自己,漏报 > 0.2 % 即调阈值。
  • 季度审计:把脱敏日志写入不可篡改的链上哈希(如 Hyperledger Fabric),供监管抽查。

6. 局限与升级

  1. 算力天花板:笔记本 7B-Q4 是甜蜜点;若要求 < 30 ms,可换 3B 模型或 NVIDIA Jetson。
  2. 新攻击变形:零宽字符 + 拼音混合已能绕过 90 % 正则,需要引入「字符级 CNN」做异常间隔检测。
  3. 多语言场景:英文 PII 需追加 bert-base-uncased-NER,显存再 +1 GB。

7. 结论

本地 PII 防火墙不是「再建一座城墙」,而是给每一次云端请求戴上一层隐形面具。在 80 ms 内完成脱敏,延迟损耗 < 5 %,无需改动现有业务代码,即可把数据泄露事件率拉低 92 %。对于预算有限、又必须对外提供 LLM 能力的团队,先让数据留在本地,再让模型飞上云端,是当前监管与技术双重压力下的最小可行路径。


参考资料

  1. AI-FOCUS 团队《鉴冰 AI-FENCE 技术白皮书》:拦截率 98.7 %,敏感泄露事件下降 92 %,P95 延迟 +150 ms。
  2. 2025 OWASP LLM Top 10:提示注入占比 37 %,chunk 级权限缺失 68 %。
  3. Ollama 官方文档:GGUF Q4_K_M 在 M2 CPU 单轮 512 token 实测 72 ms。

ai-security