架构不变量Context 不是存储,摘要不是事实,向量索引不是权限系统,模型输出不是业务状态。每类信息必须能回答:谁拥有真值、谁可以修改、何时过期、如何删除。

不要把五类信息都叫 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 候选。
Context按当前任务投影的短生命周期输入。

写路径与读路径要分开。用户在聊天中说“把订单地址改为北京”是一条意图,不是订单状态;领域服务成功返回新的版本号后,才产生权威事实。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 可异步整合,却必须让旧版本可识别;知识索引允许短暂滞后,但查询结果必须携带源版本与索引时间。

一致性陷阱“向量库最终会更新”不是权限变更的可接受答复。撤权和租户隔离属于安全控制,应使用查询前确定性过滤、同步 Tombstone 或阻断相关分区,而不是等待重新 Embedding。

并发写入必须有冲突语义。两次并发对话可能同时更新同一用户偏好。Last-write-wins 只有在信息确实可覆盖时才合理;“偏好素食”和“对花生过敏”不能互相覆盖。使用字段级版本、来源证据和合并规则;高影响冲突进入人工确认。

用数据流审查越界

边界 Review 不止画数据库。沿一次请求追踪:浏览器输入经过 API、日志、模型 Provider、Tool、缓存、索引、Trace 和 Eval 管道,会生成哪些副本;每个节点的地域、Owner、保留和授权是什么;导出、失败重试与删除时谁容易漏掉。

  1. 入口:采集目的、用户可见说明与数据分类是否明确;
  2. 传输:哪些字段离开当前信任域,是否最小化和加密;
  3. 处理:摘要、Embedding、标注等派生物是否继承分类;
  4. 共享:其他 Agent、租户、评测和人工 Review 能看见什么;
  5. 退出:Run 失败、用户删除、租户关闭后所有副本如何收敛。

分类级实践应产出一份数据流图和矩阵,而不是只写政策。越界测试至少覆盖:伪造租户 ID、跨用户相似检索、缓存键缺少租户、子 Agent 收到多余上下文、删除后索引重建复活数据。

架构判断:Memory Store 与知识向量库能否共用一张表?
物理上可以,但逻辑边界必须独立:不同 Owner、作用域、写入资格、保留、冲突和删除协议。若共用导致查询漏加类型/租户过滤,节省的基础设施成本不值得。
验收证据:删除功能为何不能只测主数据库查不到?
还需验证摘要、Embedding、索引、缓存、Trace、Eval、导出和重建流程;否则派生副本仍可能被检索或再次写回。

资料与事实边界

以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。

  1. OpenAI:Data controls in the OpenAI platform — 不同端点的应用状态保留与 Zero Data Retention 边界;具体行为会变化,使用时核验当前版本
  2. LangGraph:Persistence — Checkpoint 与跨线程 Store 的职责区分,作为框架实现例证而非通用标准
  3. EUR-Lex:GDPR Article 17 — 删除权及适用例外的法规原文;具体合规解释需由法务确认
  4. NIST:AI Risk Management Framework 1.0 — 治理、数据来源、责任与风险管理的参考框架