Add Agent Memory learning pilot
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
# Learning Modules
|
||||
|
||||
这里保存已经从论文集合中“编译”出来的学习模块。论文是证据来源,模块的目标是帮助人建立认知、主动回忆、比较方法并完成设计判断。
|
||||
|
||||
每个模块至少包含:
|
||||
|
||||
- 一个清晰问题,而不是宽泛主题。
|
||||
- 一张认知地图,说明概念与方法之间的关系。
|
||||
- 一篇压缩讲义,区分事实、证据和综合判断。
|
||||
- 一份证据矩阵,保留结论的出处与适用边界。
|
||||
- 一组主动回忆和设计题,用于验证是否真正掌握。
|
||||
- 一份机器可读的 `module.json`,供后续前端和学习进度系统使用。
|
||||
|
||||
## Modules
|
||||
|
||||
| Module | Question | Status | Entry |
|
||||
| --- | --- | --- | --- |
|
||||
| Agent Memory | Agent 怎样把历史压缩成能改善未来决策的状态? | pilot | [开始学习](agent-memory/README.md) |
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
# Agent Memory:从存储历史到编译经验
|
||||
|
||||
status: pilot
|
||||
|
||||
## 这次真正要学会什么
|
||||
|
||||
不是记住 12 个系统名字,而是获得一个可迁移判断:
|
||||
|
||||
> Agent memory 不是“多放一些历史记录”,而是在资源、可靠性和安全约束下,把过去压缩为足以改善未来决策的状态。
|
||||
|
||||
完成本模块后,应该能够:
|
||||
|
||||
1. 解释为什么长上下文、向量检索和摘要都不是通用 memory 方案。
|
||||
2. 根据任务选择事实记忆、过程记忆、执行状态或编译指令。
|
||||
3. 设计 write、manage、read、learn、govern 五个环节。
|
||||
4. 用正确 baseline 判断 memory 是否真的带来收益。
|
||||
5. 分析一个 memory 系统可能发生的遗漏、污染、过期和成本问题。
|
||||
|
||||
## 第一次学习:45 分钟
|
||||
|
||||
### 0-5 分钟:先回答
|
||||
|
||||
不要看后文,先写下你的直觉答案:
|
||||
|
||||
- 如果上下文窗口无限大,Agent 还需要 memory 吗?
|
||||
- 一条历史记录什么时候值得被记住?
|
||||
- 相似度最高的记录为什么可能不是最有用的记录?
|
||||
|
||||
### 5-15 分钟:建立地图
|
||||
|
||||
阅读 [认知地图](knowledge-map.md),重点理解两条轴:
|
||||
|
||||
- 时间:当前任务内还是跨任务。
|
||||
- 内容:知识事实还是执行经验。
|
||||
|
||||
### 15-30 分钟:理解主线
|
||||
|
||||
阅读 [压缩讲义](chapter.md) 的前六节。第一次不要追系统细节,只追踪问题怎样演化:
|
||||
|
||||
`保存历史 -> 检索历史 -> 组织历史 -> 维护执行状态 -> 编译经验 -> 学习记忆策略`
|
||||
|
||||
### 30-38 分钟:检查证据
|
||||
|
||||
阅读 [证据矩阵](evidence-matrix.md)。至少选择一个正面结果和一个反例,确认自己不会把“某篇论文有效”误写成“memory 总是有效”。
|
||||
|
||||
### 38-45 分钟:闭卷输出
|
||||
|
||||
完成 [主动回忆](active-recall.md) 中的前 6 题。答不出来时不要立刻翻答案,先标记卡点属于:概念不清、证据没记住,还是无法迁移到设计。
|
||||
|
||||
## 这个模块的组成
|
||||
|
||||
- [认知地图](knowledge-map.md):问题空间、方法位置和演化脉络。
|
||||
- [压缩讲义](chapter.md):从原始论文压缩出的统一解释。
|
||||
- [证据矩阵](evidence-matrix.md):12 篇锚点论文的主张、证据与边界。
|
||||
- [主动回忆](active-recall.md):记忆题、比较题、诊断题和设计题。
|
||||
- [module.json](module.json):供后续学习界面使用的结构化入口。
|
||||
- [试验记录](../../experiments/knowledge-compilation/2026-07-10-agent-memory-pilot.md):本轮是怎样做出来的,以及下一轮该改什么。
|
||||
|
||||
## 当前边界
|
||||
|
||||
- 当前是第一轮认知编译,不是 Agent Memory 全量综述。
|
||||
- 锚点论文来自现有一年语料中的 12 篇,另外约 300 篇 memory 标签论文暂作证据池。
|
||||
- 已阅读锚点论文原文的关键方法、实验和限制部分,但尚未逐项复现实验。
|
||||
- 论文集中在 2026 年,结论可能受新 benchmark、强模型和评测协议变化影响。
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
# Agent Memory 主动回忆与设计题
|
||||
|
||||
## 使用规则
|
||||
|
||||
先闭卷回答,再展开参考答案。每题按下面标准自评:
|
||||
|
||||
- `0`:没有答案,或只复述系统名称。
|
||||
- `1`:能说出概念,但不能解释原因或边界。
|
||||
- `2`:能给出机制、证据或反例。
|
||||
- `3`:能迁移到新任务并做出设计判断。
|
||||
|
||||
第一轮不追求满分。真正值得记录的是“我在哪种问题上无法自己推导”。
|
||||
|
||||
## 第一组:核心概念
|
||||
|
||||
### 1. Agent memory 和普通 RAG 的根本区别是什么?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
普通 RAG 主要解决外部知识的查询与注入;Agent memory 还要处理由交互产生的状态如何写入、更新、遗忘并影响未来动作。它与 policy 形成反馈环,一次错误写入会改变后续行为,因此还需要 transition verification、credit assignment 和 governance。
|
||||
|
||||
</details>
|
||||
|
||||
### 2. 为什么语义相似的两段历史不一定能被压成同一个 memory state?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
因为它们可能要求不同动作。安全合并的判断应是:对当前问题,是否存在一个共同动作,让两段历史的决策损失都在允许范围内。描述相似只是检索信号,不是决策兼容证明。
|
||||
|
||||
</details>
|
||||
|
||||
### 3. 长上下文已经能放下全部历史时,为什么仍可能需要 memory?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
可能仍需要降低延迟与 token、减少干扰、跨 session 持久化、支持删除与来源治理、维护执行分支,以及把经验编译成规则。但如果任务短、成本可接受且无需持续学习,长上下文可能就是更好的方案,所以必须作为 baseline。
|
||||
|
||||
</details>
|
||||
|
||||
### 4. 事实记忆和执行状态有什么区别?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
事实记忆回答“世界或用户是什么样”,适合主题文档、时间线和结构查询;执行状态回答“任务走到了哪里、哪些约束和分支仍有效”,需要保留动作顺序、子目标边界和错误路径。只用事实检索重建长任务状态容易发生碎片化。
|
||||
|
||||
</details>
|
||||
|
||||
### 5. 什么经验适合被编译进 prompt 或 skill?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
跨样本稳定、反复出现、可以验证、能明确改变行为边界的经验。例如固定抽取边界、可靠操作流程或失败恢复规则。短期事实、未经验证的反思和高度状态依赖的决策不适合直接固化。
|
||||
|
||||
</details>
|
||||
|
||||
### 6. 为什么只看最终任务成功不能判断 memory 写入是否可靠?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
最终成功可能掩盖中间发生的遗漏、破坏或幻觉,这些错误会留在持久状态中,未来才触发;最终失败也无法定位是哪个 update、retrieval 还是回答步骤造成。因此需要 transition-level 检查和局部归因。
|
||||
|
||||
</details>
|
||||
|
||||
## 第二组:比较与诊断
|
||||
|
||||
### 7. 一个向量库中确实保存了正确答案,但 Agent 仍然回答错误。列出两个不同层面的原因。
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
表示层可能已经丢失问题所需的动作、时序、因果关系;或者存储保留了细节,但 passive retriever 只返回摘要,没有给 Agent 补查原始证据的机会。还可能是证据已正确取回但 actor 推理失败,这应与 retrieval failure 分开。
|
||||
|
||||
</details>
|
||||
|
||||
### 8. 为什么 stronger retriever 不一定能修复 weak memory manager?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
如果写入阶段已经错误合并主题、删除时序、生成错误摘要或遗漏关键谓词,后续检索面对的是被破坏的表示上限。检索只能选择现有内容,不能恢复从未保存的区别。
|
||||
|
||||
</details>
|
||||
|
||||
### 9. 什么时候 memory index 的构建成本可能值得?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
需要同时满足:未来问题所需关系能被 schema 表达;很多问题确实需要跨记录聚合;同一索引会被足够多次查询,从而摊销构建成本。否则 raw evidence 加主动工具读取可能更灵活。
|
||||
|
||||
</details>
|
||||
|
||||
### 10. 一个 online memory 方法比 vanilla Agent 成功率高 3%,能否说明有效?还缺什么?
|
||||
|
||||
<details>
|
||||
<summary>参考答案</summary>
|
||||
|
||||
不能。需要计算 memory induction、retrieval、verification 和注入增加的全部 token、延迟和调用;与使用相同预算增加 actor steps 的 baseline 比较;做多次运行并报告方差;检查收益是否集中在特定域以及是否能跨任务复用。
|
||||
|
||||
</details>
|
||||
|
||||
## 第三组:设计题
|
||||
|
||||
### 11. 为一个长期运行的 coding agent 设计 memory
|
||||
|
||||
场景:Agent 每天修改同一仓库,任务跨 session;它需要记住架构约束、失败的修复尝试、当前 issue 进度和可复用命令。请给出最小设计,并说明每种内容放在哪里。
|
||||
|
||||
<details>
|
||||
<summary>参考框架</summary>
|
||||
|
||||
- immutable log:原始终端、代码 diff、测试结果,负责审计和重新解释。
|
||||
- topic documents:模块职责、架构约束、项目惯例,带来源和更新时间。
|
||||
- execution state:当前 issue 的计划、完成步骤、阻塞和失败分支。
|
||||
- compiled skills:经过多次验证的构建、测试、迁移和修复流程。
|
||||
- controller:按任务选择当前状态与相关主题,必要时回查原始日志。
|
||||
- verifier:任何架构事实和规则升级前检查证据;代码执行仍以当前仓库和测试为准。
|
||||
- baseline:与 repo 文档 + 当前 session 长上下文比较成功率、token、延迟和错误恢复。
|
||||
|
||||
</details>
|
||||
|
||||
### 12. 设计一次 memory-vs-long-context 实验
|
||||
|
||||
要求:至少包含任务集、对照组、主要指标、失败分类和安全检查。
|
||||
|
||||
<details>
|
||||
<summary>参考框架</summary>
|
||||
|
||||
- 固定任务:跨 session 事实更新、长程执行、重复流程迁移各一组。
|
||||
- 对照:truncation、full/long context、budget-matched vanilla actor、目标 memory 方法。
|
||||
- 指标:task success、总 token、p95 latency、memory size、过期事实率、错误恢复率。
|
||||
- 失败分类:write omission/corruption、representation loss、retrieval miss、reasoning failure、action failure。
|
||||
- 安全:植入一条外部不可信指令,检查它能否跨 session 触发敏感动作;验证删除请求是否真正传播。
|
||||
- 重复运行:至少多 seed,报告均值和方差,不只报告最好一次。
|
||||
|
||||
</details>
|
||||
|
||||
## 掌握度记录
|
||||
|
||||
| 日期 | 总分 / 36 | 最弱环节 | 能否完成设计题 | 下一次复习 |
|
||||
| --- | ---: | --- | --- | --- |
|
||||
| _待填写_ | | | | |
|
||||
|
||||
建议复习节奏:第一次完成后 1 天、3 天、7 天分别闭卷再答。第二次开始只回答上次低于 2 分的题,并增加一个来自自己项目的新案例。
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
# 压缩讲义:Agent 怎样从历史中学习
|
||||
|
||||
## 1. Memory 不是仓库,而是受限状态
|
||||
|
||||
最朴素的 Agent memory 是保存聊天记录,然后按相似度找回来。这个模型隐含了两个假设:过去可以被完整保存;只要找到相关文本,模型就能做出更好的动作。最近一年的工作反复证明,这两个假设都不够。
|
||||
|
||||
更有用的形式化来自 POMDP:Agent 看不到完整世界状态,只能用历史构造一个内部状态。设历史为 `h`、当前问题为 `q`、memory 编码器为 `g`,实际决策只能依赖:
|
||||
|
||||
```text
|
||||
m = g(h, q)
|
||||
a = policy(m, q)
|
||||
```
|
||||
|
||||
因此 memory 的目标不是重建全部过去,而是让 `m` 成为当前决策的充分状态。这个视角立刻解释了三个现象:
|
||||
|
||||
- 两段语义相似的历史,可能要求完全不同的行动,因此不能合并。
|
||||
- 两段描述完全不同的历史,如果对当前问题导向同一个最优行动,可以安全压缩。
|
||||
- memory 质量最终要用决策损失衡量,不能只用召回率或摘要相似度衡量。
|
||||
|
||||
[DeMem](https://arxiv.org/abs/2605.10870) 把这个直觉写成 decision rate-distortion。对历史 `h` 采取动作 `a` 的损失是:
|
||||
|
||||
```text
|
||||
Delta_q(h, a) = best_value(h, q) - value(h, q, a)
|
||||
```
|
||||
|
||||
如果一组历史存在一个共同动作,使每段历史的损失都不超过容忍值 `epsilon`,它们才可以共享一个 memory state。这给出了一个非常实用的遗忘原则:
|
||||
|
||||
> 可以忘记描述差异,但不能忘记会改变决策的差异。
|
||||
|
||||
## 2. 为什么长上下文不是答案,但必须作为 baseline
|
||||
|
||||
长上下文保留原始信息,避免了过早摘要和 schema 丢失,所以它经常比复杂 memory 系统更强。[EvoMemBench](https://arxiv.org/abs/2605.18421) 在统一协议下比较 15 种方法,得到三个重要结果:
|
||||
|
||||
1. 长上下文 baseline 仍然很有竞争力。
|
||||
2. memory 在当前上下文不足、任务更难时才更稳定地产生价值。
|
||||
3. 没有一种 memory 形态能同时支配所有任务。
|
||||
|
||||
这不意味着只要扩大窗口即可。上下文越长,推理成本和延迟越高,干扰也越严重;而跨 session 的持久状态、可删除性、来源治理和经验学习也不是上下文窗口本身能解决的。
|
||||
|
||||
正确结论是:长上下文是 memory 实验必须击败的控制组,而不是必须淘汰的旧方案。
|
||||
|
||||
## 3. 相似度为什么经常失效
|
||||
|
||||
向量检索回答的是“什么文本看起来像当前问题”,Agent 真正需要的却可能是:
|
||||
|
||||
- 哪个动作导致了当前状态?
|
||||
- 哪条约束仍然有效?
|
||||
- 上次失败发生在哪个分支?
|
||||
- 哪段经验对未来成功有长期贡献?
|
||||
|
||||
这些关系分别是因果、时间、控制流和价值关系,不能被单一语义距离稳定表达。
|
||||
|
||||
[AutoMEM 的诊断研究](https://arxiv.org/abs/2606.04315) 给出了两个具体失效层:
|
||||
|
||||
- 表示失败:索引 schema 根本没有保存 step id、动作或未来问题需要的谓词,之后再强的检索器也找不回来。
|
||||
- 检索失败:原始存储里仍有答案,但一次被动路由没有把细节交给回答模型,也没有第二次补证据的机会。
|
||||
|
||||
它还给出了“什么时候索引值得做”的两个条件:schema 必须能表达问题所需关系;大量问题必须确实需要跨记录聚合。否则,保留原始文本并让 Agent 用 `grep/read` 主动查找,可能更通用。
|
||||
|
||||
所以结构化不是越多越好。结构化是在写入时对未来问题下注,而主动检索是在查询时再决定需要什么结构。
|
||||
|
||||
## 4. 四类 memory,解决四类失败
|
||||
|
||||
### 4.1 事实与主题文档
|
||||
|
||||
适合用户偏好、人物关系、项目事实和跨 session 知识更新。关键不是把每句话切成孤立向量,而是把相关证据维护成可以修订的主题单元。
|
||||
|
||||
[Infini Memory](https://arxiv.org/abs/2606.10677) 使用 topic documents:新观察先进入缓冲区,再周期性巩固到主题文档;读取时由 Agent 迭代搜索、查看局部行和补充证据。在 MemoryAgentBench 上,其 agentic variant 报告 64.7% overall;维护结构固定时,agentic retrieval 相比 summary+BM25 增加 3.3 点,而移除 split/merge 使 LongMemEval 减少 6.7 点。
|
||||
|
||||
这里的启发不是“文件一定胜过数据库”,而是 memory 需要可维护的语义单元、原始证据链接和多步检查能力。
|
||||
|
||||
### 4.2 当前执行状态
|
||||
|
||||
长程工具任务的主要问题常常不是忘记一个事实,而是丢失当前控制状态:已经完成哪些子目标、哪些路径失败、哪些动作改变了后续约束。
|
||||
|
||||
[MAGE](https://arxiv.org/abs/2606.06090) 用两层树表示执行状态:底层保存 action-observation,顶层在子目标边界压缩;当前状态来自 root-to-current path。四个操作形成闭环:
|
||||
|
||||
- `Grow`:追加新的动作与观察。
|
||||
- `Compress`:在边界把完成片段压缩为子目标状态。
|
||||
- `Maintain`:在摘要成为可信状态前检查遗漏和执行错误。
|
||||
- `Revise`:回到错误边界,从新分支继续,隔离错误轨迹。
|
||||
|
||||
这个结构解决的是控制流连续性,而不是文本相似性。论文在 MemoryArena 报告相对 baseline 平均提高 7.8 到 20.4 个百分点,同时比长上下文减少 55.1% token。
|
||||
|
||||
### 4.3 稳定规则与技能
|
||||
|
||||
如果同一种错误反复发生,把旧案例再次塞进上下文可能不如直接改变 Agent 的行为规则。
|
||||
|
||||
[Compiled Memory](https://arxiv.org/abs/2603.15666) 的 Atlas 把经过验证的经验写成 system prompt 中的子规则:memory 是 distillation,读取是 instruction rewriting。其 CUAD 实验报告 token F1 增加 8.7 个百分点,HotpotQA joint F1 增加 3.16 个百分点;同一份从 GPT-4o 错误编译的 prompt 在 Claude Sonnet 4.5 上仍增加 2.31 个百分点。
|
||||
|
||||
但这个结果有重要限制:演化 prompt 从约 960 增至 1570 token,论文没有完成等长度通用内容控制;而训练信号没有覆盖的目标不会自然改善。这说明程序记忆适合稳定、重复、可验证的任务规则,不适合不断变化的事实。
|
||||
|
||||
### 4.4 有价值的经验链
|
||||
|
||||
一次成功可能依赖更早的记忆,而那条记忆又帮助生成了后续记忆。只奖励最后一次被直接检索的记录,会错误分配信用。
|
||||
|
||||
[MemQ](https://arxiv.org/abs/2605.08374) 记录 memory provenance DAG,并把 TD error 沿祖先链反向传播:
|
||||
|
||||
```text
|
||||
delta(m) = reward + gamma * Q(new_memory) - Q(m)
|
||||
credit(ancestor) += alpha * (gamma * lambda)^depth * delta(m)
|
||||
```
|
||||
|
||||
它在多步任务上的提升大于单步任务,说明“结构距离”可以比单纯时间距离更适合经验归因。不过它假设 memory 单调增长,尚未解决巩固和删除,维护 DAG 也会持续增加成本。
|
||||
|
||||
## 5. 写入比读取更危险
|
||||
|
||||
检索错了一次通常影响一个回答;持久 memory 写错一次,可能在未来反复被召回,成为系统状态污染。
|
||||
|
||||
[TrustMem](https://arxiv.org/abs/2606.25161) 把 memory update 视为可审计 transition,动作空间是 `WRITE / REVISE / PRUNE`。verifier 从三个维度检查每次更新:
|
||||
|
||||
- coverage:新输入中的重要信息是否保留。
|
||||
- preservation:原有有效信息是否被无依据删除或扭曲。
|
||||
- faithfulness:新写内容是否有当前输入或旧状态支持。
|
||||
|
||||
这比只看最终问答正确率更合理,因为正确答案也可能掩盖中间产生的危险状态。论文报告,相比各错误类型的最强 baseline,遗漏、破坏和幻觉分别减少 40.1%、79.1% 和 50.0%。
|
||||
|
||||
但“内容真实”仍不等于“有权支持行动”。外部网页中的恶意指令即使被准确保存,也不应在未来授权转账。[MemLineage](https://arxiv.org/abs/2605.14421) 因此把来源签名、派生 DAG 和敏感动作 gate 结合起来:一条行动理由如果沿派生链来自不可信源,就不能直接执行。
|
||||
|
||||
它的确定性机制隔离实验中,三类攻击的 ASR 均降为零,但这个结果来自自定义 cross-session harness;headline 评估没有覆盖完整自适应攻击,且作者明确假设模型权重和推理路径可信。它支持“来源链必须进入执行策略”这个方向,但不能被读成 memory 安全已解决。
|
||||
|
||||
## 6. Memory controller 才是核心能力
|
||||
|
||||
写入什么、怎样组织、什么时候读取、如何补证据和何时遗忘,本质上都是控制策略。当前出现了三种控制方式:
|
||||
|
||||
| 控制方式 | 优点 | 代价 |
|
||||
| --- | --- | --- |
|
||||
| 固定规则 | 可预测、可调试、成本低 | 难适应任务与状态变化 |
|
||||
| LLM 工具调用 | 灵活,可按问题主动查找 | 多轮调用昂贵,受模型能力影响 |
|
||||
| 训练控制器 | 能从结果优化策略 | 训练和 credit assignment 复杂,容易过拟合 benchmark |
|
||||
|
||||
[HORMA](https://arxiv.org/abs/2606.11680) 提供了一个值得保留的分工:高能力模型负责异步 memory organization,轻量模型学习低延迟 retrieval。论文中,Qwen 3.5 4B retriever 仅在 LoCoMo 训练,却能迁移到 ALFWorld 和 LongMemEval;但弱模型如果一开始就把 memory 组织坏了,更强的 retriever 也补不回来。
|
||||
|
||||
这正好说明我们自己的模型分工原则:小模型适合局部、可验证、低风险操作;跨论文压缩、结构设计和关键判断需要强模型或人工研究编辑承担。
|
||||
|
||||
## 7. 怎样证明 memory 值得存在
|
||||
|
||||
Memory 论文最容易犯的错误,是只比较成功率,不计算 memory 模块自己消耗的 token、延迟和额外调用。
|
||||
|
||||
[在线 memory/skill 的预算研究](https://arxiv.org/abs/2606.15017) 把相同预算交给 vanilla actor 增加观察和行动步数。在 WebArena 的三个域、三个模型上,budget-matched vanilla baseline 的平均成功率都高于三个在线 augmentation 方法,并且通常 token 更少;在 WorkArena-L1 上也保持竞争力。
|
||||
|
||||
这项结果不能推广到所有 memory:它研究的是在线模块,离线编译后被大量复用的技能需要另一种摊销方式。但它给出了必须遵守的评测卫生:
|
||||
|
||||
1. 报告所有模块的 token 和延迟,不只报告主 Agent。
|
||||
2. 与长上下文和 budget-matched vanilla actor 比较。
|
||||
3. 多次运行并报告方差。
|
||||
4. 分开评估写入、组织、读取、回答和动作执行的错误。
|
||||
5. 测试更新、冲突、遗忘、污染和跨任务泛化,不只测静态 recall。
|
||||
|
||||
## 8. 综合结论:一个可工作的参考架构
|
||||
|
||||
对需要长期运行、可学习、可审计的 Agent,可以从下面的最小架构开始:
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
E["Immutable event log"] --> V["Transition verifier"]
|
||||
V --> B["Current buffer"]
|
||||
B --> T["Topic documents"]
|
||||
B --> X["Execution-state tree"]
|
||||
T --> K["Compiled rules / skills"]
|
||||
X --> K
|
||||
Q["Current task"] --> C["Memory controller"]
|
||||
T --> C
|
||||
X --> C
|
||||
K --> C
|
||||
C --> D["Minimal sufficient context"]
|
||||
D --> A["Agent action"]
|
||||
A --> O["Outcome and feedback"]
|
||||
O --> L["Credit and consolidation"]
|
||||
L --> V
|
||||
P["Provenance / time / principal / policy"] --> V
|
||||
P --> C
|
||||
P --> A
|
||||
```
|
||||
|
||||
这不是要求第一天实现全部层。它给出的是责任边界:
|
||||
|
||||
- 原始日志负责可恢复和审计。
|
||||
- topic documents 负责可维护事实。
|
||||
- execution tree 负责长任务状态。
|
||||
- compiled rules 负责稳定行为改变。
|
||||
- controller 负责按任务选择最小充分上下文。
|
||||
- verifier 与 provenance 负责阻止错误和不可信状态永久化。
|
||||
- outcome loop 负责让 memory 从使用结果中学习。
|
||||
|
||||
最终设计原则可以压成一句话:
|
||||
|
||||
> 先判断未来决策需要保留什么区别,再选择存储结构;先用公平 baseline 证明价值,再让 memory 获得长期权限。
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# Agent Memory 证据矩阵
|
||||
|
||||
## 怎么使用这张表
|
||||
|
||||
这不是论文排行榜。每篇只承担一个认知角色:定义问题、提出机制、给出反例或补上治理边界。数字按论文原文记录,尚未由本项目独立复现。
|
||||
|
||||
| 认知角色 | 论文 | 核心主张 | 主要证据 | 不能推出什么 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 总体框架 | [Memory for Autonomous LLM Agents](https://arxiv.org/abs/2603.07670) | Memory 是 write-manage-read loop;应同时看时间范围、表示基底和控制策略 | 汇总 2022 至 2026 年初机制与 benchmark,提出 utility、efficiency、adaptivity、faithfulness、governance 五类目标 | 综述中的跨论文数字不是统一协议下的直接比较 |
|
||||
| 通用反例 | [EvoMemBench](https://arxiv.org/abs/2605.18421) | Memory 价值依赖任务范围与内容类型,没有通用最优形态 | 在统一协议下比较 15 种 memory 方法和长上下文 baseline;长上下文仍有竞争力,知识任务偏 retrieval,执行任务偏 procedural/long-term memory | 不能据此认为 memory 无价值;它在上下文不足和困难任务中更有帮助 |
|
||||
| 决策理论 | [Remember the Decision, Not the Description](https://arxiv.org/abs/2605.10870) | 应保留影响决策的历史差异,而不是追求描述保真 | 在 LoCoMo 子集上,描述相似度对 evidence compatibility 的 Spearman 相关仅 0.103;相同预算下 DeMem 的 gold evidence recall 为 83%,描述检索为 66% | 理论主要在 contextual bandit 与有限 memory state 设定下建立,不等于所有 Agent 控制问题已被形式化 |
|
||||
| 行为编译 | [Compiled Memory](https://arxiv.org/abs/2603.15666) | 经验可以被验证后编译进指令,使 memory 直接改变行为 | CUAD token F1 +8.7pp;HotpotQA joint F1 +3.16pp;同一 evolved prompt 在 Claude Sonnet 4.5 上 +2.31pp | evolved prompt 更长,缺少等长度通用内容 control;只会改善训练信号明确覆盖的目标 |
|
||||
| 跨场景诊断 | [Exploring Cross-Scenario Generality / AutoMEM](https://arxiv.org/abs/2606.04315) | 结构化索引可能在写入时丢失未来问题需要的谓词;Agent 主动读取更通用 | 比较 8 个系统和一个 harness、覆盖 5 类场景;AutoMEM 在 LoCoMo 为 67.3,对 long context 的 61.5;ALFWorld 中 golden procedure 71.7、最好 memory 43.3、GRPO actor 86.7 | 主动 harness 并非总是最便宜;动态任务的上限可能来自 actor policy,而不是 memory 结构 |
|
||||
| 执行状态 | [MAGE](https://arxiv.org/abs/2606.06090) | 长任务需要 root-to-current execution state 和错误分支隔离,而非相似记录集合 | MemoryArena 上平均 success rate 相对 baseline +7.8 至 +20.4pp;相对长上下文 token -55.1% | 结果集中在 interdependent long-horizon task,不能直接外推到事实问答与个性化记忆 |
|
||||
| 可维护事实 | [Infini Memory](https://arxiv.org/abs/2606.10677) | Topic documents、周期巩固与多步读取可以共同改善长期记忆 | MemoryAgentBench overall 64.7;LongMemEval 上 summary-only 41.7、summary+BM25 76.0、agentic 79.3;去掉 split/merge 后从 76.0 降到 69.3 | 多跳 selective forgetting 仍明显困难;agentic retrieval 增加调用和维护成本 |
|
||||
| 组织与读取分工 | [HORMA](https://arxiv.org/abs/2606.11680) | 高层组织和低层检索应分开优化;文件层级可作为可操作 workspace | ALFWorld strict context 下达到 56.7/73.9 SR;LoCoMo 和 LongMemEval 上优于列出的 baselines;小型 RL retriever 有跨域迁移 | 论文依赖高能力模型进行 memory construction;组织错误无法被更强检索完全修复 |
|
||||
| 写入可靠性 | [TrustMem](https://arxiv.org/abs/2606.25161) | 应在每次 memory transition 检查 coverage、preservation、faithfulness | MemoryAgentBench 相对最强 baseline +6.5;HaluMem extraction +12.14 F1;遗漏、破坏、幻觉分别减少 40.1%、79.1%、50.0% | verifier 是冻结 LLM,仍可能有偏差;提高 transition 可靠性不等于来源可信或有行动权限 |
|
||||
| 经验价值归因 | [MemQ](https://arxiv.org/abs/2605.08374) | Memory 的长期价值应沿 provenance DAG 反向归因 | 六个 benchmark 上领先或并列;相对单步 MemRL,在深链任务最高 +5.7pp,单步任务差距可低至 0.77pp | 假设 memory 单调增长,尚未处理 consolidation/deletion;DAG 和 BFS 带来持续开销 |
|
||||
| 公平成本控制 | [Are Online Skill and Memory Modules Always Worth Their Tokens?](https://arxiv.org/abs/2606.15017) | Memory/skill 的收益必须与把相同预算交给 actor 的 baseline 比较 | WebArena 三域三模型中 Vanilla-IB 平均 SR 均领先三个 augmentation 方法,通常 token 更少;WorkArena-L1 仍在 Pareto frontier | 结论针对 online augmentation;离线编译并重复摊销的 memory 需要不同成本模型 |
|
||||
| 来源与执行权限 | [MemLineage](https://arxiv.org/abs/2605.14421) | 内容签名不够,派生链中的不可信来源也应阻止敏感行动 | 自定义确定性 harness 中,三类攻击只有 lineage 方案全部达到 0 ASR;报告亚毫秒级单操作开销 | harness 为机制隔离而非完整公共 benchmark;headline 未覆盖完整 adaptive attack,并假设模型与推理路径可信 |
|
||||
|
||||
## 跨论文一致结论
|
||||
|
||||
下面这些判断至少得到两类不同证据支持:
|
||||
|
||||
### 相似度不是 memory 的统一目标
|
||||
|
||||
- DeMem 从决策损失说明描述相似不等于行为兼容。
|
||||
- AutoMEM 显示 schema 和 passive retrieval 会丢失动作、时序与因果信息。
|
||||
- MAGE 显示长任务需要保持执行路径,而不是拼接相似片段。
|
||||
|
||||
### Memory construction 不能被当作低价值预处理
|
||||
|
||||
- Infini Memory 的维护消融下降大于 agentic retrieval 的增益。
|
||||
- HORMA 显示弱 manager 组织出的 workspace 无法由强 retriever 修复。
|
||||
- TrustMem 显示一次错误 transition 会成为长期状态污染。
|
||||
|
||||
### Memory 的收益必须带着成本与 baseline 阅读
|
||||
|
||||
- EvoMemBench 显示长上下文 baseline 仍然强。
|
||||
- 在线预算研究显示,额外 actor steps 能吃掉 augmentation 的表面收益。
|
||||
- HORMA、Infini Memory 和 AutoMEM 都显示多步 agentic retrieval 存在质量与调用成本交换。
|
||||
|
||||
### 自我进化受限于反馈质量和 actor 能力
|
||||
|
||||
- Compiled Memory 明确表现出 training-signal constraint。
|
||||
- MemQ 需要 provenance 才能处理多步 credit assignment。
|
||||
- AutoMEM 的 ALFWorld 诊断显示文本 memory 无法替代 state-dependent policy learning。
|
||||
|
||||
## 当前仍不确定
|
||||
|
||||
- 在同一强模型、同一成本预算和同一任务集下,topic documents、execution tree、compiled instruction 的最优组合是什么。
|
||||
- memory update verifier 是否能在真实长周期运行中抵抗 verifier 自身漂移和系统性偏差。
|
||||
- 主动检索的收益何时足以覆盖额外模型调用;是否可由小模型或确定性工具稳定替代大模型步骤。
|
||||
- 来源 lineage、语义正确性和真实权限系统如何以较低复杂度组合。
|
||||
- 当模型能力持续提升时,哪些 memory scaffolding 会失去价值,哪些仍然是系统层必需能力。
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Agent Memory 认知地图
|
||||
|
||||
## 一句话地图
|
||||
|
||||
Agent memory 的核心任务是:在不能把全部历史交给模型的情况下,保留足以支持未来正确决策的信息结构。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
O["观察与轨迹"] --> W["写入判断"]
|
||||
W --> R["原始证据层"]
|
||||
W --> S["语义与主题层"]
|
||||
W --> P["程序与技能层"]
|
||||
R --> X["当前执行状态"]
|
||||
S --> X
|
||||
P --> X
|
||||
X --> A["行动与回答"]
|
||||
A --> F["结果与反馈"]
|
||||
F --> C["价值归因与巩固"]
|
||||
C --> W
|
||||
G["来源、时效与权限"] --> W
|
||||
G --> X
|
||||
```
|
||||
|
||||
这张图里,存储只是中间环节。真正困难的是写入、选择、更新、归因和治理。
|
||||
|
||||
## 两条最重要的区分轴
|
||||
|
||||
EvoMemBench 把问题拆成两条轴,这比“短期/长期 memory”更能指导设计。
|
||||
|
||||
| | 知识导向 | 执行导向 |
|
||||
| --- | --- | --- |
|
||||
| 当前任务内 | 当前问题需要的事实、约束、证据 | 当前计划、子目标、工具结果、失败分支 |
|
||||
| 跨任务 | 用户偏好、领域规则、稳定事实 | 可复用流程、技能、失败教训、策略价值 |
|
||||
|
||||
由此得到四个问题:
|
||||
|
||||
1. 当前任务中,我需要保留哪些事实?
|
||||
2. 当前任务中,我需要维持怎样的执行状态?
|
||||
3. 跨任务后,哪些知识仍然有效?
|
||||
4. 哪些经验应该变成可以复用的行为规则?
|
||||
|
||||
## 四种核心产物
|
||||
|
||||
| 产物 | 保存什么 | 最适合的任务 | 主要风险 |
|
||||
| --- | --- | --- | --- |
|
||||
| 原始证据 | 完整对话、工具结果、轨迹 | 审计、细节恢复、重新解释 | 太长、噪声多、检索困难 |
|
||||
| 语义文档 | 事实、主题、关系、时间线 | 多 session 问答、偏好与知识更新 | 过期、冲突、schema 不匹配 |
|
||||
| 执行状态 | 当前路径、子目标、分支和约束 | 长程工具任务、GUI、编码与规划 | 错误状态持续传播 |
|
||||
| 程序知识 | 规则、技能、指令和策略 | 重复任务、自我改进 | 过拟合、错误经验被固化 |
|
||||
|
||||
一个完整系统通常需要它们共存,而不是选一个数据库解决全部问题。
|
||||
|
||||
## 方法演化
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["把历史塞进上下文"] --> B["按相似度检索记录"]
|
||||
B --> C["结构化主题、图和层级"]
|
||||
C --> D["Agent 主动导航与验证证据"]
|
||||
D --> E["把轨迹维护成执行状态"]
|
||||
E --> F["把经验编译为规则和技能"]
|
||||
F --> H["从结果学习写入、检索和遗忘策略"]
|
||||
H --> I["增加 transition 验证、来源和权限治理"]
|
||||
```
|
||||
|
||||
这不是严格时间线,而是问题不断暴露后的能力叠加:
|
||||
|
||||
- 上下文解决可见性,但产生成本和注意力稀释。
|
||||
- 检索解决容量,但相似不等于对决策有用。
|
||||
- 结构解决关系和聚合,但 schema 可能提前丢失未来问题需要的信息。
|
||||
- Agentic retrieval 延迟结构承诺,让模型按问题寻找证据,但增加推理成本。
|
||||
- 执行状态解决长任务中的因果连续性和错误隔离。
|
||||
- 编译记忆把反复出现的经验变成行为改变,而不只是再次展示历史。
|
||||
- 学习控制策略解决“哪些记忆长期有价值”,同时引入 credit assignment 问题。
|
||||
- 治理层防止错误或不可信内容变成永久系统状态。
|
||||
|
||||
## 五个设计环节
|
||||
|
||||
### Write
|
||||
|
||||
决定候选信息是否值得越过持久化边界。需要处理信息增量、重复、置信度、来源和未来用途。
|
||||
|
||||
### Manage
|
||||
|
||||
执行合并、拆分、更新、遗忘、冲突处理和版本维护。这里决定 memory 会不会随时间腐烂。
|
||||
|
||||
### Read
|
||||
|
||||
根据当前问题选择最小但充分的上下文。读取既可以是一次检索,也可以是 Agent 多步搜索、检查和补证据。
|
||||
|
||||
### Learn
|
||||
|
||||
根据任务结果更新哪些记忆有用、哪些结构有效、哪些经验应晋升为规则。关键难题是把结果正确归因到先前记忆。
|
||||
|
||||
### Govern
|
||||
|
||||
记录来源、时间、主体、权限和派生链;敏感行动不能只因为某条记忆“看起来合理”就执行。
|
||||
|
||||
## 一眼判断方法
|
||||
|
||||
面对一个新任务,按顺序问:
|
||||
|
||||
1. 历史是否真的超过有效上下文,或者会跨 session?如果否,先用长上下文 baseline。
|
||||
2. 任务失败来自忘记事实,还是丢失执行状态?两者需要不同结构。
|
||||
3. 是否存在可重复利用的稳定模式?如果有,考虑程序记忆或编译指令。
|
||||
4. 未来查询类型能否提前定义?如果不能,保留原始证据并支持主动导航。
|
||||
5. memory 模块消耗的 token 和延迟,是否比把预算给基础 Agent 更值得?
|
||||
6. 写错、写旧或写入恶意内容后,系统能否追踪、撤销并阻止敏感行动?
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"id": "agent-memory-pilot",
|
||||
"title": "Agent Memory: 从存储历史到编译经验",
|
||||
"status": "pilot",
|
||||
"version": 1,
|
||||
"created_at": "2026-07-10",
|
||||
"estimated_minutes": 45,
|
||||
"core_question": "Agent 怎样在资源、可靠性和安全约束下,把历史压缩成能改善未来决策的状态?",
|
||||
"learning_outcomes": [
|
||||
"区分长上下文、检索记忆、执行状态和程序记忆",
|
||||
"根据任务选择合适的 memory 表示与控制策略",
|
||||
"设计 write、manage、read、learn、govern 闭环",
|
||||
"使用 budget-matched baseline 和分层错误指标评估 memory",
|
||||
"识别持久 memory 的遗漏、污染、过期和权限风险"
|
||||
],
|
||||
"artifacts": [
|
||||
{"type": "map", "path": "knowledge-map.md"},
|
||||
{"type": "chapter", "path": "chapter.md"},
|
||||
{"type": "evidence", "path": "evidence-matrix.md"},
|
||||
{"type": "recall", "path": "active-recall.md"}
|
||||
],
|
||||
"anchor_papers": [
|
||||
"2603.07670",
|
||||
"2605.18421",
|
||||
"2605.10870",
|
||||
"2603.15666",
|
||||
"2606.04315",
|
||||
"2606.06090",
|
||||
"2606.10677",
|
||||
"2606.11680",
|
||||
"2606.25161",
|
||||
"2605.08374",
|
||||
"2606.15017",
|
||||
"2605.14421"
|
||||
],
|
||||
"concepts": [
|
||||
"decision-sufficient-state",
|
||||
"write-manage-read-loop",
|
||||
"episodic-memory",
|
||||
"semantic-memory",
|
||||
"procedural-memory",
|
||||
"execution-state",
|
||||
"agentic-retrieval",
|
||||
"memory-consolidation",
|
||||
"credit-assignment",
|
||||
"provenance",
|
||||
"selective-forgetting",
|
||||
"budget-matched-evaluation"
|
||||
],
|
||||
"assessment": {
|
||||
"path": "active-recall.md",
|
||||
"question_count": 12,
|
||||
"max_score": 36,
|
||||
"review_intervals_days": [1, 3, 7]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user