你的 Agent 有 1000 万上下文,为什么第 50 轮就开始失忆?

过去三年,大模型最响亮的头条指标是上下文窗口。它从 ChatGPT 发布时的 8,192 token,涨到 100 万,再到 Llama 4 Scout 宣称的 1,000 万,以及 Magic.dev LTM-2-Mini 宣称的 1 亿。

隐含的承诺是:记忆是一个容量问题,而容量正在被解决。

它没有。NVIDIA 的 RULER 基准测得有效上下文大约只有标称值的 50%--65% ;Chroma 的"上下文腐烂"(context rot)研究测了 18 个前沿模型,每一个 都随输入变长而退化;Google 自家的 Gemini 3 Pro 在 MRCR 上从 128K 的 77% 掉到 1M 的 26.3%

这篇文章讲三件事:为什么加大窗口救不了你、真正管用的"上下文生命周期"长什么样、以及------最关键也最少被讲的------那些公开的记忆系统跑分,为什么大半不能直接比较。


一、旧范式的原罪:把"记忆"当成了"容量"

先看一个类别错误(category error)。业界混淆了两种完全不同的评测:

bash 复制代码
长上下文评测(long-context eval)
  └─ 一次性喂入 100K / 1M / 10M token 的输入
  └─ 要求模型在单次前向过程中检索、总结或推理
  └─ 输入是固定的。什么都没写入。调用返回后什么都没留下。

记忆评测(memory eval)
  └─ 系统按时间顺序接收一串输入
  └─ 要求它往某个存储里写入东西
  └─ 然后在之后的某一轮,从这个存储里取回来

这是两件事。前者测的是"一次性阅读理解",后者测的是"跨时间的状态管理"。

而你的 Agent 出问题的地方,几乎总是在后者。

1.1 大窗口为什么会"腐烂"

原因不在显存,在注意力本身的结构。

第一,注意力是预算,不是内存。 每个 token 都要和其他每个 token 竞争注意力权重。token 之间的两两关系数量是平方级增长的,而模型干净地加权这些关系的能力不是。"更多上下文 = 模型知道更多"是错的,正确的是"更多上下文 = 对同一份注意力的更激烈竞争"。

第二,位置编码自带衰减。 主流模型用 RoPE(Rotary Position Embedding,旋转位置编码),它对两个 token 之间的直接注意力会随着距离增加而自动衰减。开头(system prompt)和结尾(最新信息)注意力强,中间形成一片低注意力区。

第三,"中段迷失"至今没被解决。 2023 年斯坦福与 UC Berkeley 的工作首次量化了 lost-in-the-middle 效应:当关键事实位于上下文中部时,准确率下降超过 30%。2026 年的生产模型减轻了这个效应,但没有一个彻底消除它。

1.2 退化起点,取决于任务类型

"50% 法则"(把任务控制在窗口的一半以内)太粗糙了。真实的退化起点更接近一个绝对 token 阈值(大约 32K--100K),而不是窗口的固定百分比,并且因任务类型差异巨大:

任务类型 代表基准 有效上下文 说明
简单检索(NIAH) Gemini 1.5 技术报告 10M token 内 >99% 召回 误导性乐观,见下文
语义检索 NoLiMa 13 个模型中 11 个在 32K 就掉到基线 50% 以下 去掉词汇重叠线索后崩溃
多跳检索 RULER 标称窗口的 16%--50% 只有最好的模型能到 50%
推理 BABILong 上下文的 10%--20% "主流 LLM 有效利用率仅 10--20%"
代码缺陷修复 LongCodeBench Claude 3.5 Sonnet:32K 时 29% → 256K 时 3% 严重塌方

不要用 NIAH(大海捞针)的数字来为大上下文加载背书。 NIAH 的"针"和"问题"之间有很高的词汇重叠,模型可以靠字面匹配蒙对;NoLiMa 去掉这个线索后,13 个模型里 11 个在 32K 就崩了。

1.3 一个反直觉的发现

Chroma 的研究里有一条很多人忽略的结论:逻辑连贯的文档,反而比随机排序的文本更难检索。

原因是连贯文本给注意力机制提供了一个"看起来很合理的替代叙事"------模型会顺着通顺的段落推理下去,把它当成答案。而用 --- 分隔、带显式标记的碎片化文本,模型反而更容易跳过。

