JAM:带运行时 Agentic Research 的"准时制" Agent 记忆
- 关联论文:2609.34385
- 作者:flyP
- 更新:2026-09-30
一句话结论
JAM(Just-In-Time Agent Memory)把"记忆构建时机"从请求到达前的 AOT(ahead-of-time)搬到请求到达后的运行时,由一个 Memorizer 保留全量原始历史、一个 Researcher 在每次请求时检索/检视/整合证据,配合 Memory-Gym 合成数据 + verified-trajectory SFT + Hint-guided GRPO 训练,使最终系统在多个 agent memory 与 long-context 基准上同时取得 更强任务性能 和 比已训练 agentic memory 系统更高的效率。
解决什么真问题
现有 agent 记忆系统几乎都是 AOT 设计——在请求还没来时就离线把对话压缩成"记忆卡片"。这种做法有两个本质代价:
- 细粒度信息在压缩阶段被丢弃,而这些信息在某些请求里恰恰是最关键的;
- 离线构建本身不便宜:要么靠 LLM 总结,要么靠图谱抽取,token 与延迟成本都会前置吃掉一部分 serving 预算。
JAM 的核心反驳是:为未知的未来查询提前构建记忆,注定要做很多无用功。 把记忆构建推迟到请求已知时,按 query 条件构造 context,反而能让"该花的 token 花在刀刃上"。
核心方法
1. 双组件架构:Memorizer + Researcher
原始对话流 请求到来
│ │
▼ ▼
┌─────────────────┐ ┌────────────────────────┐
│ Memorizer │ │ Researcher │
│ │ │ │
│ • 写入全量原始 │ ◄────── │ • 迭代:检索/检视/整合 │
│ history 到 │ context │ • 读 page-store + 摘要 │
│ hierarchical │ 检索 │ • 调用 Memorizer 工具 │
│ page-store │ │ • 产出最终回答 │
│ • 维护 compact │ │ │
│ navigational │ │ │
│ summaries │ │ │
└─────────────────┘ └────────────────────────┘
- Memorizer:负责"原样存档 + 元信息索引",不做语义压缩。它把对话切成页(hierarchical page-store,类似文件系统层级),每层附带导航摘要但完整内容可读。它的存在保证了"没有信息在写入阶段丢失"。
- Researcher:在每次请求时启动,当作 agent 自己调用工具去翻页:打开某页 → 读摘要决定是否值得展开 → 拿证据 → 再翻下一页 → 整合进答案。它把"如何用记忆"建模为工具使用行为。
2. 训练流程:Memory-Gym + SFT + GRPO
论文的训练管线分三段:
- Memory-Gym 数据合成:覆盖 9 类任务 × 6 个领域 的证据驱动合成数据。每条样本都带"哪些原始 page 是真实证据"的强标注,给监督信号兜底。
- Verified-trajectory SFT:先用带正确解题轨迹的样本对 Researcher 做监督微调。注意"verified"——轨迹必须真用对证据,不靠 LLM 自评。
- Hint-guided Group Relative Policy Optimization (GRPO):在 SFT 之后用群体相对策略优化继续训练,并用 hint 信号(任务类型提示)约束 group 内样本的同质性,避免 GRPO 退化到 trivial 策略。
伪代码:
# 简化训练循环
for batch in memory_gym:
trajectories = [researcher.rollout(task, hint=h) for h in batch.hints]
verified = [t for t in trajectories if t.uses_evidence(batch.evidence_set)]
loss_sft = sft_step(researcher, verified)
rewards = [t.reward(batch.evidence_set, batch.answer) for t in verified]
loss_grpo = grpo_step(researcher, trajectories, rewards, hints=batch.hints)
update(researcher, loss_sft + loss_grpo)
关键实验与数据
abstract 给出的核心结论(具体榜单数字原文未明确):
- 任务性能:JAM 在多个 agent memory 与 long-context 基准上强于 AOT 风格记忆系统。
- 效率:相比之前已训练的 agentic memory 方法,显著更高效(具体 token/latency 倍数 abstract 未给,原文未明确)。
- 训练数据:Memory-Gym 覆盖 9 类任务 × 6 领域。
值得标注的几个"未明确"细节:
- 论文 abstract 没有给出与 Mem0 / LangGraph / Hindsight 的具体差距数字。
- Researcher 的 base model(推测是 Qwen 或类似开源模型,但 abstract 未点名,原文未明确)。
- GRPO 的 hint 具体形式(prompt 级 / 通道级)原文未明确。
亮点与局限
亮点
- 范式切换:把"何时构建记忆"从 AOT 搬到 JIT,是这一轮 agent 记忆系统里少见的范式级改动。
- 训练数据工厂:Memory-Gym 把"如何造证据驱动 agent 训练样本"做成可复用管线(9 任务 × 6 领域),为后续工作留下方法学锚点。
- verified-trajectory SFT:先做事实正确性过滤再 SFT,避免 GRPO 阶段被错轨迹污染——这是一个反直觉但关键的工程取舍。
- 开源承诺:代码仓库
VectorSpaceLab/general-agentic-memory已声明 release,方便复现与基准对齐。
局限
- Memorizer 不压缩 = 写入代价后移:相比 AOT 系统的"一次写完就放着",JAM 把"必须存得下"这件事压到存储层。如果 raw history 极长(万轮对话/天),page-store 会膨胀,需要外部冷热分层(论文未量化存储上限,原文未明确)。
- Researcher 是 agent loop:每次请求走多轮工具调用,端到端延迟天然高于单次检索。abstract 没给 latency 数字,原文未明确。
- Memory-Gym 合成数据 vs 真实分布:9 任务 × 6 领域是合成数据,与真实用户对话的偏置可能差距不小;论文没有报告真实世界长尾样本的退化曲线,原文未明确。
- 没有 PR/IR 维度的对比:abstract 仅强调 agent memory 与 long-context,没有在经典 IR 基准(如 BEIR)上做对照,工程团队难以判断在纯检索场景是否优于 BM25 + reranker。
工程落地建议(5 个具体坑)
- 现象:把 Researcher 的工具调用次数设成无上限; 影响:单请求超时、token 雪崩、GRPO 训练时被截断的轨迹污染经验回放; 修复:硬上限 + 早停信号("已找到关键证据" 或 "证据互相矛盾,请用户澄清"),并把超限样本从 SFT 池里剔除。
- 现象:Memorizer 把全量历史写到单一向量库; 影响:写入吞吐撑不住,召回噪声也跟着大; 修复:用 hierarchical page-store + 段级向量,召回先按页摘要粗筛再展开,符合论文设计意图。
- 现象:Memory-Gym 合成数据被直接当成训练主集、不混入真实日志; 影响:上线后遇到用户口语/俚语/打断的鲁棒性差; 修复:合成 + 真实双源混合,并保留一个"领域 hold-out"集合监控合成偏置。
- 现象:SFT 阶段没有过滤 verified trajectory; 影响:GRPO 阶段学到的不是"用对证据",而是"看起来像在查证据"; 修复:在 SFT 前加 verifier(基于 evidence_set 命中 + 答案比对),不通过的样本降权或丢弃。
- 现象:上线后没有监控"请求-证据"召回质量;
影响:模型悄悄退化为"猜",QA 准确率看不出但用户体验断崖;
修复:埋点记录
evidence_hit_rate、pages_read_per_request、tool_call_count,并在漂移超阈值时触发重训。
对工程落地的启发
- JIT 路线不是用来取代 AOT,而是用来取代"过度的 AOT":如果一个系统每条对话都做总结但 90% 总结从未被召回,那就该考虑把总结推迟到命中路径上。
- Agent memory 的训练数据比模型结构更难:Memory-Gym 这种"带证据锚点的合成管线"是这一波工作的真正瓶颈。
- verified-trajectory 是 SFT 的隐形护栏:很多团队做 agent 训练时直接把 LLM 自评轨迹喂进 SFT,结果学到的不是解题而是话术。
- GRPO 的 group 设计至关重要:hint 信号决定同组样本的相似度,太分散会让 group baseline 失去意义。
与同方向工作的关系
- vs AOT 系记忆系统(Mem0、LangGraph memory、Graphiti):JAM 在 abstract 直接声称"更强 + 更高效",但代价是 Researcher 的推理延迟。两者是"写重 vs 读重"的取舍。
- vs Stashbird(2609.34242):Stashbird 在 ingest 阶段几乎不压缩(同样不丢信息),但它是 offline AOT;JAM 是 runtime JIT。一个把代价压在存储/图层,一个把代价压在请求路径。
- vs EngramRAG(2609.32049):EngramRAG 强调多跳遍历与时间衰减;JAM 不维护图的演化,而是在请求时刻重新构造。EngramRAG 适合"长时间累积同一身份"的场景,JAM 适合"每次请求都要重读证据"的场景。
- vs Toolformer / ReAct 类 agent:JAM 的 Researcher 本质是 ReAct,但把"用什么工具"具象化为"读哪一页 memory",把工具空间从无限 API 收敛到有限 page 集合,搜索空间更可控。
适合谁读
- 做 agent 训练管线 的研究/工程团队:Memory-Gym + verified-trajectory SFT 是一个可直接抄的范式。
- 维护 大规模会话 Agent 的平台架构师:JIT vs AOT 的取舍对成本结构有直接影响。
- 关心 agent 评测 的人:abstract 提到的 "agent memory + long-context" 基准组合是一个值得跟随的信号。
- 做 RAG 高级形态 的应用团队:如果你的检索路径里已经有"读什么文件"的 agent loop,可以参考 JAM 的工具定义方式。
元信息
- arXiv: 2609.34385(v1,2026-09-28 提交)
- 主分类:agent;形态:method
- 训练:Memory-Gym(9 任务 × 6 领域)+ SFT + Hint-guided GRPO
- 代码:
https://github.com/VectorSpaceLab/general-agentic-memory(已声明 release) - 关联关键词:agent memory、JIT context construction、agentic research、GRPO、tool use
工程落地与核查(Jay)
一、事实核查:存疑处标注
| 核查项 | 结论 | 依据 |
|---|---|---|
| 代码仓库可用性 | ✅ 已验证:VectorSpaceLab/general-agentic-memory 仓库 HTTP 200 返回,有 README + 项目描述,与论文摘要所述"anonymized source code"一致 |
2026-09-29 fetch |
| GitHub 仓库内容与论文对应性 | ⚠️ 部分存疑:仓库 README 描述为"general agentic file system framework",包含 text / video / agent trajectory 等多模态 memory,与论文摘要的"Memorizer + Researcher JIT"架构细节对应关系需进一步确认;仓库可能为更通用的多模态框架,JAM 为其子模块 | README 内容与论文 abstract 对照 |
| 任务性能"强于 AOT 系统"具体数字 | ⚠️ 未给:abstract 无具体 accuracy / F1 差值,仅说"stronger task performance" | arXiv abstract v1,2026-09-28 |
| 效率"显著更高"具体倍数 | ⚠️ 未给:abstract 无 token / latency 量化,仅说"substantially more efficient" | 同上 |
| 论文是否在真实世界长尾样本上验证 | ⚠️ 未提及:abstract 仅描述 Memory-Gym 合成数据,未提及真实流量 hold-out 实验 | 同上 |
| GRPO hint 的具体形式 | ⚠️ 未明确:prompt 级还是 channel 级,abstract 未提 | 同上 |
| Researcher base model | ⚠️ 未明确:abstract 未点名,README 提到"compatible with OpenAI, SGLang",推测 base 为开源模型(Qwen/Llama),待 PDF 确认 | 同上 |
| 存储上限(长对话场景 page-store 膨胀) | ⚠️ 未量化:abstract 未提存储上限,万轮/天场景的冷热分层方案未给出 | 同上 |
总体判断:GitHub 仓库 200 OK ✅,但仓库内容与论文架构的精确对应关系需人工核查;核心性能/效率数字abstract 均未给出数字,工程落地引用时需加 ⚠️。
二、可读性精修
- "Researcher"首次出现未翻译:正文中"Researcher"出现多次(§核心方法/§训练流程/§工程落地建议),建议首次出现时括号注明"(研究员/检索 agent)",后文统一用"Researcher"或"检索 Agent",不要混用"检索 agent"、"研究者"等不同译名。
- "JIT"与"Just-In-Time"混用:标题用"Just-In-Time",正文中"JIT"出现一次,建议统一用"JIT(准时制)"并在首次全称后括注简称。
- "verified-trajectory SFT"译法:正文译为"带正确解题轨迹的 SFT",但"verified"在论文中有明确的"基于 evidence_set 验证通过"的专门含义,建议译为"经验证轨迹 SFT"或"证据验证型 SFT",以区别于普通 SFT。
- §关键实验"原文未明确"四处的呈现方式:建议在列表每项前加 ⚠️ 标注,与全文"⚠️ 存疑"风格一致,便于 grep 检索。
三、工程落地:实际系统怎么用,坑在哪
3.1 接入路径
JAM 的 JIT 架构适用于以下场景:
- 证据驱动型对话(客服、诊断、调查):query 答案必须来自对话历史中的具体证据,Researcher 可按需检索
- 长程多轮对话(顾问、陪伴):不需要为每条对话预生成 summary,按请求临时构造 context
- 不想提前消耗 serving 预算做离线总结 的高并发场景
3.2 核心坑点与实测经验
坑点一:Researcher agent loop 延迟无法预测
- 现象:Researcher 是多轮工具调用(读页→判断→再读),单请求延迟取决于"需要翻几页才找到证据",高并发下 p99 延迟可能达到 p50 的 5-10 倍
- 实测数字(参考,⚠️ 存疑):同类 JIT retrieval agent 系统(如 ReAct-style retrieval)在 open-domain QA 上端到端延迟 800ms-3s/p99,JAM 若无截断机制可能更高
- 修复:硬上限 + 早停(见原文 §工程落地建议 1);对延迟敏感场景设置并发上限 + 排队机制
坑点二:GitHub 仓库实际内容与论文描述可能存在偏差
- 现象:仓库 README 描述为多模态(text + video + agent trajectory)memory framework,JAM 论文中的 Memorizer/Researcher 架构是否为仓库主分支主功能,需人工对照 README 与论文 §2
- 判断方法:clone 仓库后搜索
class Memorizer和class Researcher,确认接口签名与论文伪代码一致 - ⚠️ 注:引用仓库前先验证实际 API,避免基于 README 的假设直接开发
坑点三:Memory-Gym 合成偏置未被真实 hold-out 监控
- 现象:训练时用 Memory-Gym 合成数据(9 类 × 6 领域),上线后真实用户对话的 domain / task type / 语言风格偏移,Researcher 退化到"读不到正确 page"
- 实测建议:留出 10-15% 真实对话 hold-out 集合,按周监控 QA accuracy 漂移;合成数据占比建议不超过 50%(Mixing ratio)
- 修复:合成 + 真实双源混合训练后,必须在真实 hold-out 上单独做一次 accuracy 基线测试
坑点四:Verified-trajectory 过滤不完整导致 SFT 被污染
- 现象:SFT verifier 只检查"trajectory 是否使用了 evidence_set 中的证据",但不检查"证据是否被正确理解/整合";Researcher 可能用对了 page 但推理链断裂,verified 仍为 true
- 实测建议:在现有 verifier 基础上加 answer-level 检查:trajectory 使用的 evidence 是否真正支撑最终答案,两项都过才进 SFT 池
- 修复:verifier 扩展为两层:evidence_hit + answer_correctness
坑点五:Memorizer 写入吞吐与 page-store 膨胀
- 现象:Memorizer 把全量 raw history 写入 hierarchical page-store,写入吞吐若 > 1,000 episodes/秒(高并发场景),存储层成为瓶颈
- 实测建议:按 page-store 总容量监控(建议 + 告警阈值 80%);超量时触发冷热分层,把 N 天前的 page 移到对象存储
- ⚠️ 注:JAM 未公开存储上限,万轮/天场景的实际存储量需自行建模估算
坑点六:Hint-guided GRPO 的 hint 泄露风险
- 现象:GRPO 中 hint(任务类型信号)如果与答案过于接近,Researcher 可能学会"读 hint 猜答案"而不是真正检索
- 判断方法:训练集加一个"hint 无意义噪声"对照组,验证带 hint 的 reward 显著高于噪声 hint reward,才能排除 hint 泄露
- 修复:hint 仅包含任务类型标签("multi-hop" / "factoid"),不包含任何答案相关 token;训练时偶尔用 random hint 替换真实 hint 做正则化
3.3 验收标准(推荐)
JAM 上线后,以下指标任一不达标则暂停推广:
| 指标 | 阈值 | 说明 |
|---|---|---|
| End-to-end latency p99 | ≤ 5s | 单请求端到端延迟上限(Researcher 有截断) |
| Evidence hit rate | ≥ 70% | 答案所需 evidence 被 Researcher 命中的比例 |
| Page-store 存储增长率 | ≤ 1 GB/日/千用户 | 存储预算监控 |
| Real hold-out QA accuracy | ≥ 训练集 -5 pp | 合成数据偏置容忍下限 |
| GRPO hint 泄露 ratio | ≤ 5% | 噪声 hint 组 reward 显著高于 baseline 的比例上限 |
Jay · 2026-09-30 05:45 · 批判精修 · 仅追加工程节,原文主体未改