Learn
RAG/23-privacy-compliance

隐私与合规

RAG 要把企业文档喂给模型和向量库,天然触碰数据合规红线。本章讲如何在不泄密的前提下把 RAG 用起来。

1. 三类典型风险

风险1 数据出域: 内部文档上传到第三方 API,违反「数据不出域」
风险2 越权访问: 普通员工通过问答看到本无权查看的机密
风险3 残留泄露: 敏感字段未脱敏就进索引,被检索原文直接暴露

2. 数据不出域

  • 私有化部署:模型与向量库都跑在自有机房 / 专有云,文档不离开边界。
  • 本地向量库:用自托管 Milvus / pgvector,而非把数据存进第三方托管库。
  • 网关审计:所有对外 API 调用经内网网关,留全量日志。
ℹ️合规前提:谁的数据在哪里

先画一张数据流向图:文档从哪来、存哪、被谁处理、发往哪个模型。任一段落到外部,都要有书面授权。

3. 脱敏与红线过滤

入库前对敏感字段做识别与脱敏:

import re
def mask(text):
    text = re.sub(r"\d{17}[\dXx]", "[身份证号]", text)   # 身份证
    text = re.sub(r"1[3-9]\d{9}", "[手机号]", text)        # 手机号
    return text
 
chunk_clean = mask(raw_chunk)   # 脱敏后再切分、嵌入、入库

也可在生成侧加输出过滤,防止模型「吐回」残留敏感信息。

4. 权限隔离(基于属性的检索)

检索时带上用户权限,只召回其可见文档:

hits = store.search(
    vec,
    k=5,
    filter={"dept": user.dept, "level": {"<=": user.clearance}},
)
⚠️别只在展示层过滤

只在生成后「隐藏答案」不够——检索阶段就可能把机密片段送进 Prompt。权限过滤必须下沉到检索查询本身。

5. 审计与留存

  • 记录每次问答的「用户、问题、命中文档、是否含敏感标记」
  • 对高敏感库启用水印与访问告警
  • 保留期符合行业监管要求(如金融、医疗)
💡脱敏 + 行级权限双保险

脱敏防「内容泄露」,行级权限防「越权获取」。两者叠加,再配合审计,基本覆盖企业合规三要素。

🎯练习

为你所在系统的文档分级(公开/内部/机密),给检索查询加上对应 filter,并写一条脱敏规则覆盖你业务里最敏感的一类字段。

小结

  • 三类风险:数据出域、越权访问、残留泄露
  • 数据不出域靠私有化部署 + 本地向量库 + 网关审计
  • 入库前脱敏,检索查询下沉行级权限过滤
  • 全程审计留存,满足行业监管要求
  • 下一章看向量库自身的生产运维要点 →