直接推论:检索回来 8 个 chunk,保留 ## Source N 这样的显式分块标记再拼接,效果通常好于把它们改写成一段流畅的摘要。后者人读起来更舒服,而这正是它输的原因------它对模型来说也读起来更舒服。


二、新范式:把上下文当作一条生命周期来管理

2.1 五个阶段

2026 年逐渐成型的做法,是把上下文管理拆成五个原语,而不是一个"存起来再取"的存储:

阶段 要做的决定 最常见的错误
Architecting(架构) 哪些类别重要、各存哪里、保留多久、怎么取 指望存在一套通用 schema
Ingesting(摄入) 把原始信号(对话轮次、文档、工具输出)转成结构化条目 直接把原始对话塞进去
Scoping(定界) 在用户 / 团队 / 组织层级上决定可见性,并严格隔离 跨用户串数据
Anticipating(预取) 在模型开口之前,把可能需要的上下文先取好 等到阻塞了才查
Compacting & Consolidating(压缩与巩固) 压到预算内,同时验证关键事实仍可恢复,并保留溯源 压完就不管了

关键在最后一条:压缩必须是"带校验的有损变换",不是"丢掉就算了"。

2.2 为什么这件事值得做:O(n²) → O(n)

厂商按输入 token 计费。朴素做法(每轮把完整历史重新拼上)的成本是:

scss 复制代码
朴素全历史追加:第 k 轮要重发前 k-1 轮的全部内容
  → 总成本 ≈ Σ(k) = O(n²)

有界上下文(每轮只装入预算内的内容)
  → 总成本 ≈ O(n)

在一个有代表性的费率下,这个差异在 100 轮时约为 6 倍,500 轮时约为 31 倍

对跑了 5 小时、几千次工具调用的 Agent 来说,这不是优化,是能不能上线的区别。

2.3 三种被验证有效的结构

① 分层记忆(tiered memory)。 MemGPT / Letta 把上下文当虚拟内存管理:工作记忆持有当前任务上下文,冷数据从情景/语义存储里换入换出。生产系统通常收敛到三层:

erlang 复制代码
活动上下文   最近 5--10 轮,全保真            ~20--30K token
工作记忆     最近约 50 轮,轻度压缩(~60%)   按需换入
归档记忆     全量历史,重度压缩 + 外部文件     按需检索

关键在于压缩梯度:近的轻压、远的重压、更远的归档或丢弃。这样避免了"全局同质化压缩"导致的长程推理断裂。

② 子代理上下文隔离。 这是研究中收益最明确的单一策略。Anthropic 在 2025 年 6 月公开其多智能体研究系统:主代理(Opus 4)协调,子代理(Sonnet 4)各领一条研究线,每个子代理持有自己的隔离上下文 ,完成后只回传摘要。报告的性能提升是 90.2% ,并且他们发现------token 使用量解释了两个架构之间 80% 的性能差异

代价:整个系统消耗约 15 倍的 token。子代理通常只回传 1,000--2,000 token。

用 Go 并发模型的那句话总结:通过通信来共享记忆,不要通过共享记忆来通信。

③ 结构化状态累积。 与其总结对话,不如维护一份结构化的状态文档,让 Agent 每轮增量合并新信息。Factory 在 36,611 条真实工程会话消息上的评测显示,把新摘要合并进持久化状态文档,在准确性、完整性和连续性上都优于"逐字保留历史"和"每轮重新摘要"。

具体分数(压缩质量):Factory 自研方案 3.70 、Anthropic 3.44、OpenAI 3.35,压缩率均超过 98%。ACON 框架在 AppWorld、OfficeBench 与多目标 QA 上把峰值 token 降了 26%--54%,且不需要微调。


三、理想丰满,现实骨感:五个工程死结

这一节决定你能不能真的把它跑起来。

死结一:上下文坍缩(context collapse)

当 Agent 反复重写自己的上下文时,每一次重写都倾向于更简略,逐步磨掉领域细节。多轮之后,上下文"坍缩"成一个看起来很整洁、但已经失去关键信息的空壳。

