200K的窗口也会不够用:给Agent 的上下文做“内存调度“
200K 的窗口也会不够用:给 Agent 的上下文做"内存调度"

大模型上下文窗口从 4K 一路飙到 200K、甚至 1M,很多人以为"记忆问题"就此解决了。但真正跑过长期 Agent 的人都知道:窗口越大,越容易"撑死"。上下文不是仓库,塞得越多越好——它是一块有成本的稀缺资源:每多一个 token,都在消耗注意力、推高延迟和费用,还稀释了真正重要的信号。本文借用操作系统管理内存的思路,聊聊怎么给 Agent 的上下文做"调度"。
一、窗口不是越大越好:被忽视的"上下文税"
先拆一个误区。加大上下文窗口,不等于提升"有效记忆"。模型对窗口内信息的利用是位置相关且不均匀的:靠近结尾的内容权重更高,夹在中间的大段容易被"忽略"(lost-in-the-middle 现象)。换句话说,窗口是"容量",不是"可用记忆"。
更要命的是成本结构。上下文按 token 计费,而且越长,注意力计算开销近似平方级增长(至少在朴素实现下)。一个跑 50 步的 Agent,如果每步都把完整历史原样塞回,累计"上下文面积"会爆炸——这正是很多团队踩过的坑。所以"全量塞进去"既不便宜,也不聪明。
真正的约束是:窗口里的每一个 token 都在和别的 token 争夺模型的注意力预算。你塞进去的越多,关键指令、用户意图被稀释的概率就越高。这就是为什么不少 Agent 跑到后面开始"答非所问"“忘记开头的要求”——不是模型变差了,是上下文被长尾数据淹没了。
二、把上下文当内存:工作集与页面置换
解决这个问题,最好用的思维模型来自操作系统。OS 从不让每个进程独占全部物理内存,而是用虚拟内存 + 页面置换:只把"当前工作集"留在内存,其余换出到磁盘,需要时再换入。
Agent 的上下文窗口,本质上就是一块"物理内存"——容量有限、访问昂贵。而智能体的全部知识(对话历史、工具返回、文档、用户偏好)是"虚拟地址空间"——远超窗口容量。调度要做的事,就是决定此刻哪些内容留在窗口(内存),哪些换出到外部(磁盘/记忆层)。

这里有三个可操作的概念:
- 工作集(Working Set):当前这一步推理真正需要的信息。比如调用某个 API 之前,只需要它的入参 schema,不需要三个月前的聊天记录。
-
- 常驻集(Resident Set):系统提示、用户当前意图、最近几轮对话——这些高频访问,应始终留在窗口。
-
- 换出候选(Eviction Candidate):长尾历史、已完成的子任务结果、大段检索文档——可压缩、可摘要、可外置。
三、四种调度策略:什么该留、什么该换出
把"内存调度"落到 Agent 上,有四类常见策略,从简单到进阶:
1. 滑动窗口(Sliding Window)
最朴素:只保留最近 N 轮。好处是实现简单、成本可控;坏处是可能丢掉很久以前但很关键的用户约束(“我全程都用 conda”)。适合短任务。
2. 摘要压缩(Summarization)
当窗口逼近上限,把旧内容交给一个小模型做摘要,用更短的 token 保留语义骨架。这是很多长对话产品的做法。难点在于摘要会丢失细节,且摘要本身可能引入偏差。
3. 基于重要性的优先级淘汰(LRU-K / 重要性打分)
借鉴页面置换的 LRU-K:不是简单"最旧就淘汰",而是综合访问频率、与当前任务的相关度、是否包含用户硬性约束来打分,优先换出低分内容。这实际上需要一套"上下文账本"来记录每个片段的元信息。
4. 外置检索(Offload + Retrieve)
最彻底:把不常用的上下文持久化到外部存储,窗口里只留一个"指针/索引";当前步需要时,按相关性检索一小块回来填入窗口。窗口因此始终只装"当前工作集",成本和注意力都被压在最低。
这四种不是互斥的。一个成熟的 Agent 往往是组合拳:常驻集常驻、长尾摘要、关键约束打高分、冷数据外置检索。
四、工程落地:把记忆当成"外存"
talk is cheap,怎么落地?核心是把"外部存储"标准化、可检索。一个常见架构是:Agent 在每一步推理前,先根据当前任务构造一个轻量查询,去外部记忆 / 知识层取回最相关的几段,再拼进窗口;推理结束后,把新产生的重要结论写回外部层。窗口本身只做"当前工作集"的短期载体。

这里可以类比太忆 TiMEM 这类记忆与 RAG 基础设施的定位:它把"外存"标准化了——智能体把低优先级的上下文换出到记忆层,需要时再按相关性检索回来,窗口始终只承载当下最相关的信息。调度的"换入换出"逻辑,正是对接在这层之上的策略。
几个落地时容易踩的坑:
- 指针失效:外置后只在窗口留索引,但检索条件写错,导致需要时取不回。索引和检索要配套设计。
-
- 摘要塌陷:过度依赖摘要压缩,几轮之后原始约束被"软掉"。关键用户约束应作为高优先级常驻或结构化字段,而非压进摘要流。
-
- 检索抖动:每次重新检索都换一批内容回来,造成 Agent"前后不一致"。可以给换入内容加稳定性约束(如会话级固定片段)。
五、结语:上下文工程,是 Agent 的"操作系统课"
把 Agent 的上下文窗口当成一块有限、昂贵、需要调度的内存,很多看似玄学的问题就有了抓手:为什么它"越聊越傻"?因为工作集被长尾稀释了。为什么加长上下文反而变贵变慢?因为你把磁盘当内存用了。
未来的 Agent 竞争力,未必在于谁家模型上下文标到 10M,而在于谁能把"有限窗口"调度得又准又省——像好的操作系统一样,让正确的数据在正确的时刻出现在正确的位置。上下文工程,说到底是一门给智能体分配注意力预算的手艺。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)