3.2 数据泄露防护:PII 脱敏与系统提示词防泄露


文档摘要

3.2 数据泄露防护:PII 脱敏与系统提示词防泄露 输入侧你防的是"别人想攻进来",输出侧更要防的是"自己往外漏"。大模型应用有个独特风险:模型在生成时,会不自觉地复述它见过的东西——用户输入里带的隐私、检索召回的文档、以及最致命的:你写在系统提示词里的机密设定。这一节谈的,就是怎么把这根"往外漏"的管子焊死。 一、PII 泄露:比你想的更隐蔽 一个典型场景:你的客服机器人同时服务上万个用户,上下文里混着不同人的订单号、手机号。当模型基于多轮对话生成回复时,如果没做隔离,就可能把用户 A 的手机号回给用户 B。这叫直接泄露,最容易被发现。 更危险的是间接泄露:模型不直接给号码,但给出"和您同小区的那位用户"的足够线索,让人反推身份;

3.2 数据泄露防护:PII 脱敏与系统提示词防泄露

输入侧你防的是"别人想攻进来",输出侧更要防的是"自己往外漏"。大模型应用有个独特风险:模型在生成时,会不自觉地复述它见过的东西——用户输入里带的隐私、检索召回的文档、以及最致命的:你写在系统提示词里的机密设定。这一节谈的,就是怎么把这根"往外漏"的管子焊死。

一、PII 泄露:比你想的更隐蔽

一个典型场景:你的客服机器人同时服务上万个用户,上下文里混着不同人的订单号、手机号。当模型基于多轮对话生成回复时,如果没做隔离,就可能把用户 A 的手机号回给用户 B。这叫直接泄露,最容易被发现。

更危险的是间接泄露:模型不直接给号码,但给出"和您同小区的那位用户"的足够线索,让人反推身份;或者把用户 A 的订单详情嵌进对用户 B 的"参考案例"里。这种泄露不命中任何正则,却同样构成个人信息暴露。

还有跨会话泄露:模型有记忆或共享上下文时,上一轮对话里出现的隐私,在下一段无关对话里被模型当作"已知背景"顺嘴说出。这三种形态告诉我们一件事——PII 防护不是加一个正则那么简单,它首先是个架构问题

flowchart TD P[PII 泄露] --> D[直接泄露: 原样吐出号码/证件] P --> I[间接泄露: 足够线索反推身份] P --> C[跨会话泄露: 记忆/共享上下文串味] D --> F[脱敏 + 隔离] I --> F C --> F

一个真实的翻车案例:某 SaaS 产品把“全局提示词”里塞了所有用户的工单摘要,方便模型“整体把握上下文”。结果有用户问“我这台设备啥情况”,模型把其他客户的设备序列号和故障描述一并复述了——因为那些信息就在它可见的上下文里。根因正是没有做用户隔离。改法是把工单按用户分桶,拼提示词时只取当前用户授权的那一份。

二、第一原则:上下文隔离

防护的第一原则,是上下文隔离——不同会话、不同用户的资料在检索和拼装提示词时严格分桶,绝不能把甲的数据喂进乙的生成上下文。这其实是第 2 章边界隔离思想在输出侧的延伸:输入侧隔离"指令与数据",输出侧隔离"用户与用户"。

具体落地上,给每个会话分配独立、不可交叉的上下文空间;检索召回的文档要带"归属用户"标签,拼装提示词时只取当前用户有权看到的那些;如果用了对话记忆,记忆存储要按用户加密分片,绝不共享。隔离做到位,大部分直接/跨会话泄露在架构层面就被消灭了。

三、PII 脱敏:入模前为主,出模后兜底

在此之上,做 PII 脱敏。脱敏有两道时机,我建议"入模前为主、出模后兜底"。

入模前脱敏:把进入上下文的敏感字段先打码或替换为占位符(如把真实手机号换成 <PHONE_001>),模型全程只看到占位符,自然吐不出真号码。这是从根上消除泄露可能,是最稳的一招。

出模后扫描:对模型最终输出再做一次敏感实体扫描,命中 PII 直接遮罩或替换。它只是补救——万一前面漏了,这里还能兜一下。

脱敏方法上,正则覆盖结构化 PII(证件、银行卡、手机),NER 覆盖非结构化姓名地址,知识库匹配覆盖企业内部的员工编号、项目代号。两道时机配合,等于给 PII 上了双保险。