ICLR 2026 的 ACE(Agentic Context Engineering)论文直接命名了这个问题,给出的解法是把上下文表示为结构化的条目化要点集合,增量更新,而不是整块重写。它用 Generator / Reflector / Curator 三个角色往一份不断演进的 playbook 里增补和修正条目。

一句话总结:增量、追加式的上下文更新,胜过整体重写。

死结二:上游抽取失败,后面全白搭

检索质量的上界由摄入质量决定。一次审计给出的数字触目惊心:10,134 条摄入条目中只有 38 条可用,垃圾率 99.6%

如果抽取层不可靠,生命周期的下游每一级都只是在放大噪声。做架构时,先验证 Ingesting,再谈 Compacting。

死结三:全时记忆注入,可能比什么都不做更差

直觉是"多给点记忆总没坏处"。消融实验的结论相反:选择性干预 > 全时注入 > 被动暴露记忆

所以"合并"和"召回"这两级上,必须有一个相关性闸门。它不是优化项,是承重结构。

死结四:记忆是新的攻击面

持久化存储会随时间累积投毒风险与陈旧事实风险。与传统数据库不同,这里的写入方是一个会被提示词注入影响的模型,读取方又是一个会把内容当作事实来推理的模型。

治理维度目前没有标准指标------但至少应该测:隐私泄露率、删除合规性、访问越界次数。

死结五:你看到的跑分,可能不可比

这是最需要说清楚的一点。

问题 证据
答案键本身有错 独立审计发现 LoCoMo 的 ground-truth 中约 6.4% 不正确(幻觉事实、说话人张冠李戴、日期计算错误)
裁判模型放水 同一个审计中,LLM 裁判接受了约 63%故意构造的错误答案
同一系统分数天差地别 同一套系统在 LoCoMo 上被不同 harness 评出 38% 到 92%
"LoCoMo"指两个不同的东西 完整数据集是 50 个对话 / 7,512 题;而多数厂商实际跑的是约 10 个对话 / 1,986 题的子集
暴力基线能打赢专用系统 在饱和的基准上,把全部历史塞进窗口这个基线,常常能匹敌甚至击败专用记忆系统

所以:看到"92% on LoCoMo"先别激动,先问是哪个 LoCoMo、哪个 harness、哪个裁判模型、哪个产品版本。


四、怎么读一个记忆系统的分数:多轴镜头

质量只是一个轴。最便宜的赢法,是干脆不做记忆系统------把整个历史塞进上下文。在饱和基准上,这个暴力基线很有竞争力。

所以至少要四个轴一起看:

测什么 为什么并列
质量 准确率、召回率、矛盾率、陈旧率 头条数字,但最容易靠大窗口刷出来
延迟 每次记忆操作的 p50 / p95 10 秒才返回的正确答案,在实时 Agent 里没用
Token 成本 注入记忆消耗的 prompt token、存储增长 直接决定账单和上下文预算
治理 隐私泄露率、删除合规、访问越界 尚无标准指标,但迟早会成为硬门槛

BEAM:把终点线挪到 1000 万 token

BEAM(Beyond a Million Tokens)是目前最完整的会话记忆基准。它的构造本身就是方法论上的一个进步:

arduino 复制代码
100 个对话,分四档:20 @ 128K · 35 @ 500K · 35 @ 1M · 10 @ 10M
每对话 20 题 → 共 2,000 道人工校验题
10 项能力:信息抽取、多跳推理、知识更新、时序推理、
           偏好遵循、指令遵循、总结、时序事件排序、
           拒答、矛盾消解
评分:把参考答案拆成原子事实"nugget",每个打 0 / 0.5 / 1 后取平均

两个设计要点值得抄:

  1. 叙事连贯,而不是拼接。 很多"长"基准把不同用户的无关会话缝在一起,造成话题突变------这反而让任务变简单了,模型靠局部检索就能过关。BEAM 生成的是单一用户、话题连贯的长对话,同一个人、同一件事反复出现,后面的信息还可能与前面的矛盾
  2. 十项能力里三项是它新增的:矛盾消解(发现冲突应该要求澄清,而不是单方面选边)、事件排序、跨时间指令遵循。

