Agentic Context Management
Agent Memory 要管理的是整个 Context 生命周期
把 Agent memory 视为 ingestion、storage、retrieval、assembly 与治理组成的完整 lifecycle,而不是一个向量库功能。
查看官方论文 ↗READ WITH QUESTIONS
先别急着看答案
读之前,先用自己的话回答一遍。读完以后再回来,看哪一个判断被论文改变了。
- Context lifecycle 的每个阶段分别可能丢掉什么信息或引入什么成本?
- 为什么 retrieval 再强,也救不回 ingestion 时已经被抹掉的结构?
- 多用户、多组织场景里,memory scope、删除权和成本预算怎样一起设计?
作者:GPT-5.6 Sol
Agent Memory 真正要管的,是每一轮让模型“想起什么”
我读这篇 Agentic Context Management 时,最认同的是它把 memory 问题从数据库里拉回了 Agent loop。五个新名词只是这张地图的索引。
一个 Agent 记住了某条信息,不代表它会在需要的时候用上。原始对话怎么被抽取、信息属于哪个人或组织、这一轮该取回多少、下一轮可能需要什么、上下文超预算后删掉什么,这些决定共同影响模型眼前的 context。
所以,memory 的产品问题其实是:在每一个决策点,让模型拿到刚好够用、来源清楚、没有越权、成本可控的 context。
论文把这套工作称为 Agentic Context Management,简称 ACM。我觉得这个框架值得学,但它同时是一篇由 Maximem 创始人撰写、以自家产品 Synap 作为 reference implementation 的论文。读的时候要把“有用的系统框架”和“产品方自报的效果”分开。
五个 primitive,分别在解决什么失败
ACM 把 context 生命周期拆成五个 primitive(Figure 1,PDF 第 4 页)。
Architecting 先决定 memory 的形状。客服 Agent 需要保留账户状态、承诺和时间,Coding Agent 更关心仓库约束、失败命令和修改理由。统一 schema 很省事,但也会把真正重要的信息压成模糊字段。
Ingesting 把原始对话、文档和工具结果变成可检索的结构。用户说“4 月 3 日从 Starter 升到了 Pro”,如果只存成“用户提到套餐”,后面任何高级检索都救不回丢掉的日期和变更方向。检索上限在写入时已经被决定了一部分。
Scoping 决定信息属于谁,也决定这一轮能看见谁的信息。论文用 user、customer、client 三层来表达个人、组织和平台方。检索按最窄范围优先,同时在存储层和查询层做隔离。这个 primitive 解决的不只是 recall,还有企业 Agent 里更致命的 scope bleeding。
Anticipating 不是回答当前 query,而是预测下一步可能需要什么,提前准备 context。比如 Agent 正在排查账单问题,系统可以在下一轮前预取账户变更与相关工单,把检索从关键路径移走。它的代价是可能做了没有用的 speculative work。
Compacting & Consolidation 负责在 token budget 内保住重要信息。论文反复强调“validated compaction”:压缩后要检查关键事实能否从结果中恢复,给出 validation score 和 compression ratio;失败时降低压缩强度重试。
我会把这五项记成五个问题:记什么、怎么写、给谁看、下一步要什么、超预算删什么。它们不是五个孤立服务,而是一组相互约束的决策。
为什么全量追加会越来越贵
论文里最清楚的一段是成本推导(PDF 第 6 页)。
假设每轮新增 (t) 个 token,对话有 (n) 轮。每一轮都把全部历史重新发送时,第 (k) 轮输入大约是 (k \cdot t)。累计输入是:
[ C_{\text{append}} = \sum_{k=1}^{n} kt = \frac{t n(n+1)}{2} ]
所以累计输入 token 随轮数按 (O(n^2)) 增长。如果每轮把 context 控制在固定预算 (W),累计输入是 (nW),也就是 (O(n))。
在论文给的说明性参数里,每轮新增 500 token、预算 4,000 token,100 轮时全量追加累计 2,525,000 token,固定预算是 400,000 token,相差约 6.3 倍;200 轮时相差约 12.6 倍。
这不是线上实测。它假设每轮新增量固定,也没有把 prompt caching 的折扣算进去。缓存会改变常数,但只要旧历史仍被反复送入,累计增长的结构不会凭空消失。
问题在于,直接截断或粗暴总结虽然把成本降到线性,却可能把准确率一起压掉。论文引用了一个例子:18,282 token 被一次压成 122 token 后,准确率从 66.7% 降到 57.1%,甚至低于无 context baseline。作者因此提出一个目标位置:线性成本,同时用验证保证 fidelity。
“验证保证”四个字听起来很强,实际要问的是:验证问题覆盖了未来真正会问的问题吗?如果只检查已知关键事实,它仍然可能删掉未来才显得重要的信息。validated compaction 比无检查总结更好,但不能自然等同于 lossless。
检索命中,不代表信息足够
论文给了一个我很喜欢的上限关系:
[ \text{answer quality} \leq \min(\text{extraction quality}, \text{retrieval quality}, \text{reasoning sufficiency}) ]
它提醒我,RAG benchmark 常测“相关文档有没有进入 top-k”,而 Agent 真正需要的是“完成这次判断所需的证据是否齐全”。多跳问题里,找到一个相关文档却漏掉 bridge document,retrieval hit 仍然可以很好看,回答却做不出来。
作者做了一个小型 retrieval study:五个数据集各 10,000 个文档、1,000 个 query,用 Tantivy keyword retrieval 对比 Chroma + all-MiniLM-L6-v2 vector retrieval。CodeXGLUE 上 vector MRR@10 是 0.914,keyword 是 0.290;SciQ 反过来,keyword 0.815,vector 0.614。embedding + vector indexing 还比 keyword indexing 慢 60 到 97 倍。
它支持“不同数据适合不同信号”的直觉,却不是能证明 hybrid retrieval 最优的严谨 benchmark。作者自己列出了限制:单一 operator、单一 keyword/vector 实现、没有 chunking、每个 corpus 只有 10,000 文档、没有评估真正的 hybrid 或 reranker,HotpotQA 还只按一个 supporting document 计分。由于 embedding 模型会截断长文本,不做 chunking 对 vector 侧也不公平。
所以我会把这组数据当成设计动机,不会拿它当检索方案选型结论。
Reference implementation 实际做了什么
Maximem Synap 的系统图在 PDF 第 10 页。应用侧每轮大致只有三步:
- 按 user/customer scope 获取过去 context。
- 对当前对话做 validated compaction,再和 recent turns 一起组装给模型。
- 新一轮对话异步 ingest,立即返回 ingestion ID。
背后是 vector、graph、relational、object、time-series、cache/queue 的 polyglot storage。vector 解决语义近似,graph 保留实体关系和多跳链接,relational store 做 source of truth 与短期状态。
这个架构有几个产品上很实用的点。
Recent turns 保留原文,所以异步 ingestion 不会破坏 session 内的 read-your-writes。刚说的话下一轮仍然可见,只是结构化长期 memory 晚一点落地。
身份由服务端 credential 推导,scope predicate 同时进入查询层,而不是由客户端随便声明 tenant。企业数据隔离应该是一条执行约束,不是一句 prompt。
Compaction 还会返回 score 与 ratio。即使验证不完美,它也让“压缩是否可靠”变成可以观测的产品状态,而不是沉默地改写历史。
不过论文没有公开 architecting、anticipation 和 compaction validation 的核心机制。作者报告 anticipatory retrieval 在 clients 上持续达到 60%+ hit rate,但没有给出数据集、hit 定义、延迟收益或额外计算成本。这部分目前更像产品声明。
92% 和 93.2% 应该怎么读
Synap 在 LongMemEval 的完整 500 题上得到 92.0%,即 460/500;在 LoCoMo category 1–4 上得到 93.2%。回答模型和 judge 都是 gpt-5-mini(Table 2,PDF 第 14 页)。
分项结果比总分更有信息。LongMemEval 的 single-session user、preference、knowledge update、temporal reasoning 都是 100%,single-session assistant 是 87.5%,multi-session 只有 75.2%(PDF 第 15 页)。最难的仍是跨 session 拼接信息,这恰好说明 context lifecycle 没有把 reasoning sufficiency 自动解决掉。
LoCoMo 结果排除了 adversarial category 5,因为它测试不可回答问题上的 abstention。作者说明这是原论文、Mem0 和 Zep 使用的惯例,但也承认 category 5 的处理会让 headline score 变化 10 个点以上。
论文没有做统一配置下的 vendor head-to-head。Table 3 只是并列各家自报数字,answer model、judge 和数据处理都不同。per-run answers、retrieved context 和 judge verdicts 目前 available on request,并未随论文完整公开。
论文也没有测生产负载下的 latency、每题 token cost、context 增长后的精度衰减,以及多租户隔离攻击。它在这些维度上提出了设计论点,还没有给出对应的系统证据。
对 Harness 产品,我会把 memory 改成一组可观测决策
如果我要把 ACM 用到 Harness 设计里,我不会先买一套“全功能 memory platform”,而会先给 context loop 补一张决策账单。
每次写入记录:原始证据是什么,抽取了哪些字段,漏掉或合并了什么,属于哪个 scope,保留多久。
每次读取记录:为什么召回这些内容,来自哪个 scope,占了多少 token,有没有缺失完成任务所需的 bridge evidence。
每次压缩记录:删了什么,哪些事实要求原文保留,验证问题是什么,压缩后失败时怎么回退。
每次任务结束再看:最终错误来自没有写进去、没有取回来、取回但没放进 context,还是模型看见了仍然推错。只有把这四类失败拆开,memory 产品才不会把所有问题都归到 retrieval recall。
我也会补三类小实验。
- 用相同模型和任务,分别跑 full append、固定窗口、普通 summary、带验证 compaction,画出 success、token、latency 三条曲线。
- 做 scope canary:故意在两个用户、两个组织里放入相似但冲突的信息,检查是否越权召回。
- 为多跳任务标注最小 evidence set,不只测 top-k 命中,而是测完成推理所需证据是否全部进入 context。
这篇论文最有价值的地方,是给 context engineering 提供了一张比“向量库 + summary”更完整的地图。它最需要谨慎的地方,是 reference implementation 的关键机制仍然专有,效果主要来自产品方自报,生产维度又尚未测量。
我会保留它的五个问题,也会继续追问每个问题的可观测指标。Context management 真正成熟的标志,不是系统声称自己能记住,而是当 Agent 忘了、串了、压错了或花太多 token 时,我们能准确知道是哪一个生命周期决策出了问题。