边缘隐私过滤
边缘隐私过滤:Claude-Mem 的具体实现
学习目标
本章聚焦 Claude-Mem 如何在数据管道入口点实现隐私过滤。建议先阅读前置知识,下文直接聚焦具体落地方案。
前置知识
本章涉及边缘隐私过滤的通用原理,建议先阅读:
- 边缘隐私过滤 — 标签协议设计与边缘处理哲学
项目实践
标签剥离工具
src/utils/tag-stripping.ts 提供了共享的标签剥离工具函数。剥离逻辑在 Hook 层执行,确保敏感内容永远不会到达 Worker Service 或数据库。
实现位置
标签剥离发生在以下 Hook 中:
| Hook | 触发时机 | 剥离对象 |
|---|---|---|
PostToolUse | 工具使用后 | 工具输出中的 <private> 内容 |
UserPromptSubmit | 用户提交 prompt 前 | 用户消息中的 <private> 内容 |
隐私范围
被 <private> 标签包裹的内容:
- 不会被记录为观察(observation)
- 不会被写入会话摘要(summary)
- 不会被注入到新会话的上下文中
- 不会出现在时间线中
用户级隐私控制
隐私过滤是用户主动的、手动的控制机制。AI Agent 无法判断哪些内容敏感,因此依赖用户在消息中显式标记。这与自动化的 PII 检测不同:
- 优势:用户有完全控制权,不会误判
- 劣势:需要用户自觉标记,遗漏的内容会被正常存储
问题与规避
嵌套标签处理
问题:如果 <private> 标签嵌套在其他 XML 标签中(如 <observation><private>...</private></observation>),简单的字符串替换可能留下残留的 XML 标签。
规避:剥离工具使用正则匹配 <private>...<\/private> 模式,包括标签之间的所有内容,确保完整移除。
设计取舍
为什么不在 Worker 层也做剥离?
Worker 层也有自己的内容处理逻辑,但隐私过滤只在 Hook 层执行:
- 原因:Hook 层是最早的数据入口点,在此剥离可以最小化敏感数据的传输路径。如果等到 Worker 层再剥离,数据已经通过 HTTP 传输到了 Worker 进程,增加了暴露面。
- 防御纵深:Hook 层的剥离是主要防线,Worker 层可以作为额外的防御纵深(如果实现),但不应依赖。