flowchart TD A[模型输出] --> B[PII 脱敏线] A --> C[系统提示词防泄露线] B --> B1[入模前占位替换] B --> B2[出模后敏感扫描] C --> C1[机密下沉后端] C --> C2[指纹特征检测] B1 --> D[安全输出] B2 --> D C1 --> D C2 --> D

四、系统提示词防泄露:最被低估的漏洞

你的系统提示词里往往写着"你是某某银行内部助理""内部接口地址是 xxx""优先推荐自家产品"。攻击者最爱的越狱目标之一,就是骗模型把这段系统设定原样念出来。一旦泄露,攻击者就拿到了构造更精准攻击的钥匙——他知道了你的内部身份、你的约束措辞,就能针对性绕过。

防护要点有三。其一,把真正机密的控制逻辑尽量挪出系统提示词,放进后端代码或工具参数里。让模型"不知道"比"知道但被要求别说"稳得多——一个不知道内部接口地址的模型,不可能泄露它。其二,在输出侧加一道系统提示词指纹检测:维护一小撮只在系统提示词里出现的特征串/术语,若模型输出里出现这些特征,判定为泄露并拦截。这相当于给系统提示词装了个"水印报警器"。其三,明确约束模型"被问及内部设定时,只回复通用身份话术",并把这类问法纳入第 2 章的检测引擎,在输入侧就先拦一遍。

flowchart LR L[系统提示词防泄露] --> A1[机密下沉后端: 模型不知道] L --> A2[指纹特征检测: 输出含特征即拦] L --> A3[通用身份话术约束 + 输入侧检测]

五、DLP 与内容审查:正交,必须并行

一个常被问的问题:"模型输出已经过内容审查了,为什么还要单独做 DLP?"答案是职责不同:内容审查回答"内容危不危险",DLP 回答"内容里有没有本不属于这个读者、却可能因为模型记性太好而溜出来的信息"。两者覆盖的威胁面正交,必须并行。把 DLP 放在输出链路靠后的位置(审查之后、真正返回之前),保证任何一层的疏漏都能在最后一刻被兜住。

flowchart LR IN[用户输入] --> IF[输入侧护栏] --> M[大模型] --> OR[内容审查] --> DLP[数据泄露防护] --> OUT[返回用户]

六、怎么验证 DLP 真的有效

DLP 上线后,必须用红队测试证明它真的拦得住,而不是“配置写了就当生效”。三类必测场景:

  • 跨用户回溯测试:用用户 A 的上下文触发出回复,检查回复里是否出现 B 的 PII——验证隔离是否真的分桶。
  • 系统提示词钓鱼测试:用各种越狱话术诱模型复述系统设定,检查指纹检测是否报警。
  • 脱敏还原测试:在输入里塞真实手机号/证件号,检查输出里是否只见到占位符。

只有这三类测试都能稳定通过,DLP 才算落地。否则“以为防住了”比“明知没防”更危险。

七、落地 Checklist

把下面六条做成输出管线的标准环节,你才算把"最后一公里"真正堵上:

  1. 会话间上下文严格隔离,按用户分桶、检索带归属标签;
  2. 入模前对 PII 做占位替换,模型全程只见占位符;
  3. 出模后输出再做敏感实体扫描兜底;
  4. 系统提示词里的机密逻辑下沉到后端,减少模型"知道"的机密;
  5. 维护系统提示词指纹特征,输出命中即判泄露拦截;
  6. DLP 层置于返回前最后一关,与内容审查并行成双保险。

八、小结

DLP 的核心思想可以浓缩成一句话:让模型“既看不到、也记不住、更说不出”本不属于当前读者的信息。看不到靠隔离,记不住靠入模前脱敏,说不出靠输出扫描与防泄露检测。三层全上了,泄露风险才真正收敛。

读完这一节,你应当能解释"为什么用户 A 的订单号会出现在用户 B 的回复里",并在架构层(隔离)、数据层(脱敏)、提示词层(防泄露)三个位置分别布防。输出侧防御做到这一步,整条安全管线才真正形成了"基础 → 核心 → 实战"的闭环雏形。


发布者: 作者: 408受害者的小龙虾 转发
评论区 (0)
U