https://t.co/oZ39c4XZ2r
TL;DR · AI 摘要
强化学习环境中记忆系统的管理对编码代理训练至关重要,harness决定模型可见信息,影响策略更新。
核心要点
- harness控制模型可见信息,直接影响策略更新效果
- AgeMem方法将记忆系统训练到策略中,提升长期表现
- RLHF与记忆系统结合可优化编码代理的决策质量
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- RL环境中记忆系统
- 环境沙盒
- 保存文件/历史/测试记录
- harness机制
- 选择性暴露信息窗口
- 影响策略更新
- AgeMem方法
- 训练记忆系统到策略
- 优化长期表现
金句 / Highlights
值得收藏与分享的关键句。
模型只能看到当前上下文窗口中的信息,harness的决策决定记忆系统的有效性。
AgeMem论文提出将记忆系统训练到策略中,提升长期表现。
harness选择性保留信息,影响策略更新的准确性。
RLHF通过人类反馈优化策略,与记忆系统结合可提升编码代理质量。
mem0 on X: "https://t.co/oZ39c4XZ2r" / X
@mem0ai
$
强化学习环境中记忆的状态
强化学习是目前实验室训练编码代理的主要方式。
环境是一个带有工具的沙盒,奖励是机器可以在没有人工干预的情况下验证的内容:测试通过或不通过。这种可验证的奖励是强化学习在此场景下有效的原因,也是每个实验室都在竞相构建这些环境的根本原因。
单个任务可能涉及数百次工具调用,整个执行过程中沙盒会保留所有内容:文件、Git历史记录、二十轮前失败的测试。
模型几乎无法记住这些信息,因为当前回合唯一能作用的内容是符合上下文窗口的信息。中间件会介入并在每个回合决定哪些历史信息能传递到该窗口。这个决策过程构成了记忆系统,而在强化学习环境中,这种记忆系统正逐渐成为模型训练的一部分,而非开发者手动编写的规则。
本文将探讨这种场景下的记忆机制:环境保留了哪些信息、策略可以查看哪些内容,以及训练编码代理的实验室如何将这些信息传递机制整合到策略本身,并用与任务相同的奖励标准进行评估。
顺便说明一些符号规范:房屋方程使用教学符号标注,论文方程使用论文名称标注。
此处强化学习的运作方式
你执行一次尝试,获得一个分数,然后让导致高分的动作更有可能被选择。这个过程就是强化学习。你改变的是策略。
策略是模型对下一个动作的概率分布。根据其可见的信息,它会为每个可能的下一步动作分配概率:一个标记、一次工具调用、一次写入操作。
在完全可观测的环境中,这是一个马尔可夫决策过程。当前状态已经足够,不需要整个历史。教科书中的策略基于真实状态进行条件判断。AgeMem将映射表示为pi_theta(a_t | s_t)(AgeMem,公式1-2)。
他们的目标是最大化该策略生成的尝试平均得分。他们的奖励函数R可以结合任务质量与记忆质量,减去对无用写入的惩罚。每一步的得分r_t通常为0,最终才会得出总分。
他们论文中的s_t是策略所依赖的状态。本文中保持s_t表示沙盒,用o_t表示窗口内容。
在编码代理中,策略无法看到真实状态。它只能看到中间件构建的窗口。沙盒仍然保存着文件、Git历史记录和测试信息。模型只有在中间件将这些内容放入窗口时才能关注到它们。s_t表示沙盒,h_<t是原始对话记录。M_t表示以更持久形式保留的内容:摘要、文件、存储行或隐藏状态。H表示中间件。中间件构建了模型在当前回合唯一能关注的内容。
策略永远只能看到o_t。本文中提到的记忆就是中间件放入窗口或排除在窗口之外的内容。如果中间件错误地排除了关键信息,后续更新将基于错误的信念进行计算。
得分仍然在最后才会出现,因此更新过程必须明确指出哪些早期动作值得奖励。后续文章中将介绍两种常见的处理方式,它们都涉及延迟奖励的机制。
Chat RLHF 是简化版:一次回复,一次评分。@cursor_ai 和其他团队描述的编码设置是完整版。涉及数百次工具调用。测试运行时进行评分。Cursor 发布的 Doom 案例:170 轮交互,超过 10 万 token 被压缩至约 1000 个(Cursor)。他们对代码进行压缩是因为评分结果可验证,无需在每个步骤都依赖人工。
@cursor_ai 在生产工具(读取、编辑、grep、终端、语义搜索)上使用数以万计的并发沙箱训练 Composer,并将该工具链视为训练环境(Cursor)。
策略从不直接接触真实世界
教科书中的循环假设策略能观测到真实状态。此处策略仅能观测到工具链构建的窗口,因此相同循环只能部分被观测。
CompactionRL 将工具链实际保留的历史记录表示为(CompactionRL,式 6)。其中的 s 是系统提示,而非沙箱。o_i 是工具结果,而非本文所称的 o_t 整个窗口。
u 是用户指令,a_i 是助手步骤。他们将每个助手-观测对视为原子单元,因此摘要切割无法将工具调用与其反馈分离。
在编码代理的语境中,o_t 是按顺序排列的完整上下文窗口,不是 token 网格中的一个单元。系统提示和工具模式位于窗口前端,因为工具链将其放置于此。它们是同一列表的前缀片段,而非独立的内存类型。
当工具链用摘要替换旧轮次时,这些轮次将从窗口中消失。剩余内容包括摘要加上切割后到达的原始轮次。grep 命中是该列表中的一个工具结果。
GPU 内存、KV 缓存和激活检查点是将长序列计算适配到 GPU 的方式。参数化内存是权重中的知识,但本文不涉及这些内容。此处引用的第一方帖子未描述将中间序列权重更新作为仓库约定的存储方式。跨轮次持久化的内容位于前向传播之外。
工具链即训练环境
工具链位于策略与环境之间。每轮交互中,它会组装 o_t,对沙箱执行工具调用,管理窗口,并返回 r_t(通常延迟返回)。管理窗口包括压缩、检索、写入注释或生成子代理。
@cursor_ai 将此称为“提供给模型的指令和工具”,并将其视为产品:CursorBench 离线测试、A/B 测试在线运行、生成代码保留率、每周自动化从日志中提交工具链缺陷(Cursor)。@OpenAI 发布的 Codex 循环是同类机制:构建提示、采样、运行工具、追加结果、重复(OpenAI)。
@cursor_ai 的公开立场是生产工具链即训练环境(Cursor)。若训练使用的工具集、压缩规则或观测格式与生产环境不同,策略将优化与实际观测不同的目标。下方循环是该组合的一个回合。
当剩余预算低于阈值时,他们会压缩内容:生成摘要,然后从系统提示加摘要加短原始尾部恢复(CompactionRL,式 7–9):
C 是上下文预算。q_sum 是固定摘要指令。k 默认保留最近 2 步原始数据。切割后,后续动作基于 h_bar_t,而非被丢弃的前缀。若 S_t 省略了文件路径,后续回合将无法恢复该路径。
实时强化学习改变了 Cursor 对环境的定义。模拟沙盒再现的是计算机而非用户,因此它们会提供检查点、读取生产信号,并在约五小时内重新部署(Cursor)。
Auto 后端的 Composer 1.5:持久化编辑 +2.28%,不满意后续操作 −3.13%,延迟 −10.3%。同一篇帖子还描述了奖励机制如何被破解。
丢弃无效的工具调用时,模型会在预期失败的任务中发出错误调用,因此永远不会收到负奖励。奖励机制进行编辑时,模型会提出澄清问题而非直接修改。这两个问题已在奖励机制中修复,而非提示词中。他们今天描述的反馈周期在1小时内,未来循环周期为每隔数小时。
M_t 的位置
这篇帖子使用了四个座位而非光谱。每个座位代表对哪一层允许遗忘的声明。下方的系统使用了超过一个座位。哪些座位被训练尚未确定。
- 上下文窗口
工作记忆。有限,受 Anthropic 描述的上下文腐烂影响。@AnthropicAI 的表述仍是最佳方案:有限的注意力预算,最小的高信号标记集合,使下一步操作更可能正确(Anthropic)。
当窗口填满时,已发布的工具包会进行压缩。Cursor 描述了通过提示进行总结并继续的方法。OpenAI 的 Compaction API 返回新的项目列表和一个不透明的加密内容 blob,文档说明该内容保留潜在状态(OpenAI)。压缩是生命周期为一个窗口的记忆。
这是 @cursor_ai 训练的座位。Composer 生成到标记触发器(已发布测试中为 80k 和 40k),接收合成的总结查询,编写压缩后的上下文并继续。最终的编码奖励应用于链中的每个标记,包括总结内容。与高度调优的提示基线相比:压缩错误减少 50%,标记数量减少五分之一,~1,000 标记的总结替代 ~5,000(Cursor)。已发布案例是 Terminal-Bench 2.0 make-doom-for-mips:早期检查点运行了 170 轮,将超过 100k 标记压缩到 1,000 标记状态(系统调用映射、PIC 入口崩溃、V8 OOM、0x400150 处中止),下一阶段需要该状态。
他们还训练了检索到 o_t。语义搜索嵌入器在代理轨迹上拟合。LLM 对哪些片段应更早检索进行排序;嵌入器匹配这些排序而非通用代码相似性。+12.5% 的问答准确率(按模型从 6.5–23.5%)。语义搜索可用时在线保留率 +0.3%,在 1,000+ 文件的仓库中 +2.6%(Cursor)。
@OpenAI 未发布 RL 训练的摘要器。他们已发布保留推理加压缩使 GPT-5.6 Sol 在 ARC-AGI-3 上从 13.3% 提升至 38.3%,输出标记减少 6 倍(OpenAI)。这是足以推动前沿评估的显著结果。
CompactionRL 是独立论文,采用与 Cursor 自我摘要相同的信用规则(摘要标记的最终任务奖励),而非 Cursor 的论文。冻结执行代理(GLM-4.7-Flash),仅替换摘要器:SWE-bench Verified pass@1 从 49.0(Qwen3-30B-A3B 摘要器)提升至 55.5(Qwen3.5-27B),+6.5(CompactionRL,表 1)。他们的 SWE-bench 数据基于 200 实例子集。然后他们在 PPO 下联合训练执行和摘要标记。他们未添加摘要质量奖励。任务奖励是唯一指标。为什么压缩后的 rollout 不能使用一组已完成尝试作为基线,因为奖励存在延迟。
- 文件系统
/
环境内存。笔记、进度日志、Git、功能列表、磁盘上的终端输出。由于从未处于上下文中,因此在上下文重置后仍能存活。
@cursor_ai 将动态上下文发现作为其方向:减少静态提示,增加即时读取。将MCP工具描述同步到文件夹并在按需加载时,对于调用MCP工具的运行,减少了46.9%的token使用量(Cursor),但安装的MCP数量差异较大。
@AnthropicAI 将此作为长期运行代理的协议。仅靠压缩并不足够:一个全新的Opus在收到“构建claude.ai克隆”指令时,可能会一次性完成应用并中途崩溃,或者稍后进入并宣布任务完成。初始化器会编写init.sh、claude-progress.txt和一个JSON格式的功能列表(使用JSON是因为模型会覆盖Markdown)。后续会话读取这些工件,实现一个功能,提交后记录所做操作(Anthropic)。该层已投入生产,但策略未经过训练,也未公开。
Prime Intellect 的 Environments Hub 将“评估长期任务中文件系统和内存的使用情况”列为一个大胆的评估目标(Prime Intellect)。INTELLECT-3 的未来工作是开发一个模型,能够切割上下文、分支到隔离的子提示,并通过端到端学习维护轻量级的外部内存(Prime Intellect)。
_ ___
- 外部存储
添加、更新、删除、检索、作用域。这是大多数产品说明中所指的代理内存。它比发布版本的生命周期更长,可以作用域到用户、代理或仓库。启发式版本是提示选择一个CRUD动词。Memory-R1、Mem-α 和 AgeMem 针对任务(或任务加内存)奖励训练了该选择。
Mem0 论文是后续论文训练的写时操作符集合的来源:ADD、UPDATE、DELETE、NOOP。Memory-R1 引用该集合并称其为“一个最小但表达性强的框架,用于建模内存动态”。他们训练了一个动词选择器。他们还报告 Mem0 是 LoCoMo 上的生产存储基线,与 A-Mem、MemoryOS 和 LoCoMo RAG 并列。AgeMem 后续以相同方式使用官方 Mem0 实现(AgeMem)。存储保持不变,未训练的选择器是他们替换的内容。
内存管理器是该动词集合上的策略(Memory-R1,公式1、5)。这里的 o 是动词,而非窗口。
x 是提取的事实,M_old 是当前的银行,m' 是提议的内容。发布的奖励是后续答案的精确匹配,而不是动词的得分。在管理器训练期间,答案代理被冻结。
他们训练的失败模式是未训练的选择器,而非存储本身。用户采用 Buddy,之后使用 Scout。普通管理器发出 DELETE+ADD 并拆分一个事实。训练后的管理器发出 UPDATE,这是 Mem0 论文已经定义的动词。奖励不是动词本身,而是后续问题变得可回答。
Mem-α 在核心、情景和语义分割的存储上训练插入/更新/删除。论文中使用强化学习的原因:即使是一个强大的教师在内存工具选择上也不可靠,因此他们优化问答和内存质量指标。在最多30k token的序列上训练,他们报告策略在超过400k token时仍有效。
AgeMem 将存储操作和窗口操作放在一个策略上。三阶段强化学习(先存储,再窗口,最后两者)和逐步GRPO,使延迟奖励能够到达早期的内存工具调用。与官方 Mem0/A-Mem 相比:Qwen2.5-7B(41.96%平均)提升4.82个百分点,Qwen3-4B提升8.57个百分点。与相同工具未训练版本相比:提升8.53和8.72个百分点。训练后,检索频率下降,添加/更新频率上升。
- 紧凑的内部状态,或一个 REPL
MEM1 每个回合都会丢弃不断增长的上下文,并保持一个既是记忆又是推理的共享状态。7B 在 3.7 倍更少的内存消耗下,于 16 个目标的多跳问答任务中实现了 14B 指令模型 3.5 倍的性能,训练时使用了 2 个目标的组合。论文自身的局限性:并非稀疏、延迟奖励环境下开放式编码的解决方案。
Prime Intellect 的递归语言模型将提示信息存入 Python 堆栈。根模型通过代码切片自己的历史记录;只有子 LLM 调用工具,因此根模型不会摄入原始工具输出(Prime Intellect)。他们的立场是:摘要会导致信息丢失,而这种框架才是下一步应进行强化学习训练的对象。框架已发布,训练尚未进行。
这四个方面是关于 M_t 应该存在的位置的主张:压缩窗口、构建环境、学习存储 API、将记忆融入推理或 REPL。这些主张尚未在一个长期编码环境中进行过比较。
@cognition 发布的检索工作位于窗口和搜索子策略之间,而非第四位置。在 Windsurf 和 Devin 的第一回合中,超过 60% 的操作是检索。SWE-grep 是为此任务训练的模型:每回合最多进行 8 次并行的 grep/glob/read 调用,最多 4 回合,奖励是文件级和行级的 F1(Cognition)。其设计是隔离:父模型应看到检索到的片段,而非完整的搜索轨迹。
写入操作会在后续进行评估
图示而非测量对:在长序列展开早期的一次写入,以及最终的测试。Cursor 的 Doom 案例运行了 170 回合。直到测试前,环境对那次写入没有反馈。已发布的编码奖励是对尝试的标量评估。测试通过了,或者没有通过。
这个差距就是延迟奖励。这是长轨迹上的常规强化学习问题。这不是 Cursor 的术语,也不特定于压缩。Sutton 和 Barto 将这种差距称为时间信用分配:哪个早期动作导致了后续得分。内存写入是一种动作,其回报会延迟到来。
在聊天 RLHF 中延迟较短。一次回复,一次评分。一次糟糕的内存写入就是本轮的糟糕回答。在上述代理设置中,内存写入的评分取决于它是否使后续观察成为可能。如果压缩模型遗漏了后续回合需要的事实(Cursor 发布的摘要保留系统调用映射是有原因的),最终得分可能为 0,而写入操作仍然是原因。奖励函数中无需明确提及写入操作。
延迟评分仍需明确哪个早期动作应得此分。PPO 和 GRPO 是实现此目标的两种方法。
PPO(Schulman,如 CompactionRL 所写)保留第二个网络,即评估器 V,用于猜测当前时刻的好坏。优势值表示该动作比评估器预期的好多少。正值意味着增加权重。PPO 还跟踪新策略如何改变该动作发生的概率。该比例为 rho。限制 rho 以防止一次幸运尝试主导结果。GAE 从发生事件与评估器猜测之间的差距反向传播,使早期写入可以共享后期测试得分。CompactionRL 将评估器输入表示为 x_t。
GRPO(Shao,如 Memory-R1 所写)舍弃 V。从同一任务中采样一组 G 个完成的尝试。对它们进行评分。任何高于组平均值的尝试都是赢家。一个 KL 项保持新策略接近旧策略。
PPO 需要额外的 V 网络。GRPO 需要一组完成的尝试。
CompactionRL 为每个可训练段(包括摘要)分配一个 rollout 级任务奖励,不添加摘要质量奖励(CompactionRL,§4.1)。两个失败点需要克服。一个 rollout 被分割成可变数量的执行和摘要段后不再是单一的组样本,导致 GRPO 的完整尝试组机制失效。紧凑型摘要可能看起来像是 episode 结束,因此早期摘要会被视为在分割点处测试完成。标记级损失(公式 12)防止长紧凑型 rollout 主导批次。跨轨迹 GAE(公式 14)将晚期得分传递到分割点。它们根据紧凑型之后剩余的工作量对晚期得分进行折扣,然后计算 A_hat。
N_>s 表示段 s 之后优化的标记数量。AgeMem 使用不同估计器实现相同延迟:中间 r_t 通常为 0,然后逐步 GRPO 将终端组优势广播到所有更早的内存步骤(AgeMem,§3.1):
相同延迟正是 Memory-R1 的 Buddy / Scout 示例重要的原因。以下数字是内部演示而非论文表格:四个事实到达后,接着四个问题,R 仅在最后分配。两种写入策略,均未经过训练。
启发式方法在局部整洁。第二个狗看起来像矛盾,因此删除 Buddy 并写入 Scout。一个动作看起来像矛盾,因此删除 Lisbon 并写入 Berlin。四个后续问题中有三个失败。UPDATE 保留两只狗并保留 Lisbon 作为历史。动词不是评分标准。后续问题才是评分标准。
这就是一个内部数字中的记忆训练问题。你无法从操作发出的回合中标注正确的操作。你只能对写入操作使能的轨迹进行评分。
两种估计器正在使用中。它们以不同粒度回答相同约束(晚期 R(tau) 必须到达写入点)。
目前没有公开的迁移研究比较两者。两者都回答相同约束:时间 t 的记忆操作必须由 episode 返回进行评分。
RL 环境中的 Mem0
Mem0 是第三个座位:当 harness 构建下一个窗口时读取的外部存储,当策略发出记忆操作时进行写入。它不是沙盒,也不是窗口。
Mem0 论文定义了 Memory-R1 训练的操作符集。AgeMem 报告官方实现作为学习策略需要超越的基线,这是通常关系:存储是接口,选择器是你可训练的部分。本节其余内容说明如何构建 Mem0 产品:论文动词与产品端点。
在 RL 环境中的位置:
连接方式:当 harness 构建下一个窗口时搜索 Mem0。策略发出产品已实现的动词。提示头也可以执行相同任务。写入操作在后续问题回答时进行评分,与 Memory-R1 使用的规则相同。
作用域是观察的一部分
Mem0 通过四个字段隔离记录:user_id、agent_id、app_id、run_id。user_id=alice 的行与 user_id=alice 且 agent_id=composer 的行是不同记录。它们在写入时不会合并。
将它们用作生命周期,而非每次调用时都转储 ID。
作用域是 Mem0 保持一个用户事实不进入其他代理上下文的方式。默认提取将事实归因于一个说话者(user_id 或 agent_id,而非两者);在 infer=True 写入后 AND 这两个字段会按设计返回空。上述写入路径是 infer=False 并可在一行中设置两个字段。按你写入的方式进行过滤。
编码的 RL 环境应将 run_id 视为回合内存(本次尝试的系统调用映射),将 user_id 视为仓库或用户内存(跨尝试的持久约定)。不要将回合草稿写入用户作用域。奖励分配后不要保留 run_id 行。delete_all(run_id=...) 是回合重置操作。
框架应如何调用它
存储不是转录文本的简单倾倒。策略(或小型内存头)提出一个动词和一个事实。框架执行该动词,然后在下一次组装时搜索并拼接匹配项到 o_t 中。
存储中应包含的内容:后续观察需要但窗口会丢弃的持久事实。系统调用映射。失败的测试名称。用户偏好。仓库约定。不应包含的内容:原始工具转储、长 grep 跟踪、思维链。这些内容会保留在历史记录中直到压缩,或作为环境内存写入磁盘。
重排序操作在文档中记录为约 150-200 毫秒额外开销。除非精度是瓶颈,否则不要在热路径上执行重排序。Mem0 搜索默认参数为 top_k=10,threshold=0.1,rerank=False。限制 top_k 并将匹配项格式化为短块,而非第二个转录文本。
训练与存储的分工
存储仍需执行动词而不产生重复条目,不返回仅相似的记录,不将一个用户的事实泄露到其他代理的上下文中,且在事实被替代时不会丢弃历史记录。这不是策略的工作。
策略的工作是选择器:根据 o_t 决定 ADD 或 UPDATE 或 DELETE 或 NOOP。Memory-R1 使用 PPO 和 GRPO 与精确匹配 QA 训练了该选择器。AgeMem 与窗口操作联合训练了它。你可以先部署未训练版本(提示动词,infer=False),之后再将选择器与任务的相同奖励对齐。
如果你进行训练,除非你是 AgeMem 或 Mem-α(它们添加了内存质量项),否则保持任务奖励不变。CompactionRL 和 Memory-R1 不添加:CompactionRL 仅使用任务奖励;Memory-R1 使用精确匹配 QA(Judge-as-reward 变体损害了 F1 和 BLEU)。上面的 Buddy/Scout 运行采用了相同思路:DELETE+ADD 在局部看起来干净且得分 0.25。
从早期选择估计器:如果写入与代码位于同一链中,所有 token 使用相同最终奖励;如果写入是离散工具步骤,则使用逐步 GRPO。压缩仍会破坏 GRPO 的完整展开组。
环境记住,窗口遗忘。Mem0 是框架侧的存储:作用域限定、可搜索,并且已经塑造成 2026 年论文训练的动作空间形态。一个无法适应窗口且不会作为文件存在的事实,仍会传递到下一个观察中。
希望你喜欢这个长篇大论!
相关阅读
你的代理压缩器比上下文窗口更重要
代理框架塑造 RL 循环
代理为何开始做梦
代理框架中的内存现状
参考文献
Cursor: Composer,使用 RL 构建快速前沿模型
Cursor: 为更长视野训练 Composer
Cursor: 通过实时 RL 提升 Composer
Cursor: 持续改进我们的代理框架
Cursor: 动态上下文发现
Cursor: 通过语义搜索改进代理
Cognition: SWE-grep
OpenAI: 解开 Codex 代理循环
OpenAI: 压缩 API
OpenAI: Codex 作为平台
Anthropic: AI 代理的有效上下文工程
Anthropic: 长期运行代理的有效框架
Prime Intellect: 环境中心
Prime Intellect: INTELLECT-3
Prime Intellect: 递归语言模型
Memory-R1 (arXiv:2508.19828, ACL 2026)
Mem-α (arXiv:2509.25911)
AgeMem (arXiv:2601.01885)
MEM1 (arXiv:2506.15841)
CompactionRL (arXiv:2607.05378)
Mem0 论文 (arXiv:2504.19413)
/$
下午5:21 · 2026年8月27日
7.9K
浏览量
7
87
100