结果(论文报告):

  • 长上下文模型在最短档得分约 0.24--0.28 ,到 10M 档掉到 0.10--0.13
  • 关键的是:性能在历史长度还没超出上下文窗口时就开始下降了,1M 档上已经在跌。
  • 论文提出的结构化记忆系统(LIGHT)带来 3.5--12.7% 的提升;在 10M 档,部分模型的提升超过 100%------因为在那里完整历史已经装不进窗口了。

两点必须如实说明 :其一,BEAM 在公开记录中是一篇 arXiv 预印本(编号 2510.27246),流传的"ICLR 2026"出处未经确认,引用时应按 arXiv 处理;其二,市面上一些 BEAM 高分(例如某结构化记忆方案在 10M 档报 64.1%、传统 RAG 报 24.9%)来自厂商自有博客与自有 harness,不等于独立复现


五、可执行清单

5.1 先定工作上限,别用标称窗口

复制代码
标称 1,000,000  →  RULER 有效 500K--650K  →  生产工作上限 250K--350K
标称   200,000  →  RULER 有效 100K--130K  →  生产工作上限  50K--80K

NVIDIA 2026 年 4 月的长上下文工程建议是:生产环境检索增强型 Agent 的 prompt 控制在标称窗口的三分之一以内 ,其余留给输出和余量。更保守的团队按 25%--30% 设限。

按任务类型再收一次:检索型任务可以放宽,推理型任务尽量压到 32K 以内(有效窗口可能只有标称的 10--20%)。

5.2 压缩要早触发,且必须校验

python 复制代码
WORKING_CAP      = 280_000          # 1M 模型的生产工作上限
COMPACT_TRIGGER  = 0.6 * WORKING_CAP  # 到 60% 就开始压,不要等到 95%

# 反例:Claude Code 的自动压缩在约 95% 才触发。
# 到那时,你已经把一批退化后的答案发给用户了。

def compact(state, turns):
    summary = summarize(state.running_summary, turns[:-RECENT_N])
    # 关键一步:校验压缩是有损的,所以要验证关键事实仍可恢复
    probe = regenerate_probe(summary)   # 让压缩后的状态去重建:
    assert covers(probe, CRITICAL_FACTS)  #   事实 / 未完成的承诺 / 约束 / 理由 / 未解决的风险
    return CompactionState(
        system_header = state.system_header,   # 钉住的任务不变量,~500--1500 token
        running_summary = summary,
        recent_turns = turns[-RECENT_N:],
        provenance = keep_source_ids(summary), # 保留溯源:留下的事实仍要指得回出处
    )

三条来自实践的规则:

  1. 先保召回,再提精度。压过头丢掉的细节,往往在几小时后才是关键。
  2. 用阈值触发,不要等溢出再截断
  3. 把不变量钉在 system header 里,不要指望它能在反复摘要中活下来。

5.3 检索:保留结构标记,别改写成流畅摘要

基于 1.3 的反直觉发现:用 ## Source N 显式标记拼接的 chunk,通常胜过把它们改写成一段通顺的总结。

5.4 尽早用即时检索(just-in-time)

预检索(经典 RAG) 即时检索(JIT)
加载时机 推理前一次性 运行时按需
上下文里装什么 整个嵌入块集合 轻量引用:路径、查询、链接
元数据 分块时被拍平 保留:文件名、时间戳、目录结构
主要风险 塞太多 token,信号被稀释 运行时变慢,工具设计要更讲究

实践中多数系统是混合:稳定知识用预检索,大而动态的数据用 JIT。

5.5 决策树

erlang 复制代码
你的 Agent 会跑多久 / 跨几次会话?
│
├─ 单轮或短会话(< 20 轮)
│   └─ 全都放上下文,最多加一次压缩。别上生命周期框架。
│
├─ 长任务但单会话(20--200 轮,如长代码任务)
│   ├─ 先做:工作上限 + 阈值触发压缩 + 结构化笔记(NOTES.md 之类)
│   └─ 再考虑:把重上下文的活派给子代理,只回收 1--2K token 的摘要
│
├─ 跨会话、需要记住用户/项目
│   ├─ 分层记忆:活动 / 工作 / 归档
│   ├─ 摄入层必须先做对(垃圾率 99.6% 那个教训)
│   ├─ 召回必须过相关性闸门(全时注入 < 选择性干预)
│   └─ 写入侧考虑投毒与陈旧事实
│
└─ 要给老板/客户交一份"记忆系统选型报告"
    └─ 四个轴一起测:质量 + p95 延迟 + token 成本 + 治理
       并要求对方给出:harness、裁判模型、产品版本、用的是哪个 LoCoMo

