Agent 记忆删除传播:从用户遗忘请求到可验证清除
删除主表一行不会清掉向量、摘要、缓存和恢复后的备份。本文用删除状态机、代际墓碑、派生血缘与端到端 canary 验证真正遗忘。
本文要点
- 主题聚焦:AI、AI Agent、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
用户点击“忘记这件事”后,主库记录消失了,向量索引可能仍能召回;摘要包含同一事实,Redis 还缓存旧 Prompt,夜间恢复备份又会把记录带回来。删除接口返回 204 只证明入口接受了请求,不证明系统已经遗忘。AI 应用数据隐私 给出整体原则,本篇聚焦 Agent 记忆的副本与派生传播。
先冻结身份范围,再执行删除
请求解析为稳定的 (tenantId, subjectId) 或指定 (memoryId, version),不能按姓名、邮箱字符串模糊搜索。控制面创建不含原文的 deletion job,记录请求依据、范围、策略版本和截止时间。只有删除主体全部记忆时才原子递增 subjectEpoch;删除单条记忆只追加精确的 (memoryId, version) tombstone,不能让无关记忆因 epoch 变化全部失效。
REQUESTED -> FROZEN -> DELETING -> VERIFYING -> COMPLETE
| |
+----------> BLOCKED
每个 run 的 lease 绑定读取时的 subjectEpoch 与所有 (memoryId, version) fence。输出、工具和状态 sink 在接受点从线性一致 gate 取得单次 permit;gate 原子核对 fencing token 并登记 in-flight,执行器持有 permit 到边界结束。stale worker 无法绕过 sink,这不是先检查再执行,也不能由 Prompt 代替。
删除在同一 gate 原子关闭 fence;关闭后不再签 permit,并中止模型流、丢弃缓冲 token、撤销未派发工具。主体删除取消全部旧 lease,单条删除只取消引用该版本的 lease。FROZEN 等待已有 permit 取消或 drain;lease TTL 只回收所有权,不算排空。未排空项使 job BLOCKED,不能超时完成。过期 outbox、离线设备和恢复任务也须服从 epoch 或精确墓碑。
删除清单覆盖事实、索引和派生产物
资产注册表为每类存储定义 owner、定位键、删除适配器、最长完成时间和验证查询。至少覆盖版本主表、current 投影、向量与关键词索引、摘要 artifact、Prompt 快照、缓存、队列、导出、分析副本以及供应商存储。只存聚合且无法回推个人的数据可不逐条删除,但判断与证明要记录。
派生产物必须有 derivedFrom 边,控制面才能从源记忆找到摘要和缓存;缺少血缘的旧数据先从读取面整体隔离,再补资产扫描,不能猜测已经清干净。记忆整合血缘 让失效范围可计算,RAG 增量索引一致性 的删除墓碑则可用于索引 worker。
{
"jobId": "del-817",
"scope": "SUBJECT",
"scopeHash": "hmac:41bf7d8ce205a9630f6b147ea29d54c8b31f9062de785ac443f0921cb67e38ad",
"subjectEpoch": 12,
"targets": {
"primary": "DONE:14",
"vector": "DONE:14",
"summaries": "DONE:3",
"cache": "DONE:8",
"backup": "PENDING_EXPIRY:2026-08-17"
}
}
完成证明只保存范围 HMAC、计数、适配器版本、时间和错误码,不复制被删内容。欧盟 GDPR 第 17 条等法规是否适用应由组织的法律与数据治理流程判断,工程系统只负责可靠执行已批准范围。
备份不能假装支持即时逐行擦除
不可变备份通常无法安全修改。策略必须明确最长备份寿命、访问隔离与恢复门:任何恢复环境先加载 deletion journal 和最新 epoch,重放所有墓碑并验证,再允许业务读取。按租户或分区使用独立数据密钥时,可通过销毁密钥实现密码学不可读,但只有在密钥副本、包装密钥和快照路径都纳入清单时才成立。介质处置参考 NIST SP 800-88 Rev. 2,具体云存储能力仍需实测;该文档页面访问于 2026-07-18。
用唯一 canary 做端到端删除验证
在隔离测试租户写入随机 canary,让它经过抽取、向量化、摘要、缓存和备份演练。提交删除后,以 ID 精确查询每个后端,并用多种语义改写做召回测试;预期主记录、索引命中、摘要血缘和缓存均为零,旧 epoch 重放被拒绝。不要在生产日志全局搜索用户原文,那会制造新的敏感副本。
故障测试把 gate 关闭插在 worker 请求与 sink 接受之间,并覆盖模型已读记忆、缓冲 token、排队工具、最终提交前删除、adapter 响应丢失、向量离线和旧备份恢复。关闭后断言零新 permit 与零新接纳;关闭前已获 permit 必须确认取消或到达终态并排空,之后才断言零后续输出、效果与写入。任一 target/permit 未排空时不能 COMPLETE。
上线先对测试租户和内部账号运行,确认完成时延、阻塞率、旧代拒绝数和恢复演练。再按后端逐一纳入硬门禁;没有适配器的存储不得接收新记忆。事故时可以暂停新删除请求或切换 adapter 版本,但不能“回滚”已经完成的用户删除,也不能恢复旧 epoch 的读取。
软件降级到旧版本前必须证明旧服务同样识别 deletion journal 与 epoch;否则保持记忆读取关闭。灾难恢复 不应以复活已删除数据为代价。真正的遗忘以全部副本不可访问、旧事件不可复活、恢复后仍不可见为完成条件,而不是一条数据库 DELETE。
延伸阅读
Related