跳到主要内容

擦除模型仍在读取的上下文:数据保留策略带来的隐患

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个每晚运行的数据留存 worker(retention worker)会删除任何超过 30 天的用户消息。一个从 3 月初开始的长周期企业支持会话,到 5 月底仍然处于活跃状态。在第 41 轮对话请求进来时,你的 Prompt 组装器(prompt assembler)从同一个消息表中读取数据,而那个留存 worker 一直在悄悄地清理这个表。第 1 到 28 轮已经消失了。模型接收到的对话是从第 29 轮开始的,没有任何信号表明之前的对话曾经存在过。用户问道:“我们之前商定的 SLA 是什么?”模型自信地编造了一个数字,因为真正的答案在第 4 轮——而留存 worker 在前一天晚上把它删除了。

这不是模型故障。模型完全按照其应有的方式运行:从交给它的上下文中生成一个看似合理的答案。故障发生在更上游,处于两个团队之间的鸿沟中——每个团队都认为自己拥有消息表。

消息表是两个不同的东西

如果你问隐私或安全团队消息表是什么,他们会告诉你这是一个受留存策略约束的用户数据存储。留存策略规定:任何超过 30 天的数据,删除。Worker 每晚运行,策略得到执行,合规仪表板显示为绿色。

如果你问 AI 平台团队消息表是什么,他们会告诉你它是上下文窗口(context window)。Prompt 组装器在请求时读取它,用目前的对话内容填充模型,并让模型继续对话线索。

两个团队对表的理解在各自看来都是正确的。但没有一个团队真正理解这个表本质上是什么:它是一个多消费者数据集,其生命周期现在受策略最激进的团队管辖。留存团队拥有删除密钥。Prompt 组装只有读取路径。因此,留存团队默认赢得了每一次冲突——这种冲突在请求时表现为幻觉,而不是在删除时表现为错误。

这种不对称性至关重要,因为留存团队永远不会看到这个 bug。他们运行每晚的任务,行被删除,他们的 SLO 得到了满足。只有当有人通过 Prompt 构建路径重新读取现在已被截断的对话时,bug 才会出现,而这种读取发生在另一个系统中,由另一个团队负责,并针对不同的指标进行监测。这两个团队处理的是相同的数据,但他们的遥测(telemetry)数据直到客户投诉前都不会产生交集。

为什么模型无法察觉历史记录缺失

直觉上会将问题推给模型:“模型应该注意到对话是从中间开始的,并要求澄清。”但由于结构性原因,这行不通。模型无法知道第 1 到 28 轮曾经存在过。Prompt 组装器构建了一个上下文数组并交给模型,模型对世界的看法就是该数组中的任何内容。这里没有“轮次已删除”的标记,因为组装器从未放过这种标记。组装器只是按要求做事:从消息表中读取,将返回的任何内容格式化为对话,发送给模型。

从模型的角度来看,一个从第 29 轮开始的会话与一个从第 29 轮开始的会话是无法区分的。编号是你的记账方式,而不是模型的。如果你的组装器将轮次重新编号为从 1 开始,甚至连你的遥测系统都无法标记这种截断。模型对一个它从未见过的轮次中讨论过的 SLA 给出的自信回答,在通俗意义上并不是幻觉——它是模型在你提供的输入以及这些输入所暗示的对话框架下,成功完成了你交给它的任务。

这就是为什么在模型内部修复它是错误的举动。模型不是知道对话被截断的那一层。组装器才是。组装器是观察到“预期第 1 轮”与“实际最旧行是第 29 轮”之间差异的地方。这种观察必须在到达模型之前转化为信号,否则信号将永远丢失。

两个团队的问题

我见过的几乎每一个遇到这个 bug 的团队都有相同的组织架构。隐私和安全团队拥有数据仓库、留存 worker 和删除审计。AI 平台团队拥有 Prompt 组装器、推理路径和评估套件。他们位于不同的子部门,发布节奏也不同。他们有独立的事件频道,有独立的路线图。

从任何合理的责任划分来看,数据留存都属于隐私范畴。如果数据存放时间过长,他们是承担监管风险的人。他们也是知道哪些字段是敏感的、哪些司法管辖区需要更短的期限、哪些合同需要明确的按租户删除窗口的人。将数据留存交给 AI 平台团队将是一个更糟糕的结果。

实际的问题在于,留存被视为存储的一个属性,而不是读取路径的一个属性。留存 worker 对于该行已超过其期限的判断是正确的。但留存 worker 认为删除它是安全的判断是错误的,因为这里的“安全”意味着“不再有消费者依赖该行”,而 Prompt 组装器是一个无人告知留存 worker 的消费者。组装器是在留存策略制定多年后才加入该表的。删除路径从未更新以适应新的消费者。

这种破坏力之所以会叠加,是因为聊天记录留存正是那种设置一次后就会被遗忘的策略。它很可能是在“消息表”意味着“向阅读工单的代理显示的支持 UI 内容”时编写的。显示类消费者可以优雅地容忍截断——代理只是看到一个较短的对话线索。Prompt 消费者则不然,因为他们会将截断通过一个随机过程处理,并用看似合理的虚构内容填补空白。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates