不要把五类信息都叫 Memory
“记住用户”“恢复任务”“知道公司政策”看起来都需要 Memory,实际上分别涉及长期偏好、Run Checkpoint 和企业知识。名称含糊会直接造成错误存储选型:用向量库保存订单状态、用聊天记录恢复 Tool 副作用、用摘要替代审计日志,都会让一致性和责任变得不可证明。
| 类别 | 回答的问题 | 权威源 | 典型写入者 | 一致性 |
|---|---|---|---|---|
| 业务状态 | 现实业务现在是什么 | 领域系统/数据库 | 受控业务服务 | 按风险强一致或显式版本 |
| Run 状态 | 这次执行到哪里 | Runtime Checkpoint/Journal | 编排 Runtime | 步骤边界一致、可恢复 |
| 对话记录 | 各方说过什么 | 追加式消息记录 | 用户、模型、系统 | 排序、去重、可追溯 |
| Memory | 未来可能复用什么 | 受治理的 Memory Store | 规则/用户确认/提炼任务 | 可最终一致,但要版本与纠错 |
| 组织知识 | 企业认可的材料是什么 | 原文系统及其 Owner | 内容生产流程 | 索引可延迟,来源必须可追溯 |
业务状态
订单、审批、余额、工单和权限是领域事实。Agent 可以请求变更,但必须通过领域服务读取和提交,不能修改一段 Memory 后就声称业务已变化。
Run 状态
Run 状态包含 Step、待处理 Tool、幂等键、预算、审批和 Checkpoint。它为恢复负责,不能只依赖对话“推测执行到了哪里”。
对话记录
对话是交互证据,可能包含错误、撤回、模型猜测和过时信息。保留角色、顺序、附件引用和删除状态,派生摘要另存。
经验与偏好
Memory 是为未来决策优化的派生资产,例如用户确认的表达偏好、长期项目约束或经过验证的失败模式。它的价值来自选择性,而不是无限保存。
组织知识
文档、数据库、图谱和代码构成知识来源,索引只是它们的检索投影。文档 Owner 和源版本决定权威性,Embedding 相似度不决定事实真伪。
每类信息只能有明确权威源
“只能有一个权威源”不意味着只能有一个副本,而是任何冲突都能依据 Owner、版本和更新协议收敛。对话摘要、搜索索引、缓存、Eval 数据和 Trace 可以复制业务信息,但必须声明是派生视图,不能反向覆盖源系统。
写路径与读路径要分开。用户在聊天中说“把订单地址改为北京”是一条意图,不是订单状态;领域服务成功返回新的版本号后,才产生权威事实。Memory 可以记录“用户经常使用北京地址”,但下一次下单仍需当前对象确认。
信息作用域决定可见性
常见层级包括单步、Run、会话、用户、团队、租户和全局。作用域不是方便检索的标签,而是访问控制和污染隔离的一部分。个人偏好不能自动升级为团队政策,单个失败样本也不能未经验证写成全局程序性 Memory。
// Memory/知识对象的作用域必须进入主键和鉴权,而非仅放在可选 metadata
type ScopedRecord = {
tenantId: string
namespace: 'run' | 'conversation' | 'user-memory' | 'team-knowledge'
subjectId: string
recordId: string
sourceVersion: string
classification: 'public' | 'internal' | 'confidential'
}
function canRead(record: ScopedRecord, actor: { tenantId: string; subjectIds: Set<string> }) {
return record.tenantId === actor.tenantId && actor.subjectIds.has(record.subjectId)
}
子 Agent 默认只获得完成委派所需的切片,并携带委派方、目的和有效期。共享缓存键、向量索引过滤、Reranker 输入和 Trace 都要继承作用域;只在最终答案阶段过滤已经太晚。
生命周期与用途绑定
保留时间应由用途、法律、风险和纠错需求共同决定,而不是统一“保存 30 天”。临时 Tool 输出可能只需存到 Run 完成;审批证据可能依法长期保留;用户偏好应支持撤回;企业知识索引随源文档版本变化。
删除是一条传播工作流。删除源记录后,还要处理消息摘要、Embedding、倒排/向量索引、缓存、Checkpoint、Trace、评测集、导出和备份。某些副本因为合规留存不能立即物理删除时,应限制用途与访问,并记录法律依据。GDPR 第 17 条同时规定删除权与若干例外,因此“用户一要求就删所有数据”与“备份不能删所以不处理”都过度简化;具体适用仍应由法务判断。
| 阶段 | 必须记录 | 失败信号 |
|---|---|---|
| 请求受理 | 主体、范围、法律/政策依据 | 无法定位数据主体 |
| 传播 | 所有派生系统、任务 ID、截止时间 | 索引仍返回、缓存仍命中 |
| 验证 | 每个系统的删除或限制证明 | 只收到“任务已提交” |
| 持续防回流 | 源 Tombstone、重建过滤、备份策略 | 索引重建后数据复活 |
一致性需求按业务风险分级
所有信息强一致既昂贵也没有必要。业务状态根据金额、不可逆性和并发风险使用事务、乐观锁或事件版本;Run 状态在副作用边界前后可靠落盘;消息记录允许追加但要用事件 ID 去重;Memory 可异步整合,却必须让旧版本可识别;知识索引允许短暂滞后,但查询结果必须携带源版本与索引时间。
并发写入必须有冲突语义。两次并发对话可能同时更新同一用户偏好。Last-write-wins 只有在信息确实可覆盖时才合理;“偏好素食”和“对花生过敏”不能互相覆盖。使用字段级版本、来源证据和合并规则;高影响冲突进入人工确认。
用数据流审查越界
边界 Review 不止画数据库。沿一次请求追踪:浏览器输入经过 API、日志、模型 Provider、Tool、缓存、索引、Trace 和 Eval 管道,会生成哪些副本;每个节点的地域、Owner、保留和授权是什么;导出、失败重试与删除时谁容易漏掉。
- 入口:采集目的、用户可见说明与数据分类是否明确;
- 传输:哪些字段离开当前信任域,是否最小化和加密;
- 处理:摘要、Embedding、标注等派生物是否继承分类;
- 共享:其他 Agent、租户、评测和人工 Review 能看见什么;
- 退出:Run 失败、用户删除、租户关闭后所有副本如何收敛。
分类级实践应产出一份数据流图和矩阵,而不是只写政策。越界测试至少覆盖:伪造租户 ID、跨用户相似检索、缓存键缺少租户、子 Agent 收到多余上下文、删除后索引重建复活数据。
架构判断:Memory Store 与知识向量库能否共用一张表?
验收证据:删除功能为何不能只测主数据库查不到?
资料与事实边界
以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。
- OpenAI:Data controls in the OpenAI platform — 不同端点的应用状态保留与 Zero Data Retention 边界;具体行为会变化,使用时核验当前版本
- LangGraph:Persistence — Checkpoint 与跨线程 Store 的职责区分,作为框架实现例证而非通用标准
- EUR-Lex:GDPR Article 17 — 删除权及适用例外的法规原文;具体合规解释需由法务确认
- NIST:AI Risk Management Framework 1.0 — 治理、数据来源、责任与风险管理的参考框架