跳转到主要内容

机构记忆:Agent 应该记住什么,又必须忘记什么

持久化的 agent 记忆只有在具备来源追溯和过期机制时才有用;无限制的召回会让上下文存储变成一种没有审计轨迹的负担。

Detailed close-up of a high-tech white robot in a studio setting with a gray background.

记忆是记录,不是缓存

缓存针对命中率进行优化。记录针对可问责性进行优化。大多数 agent 记忆系统按缓存的方式构建,却被要求表现得像记录,这就是为什么它们会在从未设计通过的审计中失败。

Agent 保留的每一条目在写入之前都应携带四个字段:来源(哪次交互、文档或工具调用产生了它)、时间戳(它被观察到的时间,而不是被嵌入的时间)、所有者(哪个用户、租户或服务对它负责)以及保留理由(它预期为哪个具体的未来决策提供依据)。缺少这四项,存储就只是一堆没有可辩护含义的向量。如果一次检索返回了一条偏好,而你无法说明这条偏好从何而来、是否仍然适用,那么它在复核中就毫无用处。

摘要丢失来源追溯的速度最快。当一段长的情节轨迹被压缩成一段文字时,压缩步骤会丢弃指回原始轮次的链接。摘要是最有可能被检索、也最难在事后辩护的产物,因为支撑其主张的证据已经被丢弃了。因此,摘要应被视为一条带有自身来源指针的派生记录,而不是它所来源的轨迹的替代品。如果指针缺失,摘要就不是记忆;它是一条无归属的断言。

实践中的保留策略

首先要做的区分是情节轨迹与持久事实。情节轨迹是一次运行期间发生的事情:工具调用、中间推理、检索到的文档、部分结果。持久事实是应当在该次运行之后存续的内容:一条已确认的偏好、一个已解析的标识符、一项被应用并接受的策略。只有第二类才属于长期记忆。其他一切都应限定在会话范围内,并在会话关闭时丢弃。

A vibrant close-up image of an arcade joystick and buttons, capturing a retro gaming mood.

默认过期,经复核后晋升。新条目以较短的存活时间和较低的信任权重进入。晋升为持久状态是一个显式事件,而不是自动事件。在实践中,这意味着写入路径如下所示:

memory.write(
    key="shipping.preference",
    value="carrier_a",
    source="interaction:4821",
    observed_at="2025-01-14T09:12:00Z",
    owner="tenant:acme",
    reason="applied in checkout flow",
    ttl="P30D",
    trust="provisional",
)

trust 字段就是那个杠杆。临时条目可以被检索用于提供上下文,但不得用于做出不可逆的决策。晋升为 confirmed 需要第二次观察或一次显式的用户操作,而且晋升本身也会被记录。这是一个诚实的权衡:更严格的晋升规则会降低 agent 看起来能记住东西的比率,因为能通过门槛的条目更少了。另一种选择是得到一个自信地回忆起从未属实之事的存储。

删除必须传播到派生的摘要和嵌入,而不仅仅是主存储。这正是大多数实现发生泄漏的地方。一条记录从键值存储中被删除,但引用它的摘要仍然存在,编码其含义的嵌入也仍然留在向量索引中。从 agent 的角度看,该事实仍然存在,因为检索是在派生产物上进行的。传播必须成为一等操作:当一条记录被删除时,每一条引用它的摘要都被作废,每一个由它派生的嵌入都被移除或重新计算。没有这一点,删除只是一种姿态,而不是一种保证。

过时的偏好被自信地应用于新上下文

在一种上下文中观察到的偏好,并不是适用于所有上下文的策略。一个记得用户偏好简短回答的 agent,可能会把这一偏好应用到完整性至关重要的法律复核中。失败之处不在于记忆是错的;而在于记忆没有作用域。来源追溯在这里有帮助,因为来源和时间戳让检索层能够追问:这条偏好是否是在可比的条件下形成的。没有作用域的记忆会被应用到所有地方,而 agent 恰恰会在最没有依据的地方显得最自信。

缓解办法是为每一条持久事实附加一个作用域:领域、任务类型以及它被观察到时所处的条件。检索随后先按作用域过滤,再按相关性排序。这会牺牲召回率,而这种代价是真实的。带有作用域记忆的 agent 有时会无法应用一条人类本会正确泛

Interior view of an automated beverage bottling factory with machinery and conveyor belts.

当单个记忆命名空间服务众多用户时,按语义相似度进行的检索最终会把一个租户的数据暴露给另一个租户。这不是一种微妙的失败;它是一种结构性失败。相似度搜索没有租户概念,除非租户隔离是在搜索之前而非之后强制执行的。在检索之后过滤结果是不够的,因为嵌入索引可能已经把内容暴露给了排序步骤,而且应用在错误层级的过滤器在重构中很容易被遗漏。

有效的机制是在存储层进行命名空间隔离,把租户作为键的一部分,而不是查询上的一个谓词。每一次读写都限定在某个租户分区内,跨分区读取在构造上就不可能,而不是靠约定来避免。这样运营成本更高,因为它会使索引数量成倍增加,并使全局分析更加困难。这就是权衡:隔离牺牲了运营上的简洁性,而另一种选择牺牲的是正确性。

这对 agent 设计意味着什么

记忆不是给 agent 添加的一项功能;而是你强制执行的一项策略。该策略必须为每一条保留的条目回答:它从何而来、归谁所有、为何保留以及何时过期。摘要和嵌入是派生记录,继承其来源的义务。删除只有在传播到每一种派生形式时才有意义。

实际后果是,记忆系统应围绕删除和复核来设计,而不是围绕累积来设计。一个记得更少但能为其所记内容提供正当理由的 agent,在生产中比一个回忆起一切却什么都解释不了的 agent 更有用。审计轨迹不是额外开销;正是它让记忆足够可信,从而可以据其行动。

延伸阅读

封面照片:panumas nikhomkhai / Pexels。

分享XLinkedIn永久链接5 分钟阅读

相关阅读

这能回答的问题

Why does an agent need provenance on every memory item?

Without a source, timestamp, owner and retention reason, a retrieved memory cannot be defended in review. Provenance is what turns a stored value into an accountable record.

What is the difference between episodic traces and durable facts?

Episodic traces record what happened during a run and should be discarded when the session closes. Durable facts are confirmed items that should survive the run and inform future decisions.

Why must deletion propagate to summaries and embeddings?

Retrieval operates on derived artefacts. If a summary or embedding still encodes a deleted record, the fact remains effectively present, so deletion must invalidate every derived form.

How should cross-tenant memory bleed be prevented?

By enforcing tenancy at the storage layer, with the tenant as part of the key rather than a filter applied after retrieval. Post-retrieval filtering is too easy to omit or misapply.