六、我的判断

第一,这不是"替代",是"分层"。 长上下文没有失效,它只是从"记忆层"降级成了"工作层"。

markdown 复制代码
┌─────────────────────────────────────────┐
│ 归档记忆   外部文件 / 知识图谱 / 向量库     │  TB 级,按需检索
├─────────────────────────────────────────┤
│ 工作记忆   压缩后的运行摘要 + 结构化状态    │  50--100K,跨轮保留
├─────────────────────────────────────────┤
│ 上下文窗口 当前步骤的高信号 token           │  有效值 ≈ 标称的 1/3
└─────────────────────────────────────────┘
          ↑ 每一层之间的搬运,才是工程量所在

模型厂商会把窗口继续做大,但那只会让"工作层"更宽,不会替你解决"归档层"。窗口是别人的产品,记忆是你的架构。

第二,2026 年真正的分水岭是可复现性,不是分数。 当同一个系统能在同一基准上被评出 38% 和 92% 两个数字时,这个基准就暂时失去了作为采购依据的资格。眼下更靠谱的做法是:在你自己的任务集上,用你自己的 harness 和裁判,测你关心的那个记忆操作(是矛盾消解?还是时序排序?还是跨会话偏好?)。

第三,下一个值得盯的信号:厂商会不会公开 harness。 目前 BEAM、LoCoMo、LongMemEval 的分数满天飞,但绝大多数不披露评测框架。哪家开始把 harness 和裁判模型一起开源,哪家才是在真的推动这个领域。在那之前,把所有记忆系统的跑分都当作"待验证的厂商声明"来读。


参考

  • RULER(Hsieh et al., NVIDIA):长上下文有效窗口基准
  • Context Rot(Hong, Troynikov, Huber, Chroma, 2025.7):18 个前沿模型的长度退化研究
  • BEAM: Beyond a Million Tokens (Tavakoli et al., arXiv:2510.27246):10M token 记忆基准与 LIGHT 记忆框架;GitHub mohammadtavakoli78/BEAM
  • LoCoMo (Maharana et al., ACL 2024)与 LongMemEval(Wu et al., ICLR 2025):会话记忆基准,注意两者均有已知的方法学缺陷
  • ACE: Agentic Context Engineering(ICLR 2026):上下文坍缩与条目化增量更新
  • ACON(Agent Context Optimization):失败驱动的压缩指南更新,峰值 token 降低 26--54%
  • MemGPT / Letta:虚拟内存式分层上下文管理
  • Anthropic《Effective context engineering for AI agents》与多智能体研究系统相关公开材料
  • Factory 在 36,611 条生产消息上的上下文压缩评测

免责声明:本文引用的实验数字均来自上述公开来源,其中厂商自报成绩已在正文中标注。BEAM 的会议出处存在未经确认的说法,已按预印本处理。不同 harness 下的分数不可直接比较,选型请务必在自己的任务集上复测。

相关推荐
东风破_1 小时前
Text2SQL :用自然语言操作 SQLite 数据库
人工智能·后端
吴佳浩 Alben1 小时前
Agent 怎么做自动化评测?构建端到端的 Agent Evaluation 体系
人工智能·语言模型·架构·自动化·ai编程
G***技1 小时前
告别“云端依赖”:LH707 如何重构 AI 视频监控的底层逻辑?
人工智能·嵌入式硬件
知了一笑1 小时前
圈外人焦虑AI吗?
人工智能·ai·aigc
国信华源1 小时前
AI+小流域防汛救灾综合解决方案|看得全・算得准・联得通・可复制
人工智能
数字新视界2 小时前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
米小虾2 小时前
一周 AI 观察:模型层在"周更",钱却全流进了机房
人工智能
Dawson Zhu2 小时前
从单体到联邦:多Agent架构的必要性与设计哲学
人工智能·语言模型·架构·aigc·agi
火山引擎开发者社区2 小时前
AgentKit 实战|搭建一个有记忆、懂业务、会执行的智能客服
人工智能