调查研究-198 Agent 到底该记住什么?读懂《What Must Generalist Agents Remember?》
Agent 到底该记住什么读懂《What Must Generalist Agents Remember?》TL;DR场景通用 Agent 在多目标、多隐藏环境下仅靠当前观察无法区分状态需依赖记忆结论记忆不是日志而是消除隐藏状态不确定性的内部世界表征必须包含三类控制相关信息产出四层 Agent 记忆分层框架上下文引用 / 任务状态 / 环境区分 / 局部世界模型版本矩阵功能/结论状态说明记忆分离理论Memory Separation✅ 已验证论文 Theorem 1DQN/DRQN/ForkWorld 实验支撑控制相关性筛选Control Relevance✅ 已验证论文 Theorem 2 推论价值预测→局部世界模型等价✅ 已验证论文 Theorem 3probe 实验支撑DRQN hidden state 编码隐藏域✅ 已验证论文 probe 实验验证Oracle Agent 表现上限✅ 已验证Oracle DQN / Oracle DRQN 在 ForkWorld 优于无记忆基线LLM Agent 直接评测⚠️ 待验证论文未在 GPT / Claude / Qwen 上实验论文公开代码/复现脚本⚠️ 待验证arXiv 2606.18746 编号未在公开搜索中匹配到现在做 Agent很多人一上来就会讨论记忆系统。短期记忆、长期记忆、向量数据库、用户画像、历史对话、工具调用记录、任务状态、RAG、反思日志、episodic memory、semantic memory……这些词都对但容易把问题搞偏。真正核心的问题不是Agent 能不能存很多东西而是一个真正能跨任务、跨环境工作的 Agent最低限度必须记住什么arXiv 2606.18746 这篇论文《What Must Generalist Agents Remember?》就是围绕这个问题展开的。它不是一篇工程教程不是教你怎么搭建 Redis Vector DB Memory Manager。它更像是在给 Agent 记忆建立一套理论底座如果一个 Agent 想在多个环境和多个目标中保持接近最优的行为它的内部记忆必须包含哪些信息。这件事非常重要。因为现在很多 Agent 系统里的记忆其实只是外部存储把历史对话、工具返回、网页内容塞进数据库之后再检索出来。这样做当然有用但它没有回答更深的问题哪些记忆对决策必要哪些只是日志哪些会让 Agent 更聪明哪些反而会制造噪声这篇论文给出的答案可以概括成一句话Agent 的记忆不是资料库而是用来消除隐藏状态不确定性的内部世界表征。为什么只看当前输入不够先用一个简单例子。假设你走到一个岔路口眼前画面完全一样左边一条路右边一条路。但存在两个不同世界在世界 A 里左边通向出口。在世界 B 里右边通向出口。问题是你现在看到的画面完全一样。只看当前观察你无法判断自己在哪个世界。如果你之前走过一段路发现某些动作的结果和世界 A 更像那么你就应该记住这个信息。到了岔路口时你不能只看当前画面还要结合之前经历判断我现在大概率处于世界 A所以应该走左边。这就是记忆的必要性。很多现实 Agent 场景也是这样同一句用户指令在不同业务状态下含义不同。同一个页面按钮在不同系统版本下行为不同。同一个 API 返回字段在不同租户配置下解释不同。同一个机器人动作在不同地面材质、不同光照、不同设备状态下结果不同。如果 Agent 只看当前输入它会把这些状态混在一起。表面上看是推理错误本质上是没有记住足够的上下文。论文把这种情况叫作隐藏域问题。Agent 面对的环境有一些隐藏变量当前观测不直接告诉它但这些隐藏变量会影响最佳动作。所以 Agent 必须从历史轨迹中推断隐藏域并把这个推断结果保存在记忆里。通用 Agent 面对多个目标和多个环境这篇论文讨论的是 generalist agent也就是通用型 Agent。它不是只解决一个固定任务而是要在多个目标、多个环境中都表现良好。这里有两个维度。第一目标不同。比如机器人有时要去厨房有时要去卧室办公 Agent 有时要查订单有时要改配置有时要生成报表代码 Agent 有时要修 bug有时要重构有时要写测试。第二环境不同。比如机器人所处房间布局不同业务系统的租户配置不同API 版本不同数据库状态不同用户权限不同外部工具的行为发生变化。论文关心的是当 Agent 不直接知道自己处于哪个环境时它如何仍然做出正确动作更准确地说Agent 只能看到自己的历史轨迹之前看到了什么、做了什么、得到了什么反馈。它没有一个明确的当前环境 ID。这就要求 Agent 的记忆承担一个任务把历史轨迹压缩成对当前决策有用的内部状态。这不是简单地保存所有历史。保存所有历史太贵也不一定有效。真正有价值的是保存那些会影响未来动作选择的信息。第一层结论记忆必须区分隐藏环境论文的第一个关键结论可以翻译成如果两个隐藏环境在同一个观测状态下要求不同动作那么一个足够成功的 Agent 必须在记忆中区分它们。这句话很简单但分量很重。它说明记忆不是可选模块而是某些任务里的必要条件。继续用岔路口例子在世界 A到了岔路口应该向上。在世界 B到了岔路口应该向下。如果 Agent 到达岔路口时内部记忆状态在 A 和 B 中完全一样那么后面的策略头看到的输入也一样。既然输入一样它就只能输出同一种动作分布。但 A 和 B 需要相反动作。于是它不可能在两个环境里都表现好。所以只要 Agent 想同时处理 A 和 B它在岔路口前必须已经把我现在更像处于 A 还是 B编码进记忆。这就是论文说的 memory separation记忆分离。它不是说记忆里必须写一个明确字段{domain:A}它可以是神经网络 hidden state 中的隐式表征也可以是工程系统里的状态变量也可以是历史窗口也可以是显式 belief state。形式不重要关键是它必须让后续策略能区分这两种情况。换成工程语言就是只要同一个输入在不同上下文下需要不同处理逻辑那么上下文差异必须进入 Agent 的决策状态。否则系统必然出现同样输入下行为冲突。第二层结论记住控制相关信息而不是所有信息这里要避免一个误解Agent 不是为了记住环境标签而记住环境标签。论文强调的是 control relevance也就是控制相关性。两个环境可能底层机制不同但如果它们对当前任务的最优动作没有影响那么 Agent 不一定需要区分它们。比如两个服务器部署区域不同但 API 行为完全一样两个用户来自不同城市但当前任务只是生成一段通用文本两个机器人电池型号不同但当前动作策略不受影响。这种差异不一定需要进入记忆。反过来只要某个隐藏差异会改变最优动作它就必须被记住。这对工程设计很有启发。很多 Agent 记忆系统喜欢什么都存用户说过的话、工具返回、页面内容、历史任务、偏好、失败记录、日志摘要。问题是存得多不等于记得好。真正应该优先进入记忆的是会改变下一步动作选择的信息。会改变工具调用参数的信息。会改变任务分支的信息。会改变风险判断的信息。会改变权限、约束、目标解释的信息。会改变环境动态预测的信息。比如一个代码 Agent 在修项目时真正关键的记忆不是用户三分钟前说了某句话而是当前项目使用什么技术栈。哪些文件已经改过。哪些测试失败过。哪些接口存在兼容约束。用户明确禁止改哪些模块。当前 bug 的复现路径是什么。某个工具调用失败的原因是什么。某个依赖版本是否有坑。这些才是控制相关记忆。第三层结论从价值预测到局部世界模型论文第二个关键结果更深一层。它说如果 Agent 的记忆足以预测一类相关目标下的 action-value也就是某个动作在当前状态下有多好那么这份记忆就不仅仅是在帮 Agent 选动作它还包含了足够信息可以近似重建局部环境动态。换句话说如果记忆能支持 Agent 判断做这个动作会带来什么价值那么它往往也隐含了做这个动作会导致什么变化。这就是世界模型的味道。一个真正强的 Agent不只是知道我该点哪个按钮而是隐约知道点这个按钮之后系统会进入什么状态。调用这个 API 后哪些字段会变化。机器人向左转之后视角会怎么变。执行这个 SQL 后数据会受到什么影响。修改这个文件后哪些测试可能受影响。论文把这叫作 local interventional dynamics也就是局部干预动态。干预这个词很关键。Agent 的动作不是旁观世界而是在改变世界。它点按钮、调 API、移动机械臂、改代码、写数据库本质都是对环境做干预。所以 Agent 的记忆如果足够强就应该支持一种预测在当前隐藏环境和当前状态下如果我执行动作 a下一步世界大概会怎么变化这比简单的历史检索高级很多。历史检索回答的是“以前发生过什么”世界模型回答的是“如果我现在这么做会发生什么”Agent 真正需要的是后者。论文实验ForkWorld 岔路口世界为了验证理论论文设计了一个很小但很干净的实验环境ForkWorld。它是一个 T 形岔路口网格世界。Agent 从走廊出发最后到达一个岔路口。目标可能是去上方终点也可能是去下方终点。目标是可见的但隐藏环境不可见。关键在于不同隐藏环境会改变向上 / 向下动作的含义。在正常环境中向上就是向上。在交换环境中向上和向下的效果可能被交换。所以到了岔路口Agent 不能只看当前位置和目标。它还必须知道当前处于哪种隐藏环境。而这个隐藏环境只能通过之前的动作反馈推断出来。论文比较了几类 Agent无记忆 DQN只看当前状态和目标。Stacked DQN看一个有限历史窗口。DRQN用 GRU 处理轨迹把 hidden state 当成隐式记忆。Oracle DQN直接给它隐藏环境标签。Oracle DRQN既有记忆又有环境标签。结果很符合直觉也符合理论。无记忆 Agent 做不好因为同一个岔路口观测在不同隐藏环境下要求不同动作它的 Q 函数会收到冲突训练信号。带记忆的 Agent 能通过之前的轨迹推断隐藏环境表现显著更好。Oracle Agent 表现最好因为它直接知道隐藏域不需要从历史中猜。更有意思的是作者还做了 probe 实验他们从 Agent 的内部表示中训练一个简单分类器看能不能预测当前隐藏环境。第一次到达岔路口时大家都猜不出来因为之前还没有足够信息。这个结果合理。但当 Agent 探索过某条路再回到岔路口后带记忆 Agent 的内部表示就能被用来识别隐藏环境而无记忆 Agent 仍然不行。这说明带记忆 Agent 的 hidden state 里真的编码了隐藏域信息。对 LLM Agent 的启发虽然论文使用的是强化学习和网格世界但它对 LLM Agent 很有参考价值。现在很多 LLM Agent 系统的问题不是模型不会推理而是状态管理混乱。比如一个业务 Agent 负责处理订单。用户说“帮我把刚才那个订单取消。”当前输入只有一句话。如果 Agent 不记得刚才那个订单是哪一个就无法行动。这是上下文引用记忆。再比如用户说“还是按上次那个规则处理。”这要求 Agent 记得上次规则。这是任务偏好或工作流记忆。再比如 Agent 调用一个内部 API发现某个租户字段名和默认文档不一致。如果它不记住这个租户的特殊行为后续还会反复失败。这是环境动态记忆。再比如代码 Agent 修 bug第一次运行测试失败发现原因是某个 mock 数据缺字段。它如果不记住这个失败原因就可能在后续修改中重复踩坑。这是轨迹经验记忆。从论文角度看这些记忆都不是聊天记录而是隐藏状态推断。LLM 当前上下文窗口只是观测的一部分不等于真正的记忆。真正的记忆应该把历史压缩成可行动的状态。可以把 Agent 记忆分成四层结合这篇论文可以把工程上的 Agent 记忆分成四层。第一层是上下文引用记忆。它解决这个、刚才、上次、那个文件、这个订单指什么的问题。没有这一层Agent 连用户当前指令都解析不完整。第二层是任务状态记忆。它解决当前任务进展到哪一步的问题。比如已经收集了哪些参数、调用了哪些工具、哪些步骤完成了、哪些步骤失败了、下一步应该做什么。第三层是环境区分记忆。它解决我现在处于哪种隐藏环境的问题。比如当前用户权限、租户配置、API 版本、系统状态、设备状态、网络状态、业务规则差异。这正是论文第一条理论结果强调的部分如果不同隐藏环境要求不同动作记忆必须把它们分开。第四层是局部世界模型记忆。它解决如果我执行这个动作环境会怎么变化的问题。比如调用接口后订单状态如何变更修改代码后哪些测试会受影响机器人移动后位置如何变化生成内容后用户审核链路会怎么走。这对应论文第二条理论结果如果记忆足以支持价值预测它就可能支持局部转移动态的解码。这四层不是数据库表设计而是认知功能划分。工程实现可以很不同短期上下文窗口、结构化 task state、向量检索、用户画像、工具调用日志、状态机、RNN hidden state、外部 memory service、world model module、反思总结、运行时 snapshot。但不管怎么实现都应该回答同一个问题这条记忆是否会改变 Agent 的下一步动作如果不会它只是日志。如果会它才是决策记忆。对 AI Agent 系统设计的直接建议第一不要把长期记忆理解成永久保存所有历史。永久保存历史容易造成噪声污染。Agent 需要的是可压缩、可更新、可验证的状态。第二记忆应该围绕决策点组织而不是围绕聊天轮次组织。聊天轮次是交互格式不是任务结构。真正重要的是当前有哪些隐藏变量会影响动作。第三Agent 的 memory schema 应该显式区分几类信息用户目标。任务阶段。已知约束。环境假设。工具行为观察。失败原因。待验证假设。下一步动作依据。第四记忆需要可失效。很多环境信息会变API 版本、用户权限、文件内容、业务状态、页面 DOM、数据库数据。过期记忆比没有记忆更危险。第五记忆需要服务于规划。如果一条记忆不能帮助 Agent 预测动作后果它对复杂任务的价值有限。真正强的 Agent 记忆应该能回答基于我记住的状态下一步这么做会发生什么这篇论文的边界这篇论文不是在解决 LLM Agent 的全部记忆工程问题。它没有告诉你该用向量数据库还是关系数据库。没有告诉你怎么做用户画像。没有告诉你怎么做多轮对话摘要。没有直接评测 GPT、Claude、Qwen 这类 LLM Agent。实验环境也比较小是一个受控的网格世界。但它的价值在于把记忆必要性讲清楚了。很多 Agent 记忆文章停留在经验层面我们觉得 Agent 应该有记忆因为人类有记忆因为长任务需要上下文。这篇论文更进一步在某些条件下记忆不是锦上添花而是近似最优行为的必要条件。只要存在隐藏环境并且不同隐藏环境在同一观测下要求不同动作那么 Agent 必须在内部状态中区分这些环境。这对所有长程 Agent、业务 Agent、机器人 Agent、代码 Agent 都有意义。总结《What Must Generalist Agents Remember?》真正回答的是一个底层问题Agent 的记忆到底是什么它不是单纯的聊天历史。不是越多越好的资料库。不是把所有工具结果塞进向量库。不是用户画像字段的堆砌。Agent 的记忆本质上是把过去的轨迹压缩成当前决策所需的隐藏状态表征。它至少承担三件事第一区分隐藏环境。第二支持价值判断。第三帮助重建局部世界动态。用一句工程化的话概括Agent 应该记住那些会改变行动选择、行动参数和行动后果预测的信息。这就是这篇论文对 Agent 记忆系统最重要的启发。错误速查卡症状根因定位修复Agent 在多租户/多版本环境下反复调用错误接口没有区分隐藏环境记忆检查 memory schema 中是否包含 tenant/version/环境标签在 memory schema 增加环境区分层LLM Agent 长任务中频繁重复犯错失败经验未被压缩成决策状态检查反思日志是否仅停留在文本记录把失败原因升级为任务状态/环境假设条目向量数据库存储量爆炸但命中率低存了大量非控制相关信息审查写入内容是否包含决策影响字段按是否改变下一步动作过滤长期记忆引用过期数据导致错误操作记忆没有失效机制检查是否有时间戳/版本校验为每条记忆增加 source/timestamp增加 staleness 检测同一指令在不同上下文输出冲突策略隐藏环境未进入决策状态probe 实验在不同隐藏环境下模型输出是否一致显式分离环境记忆参考 memory separation 原理作者武子康的个人博客