上下文压缩在什么条件下触发?
未标记
考查重点:上下文剩余预算与保留信息。按剩余上下文预算与下一步预留触发压缩,也可在重复工具输出过多时提前清理;保留目标、决定、未完成任务和可回源引用
本题目录
参考答案
核心回答
上下文压缩通常在下一次模型调用将接近可用输入预算时触发,需要提前为输出、新工具结果和估算误差留空间,不能等服务端报超长才处理。
可以分成三类触发:
- 预算触发:统计指令、工具定义、历史和新增内容的
Token,达到阈值后压缩旧历史;切换模型时按新模型的输入与窗口限制重新计算。 - 任务事件触发:一个阶段已经结束、旧工具输出大量重复时,可以先清理或做阶段摘要。消息条数和阶段变化适合辅助判断,不能代替长度统计。
- 溢出恢复或手动触发:实际计数超过估算、模型拒绝请求时,缩小上下文后有限重试;用户也可在明确的阶段边界主动压缩。
触发后保留当前目标、有效约束、未完成项与最近完整工具交互,把旧过程压成带出处的摘要。触发阈值与保留范围是两个参数:过早频繁压缩会增加开销,保留内容过多则可能压缩后仍然装不下。
阈值怎样设
先核对模型的最大输入、总上下文窗口与输出上限,再为本轮输出和下一次可能增长的工具结果预留余量。不能把所有模型统一设成“窗口的 70%”或“每 20 条消息”:一条工具日志可能比几十轮短对话更长,不同模型的输入限制也可能不同。
例如某任务计划在一个 100k Token 窗口中预留 10k 输出和 10k 增长余量,可先以 80k 为压缩起点,再用实际轨迹调整。这是预算示例,实际请求还要满足服务端独立的输入、输出限制。摘要调用自身也需要输入和生成空间,因此阈值应早于窗口耗尽。
冗长日志和大文件可以先保留关键片段与原件路径,再决定是否需要模型摘要;不是每次工具输出变长都要压缩整段历史。阶段摘要则适合已完成步骤,不宜把尚未返回结果的工具调用切成两半。
怎样避免反复触发
摘要成功保存后再更新覆盖位置,后续使用“摘要+保留原文+新增消息”构建输入。用重新组装后的大小判断是否还有空间,避免继续拿压缩前的计数触发同一次摘要。
如果固定指令、工具定义或最近一次大附件本身就超过预算,反复总结旧对话也解决不了,应缩减工具集合、拆分材料或分阶段处理。压缩失败或仍超长时设置重试上限,并保留可恢复的原始记录;摘要质量如何检查,见上下文压缩或摘要会丢失信息,如何让损失尽可能小?。
OpenCodeTypeScript
OpenCode 2.1.2 的会话执行器在每一步模型请求之前检查自动压缩,也支持模型拒绝超长请求后的恢复,以及用户主动提交的压缩请求。三种入口共用压缩服务,但触发条件不同。
自动压缩依据模型预算
SessionRunner 先加载当前会话,再调用 compaction.compact({ reason: "auto", ... })。压缩服务用模型的 input 上限计算水位,没有独立输入上限时使用 context 窗口。
该版未显式设置 buffer 时,默认预留窗口的 15%;窗口至少为 32k 时,预留量还不低于 16k Token。例如窗口为 100k 时,默认水位为 84k。这是一版源码的策略,不能照搬为所有模型的最佳阈值。
当前大小优先以同一提供商返回的有效用量作基准,再估算此后新增的消息与工具结果;缺少有效用量时,估算系统指令、工具定义和消息。模型窗口未知时不会自动按比例触发,只能依赖手动操作或服务端溢出反馈。刚完成压缩时,执行器先重建请求;原生压缩产生的不透明窗口,也要等新用量反馈后再判断,避免拿旧计数连续压缩。
溢出恢复与手动压缩
当请求实际被判断为上下文溢出时,执行器尝试 reason: "overflow" 的压缩;成功后重新加载历史发起请求,并限制同一步的再次溢出恢复。压缩请求自身过大时,还会逐步降低目标大小,无法再缩减则返回失败,不无限重试。
自动压缩关闭时,普通水位检查和溢出恢复都会跳过压缩;用户的手动请求仍可进入压缩服务。因此,“关闭自动压缩后,超长时一定会自动兜底”并不符合这版实现。
压缩后怎样继续任务
支持原生压缩的模型走提供商原生路径;其他模型生成包含目标、要求、决定、工作状态和下一步的摘要,并按 keep 保留近期上下文。该版 keep 默认预算为 15k Token,与触发水位分别配置。
普通摘要通过消息标识关联保留片段,后续会话历史据此重建请求。这样既能减少反复携带旧过程,又保留近期任务细节;是否丢失约束仍需检查摘要及后续执行,不能仅凭压缩成功状态判断。
对应教程
- 深度研搜第 7 章:中间件机制与 Skills 配置:参考第 3 节对
trigger、keep和提前预留摘要空间的解释,区分正文中的触发时机与近期保留范围。
参考资料
- 国内:Onefly / zero2Agent:记忆与上下文:参考事件与阈值组合触发的讨论,说明阶段结束、窗口增长和记忆整理不必使用同一种定时策略。
- 国内:JavaGuide:上下文工程:依据上下文组装与预算分配的说明,解释计数为什么包括工具定义和动态证据,以及长工具输出为何可先裁剪。
- 国内:WeThinkIn:Agent 记忆与上下文工程高频考点:采用摘要覆盖位置、近期完整交互和预算预留的讨论,说明压缩后如何避免重复处理及遗漏消息。
- 国内:Datawhale:第九章 上下文工程:参考
ContextBuilder超预算后分区裁剪的实现,说明长度触发可以先做确定性缩减,字符估算与截断也不等于语义保真。 - 国外:LangChain:Summarization middleware:依据独立的
trigger与keep配置,解释触发条件与压缩后保留多少内容应分别控制。 - 国外:Anthropic:Effective context engineering for AI agents:借鉴接近窗口上限时压缩历史、保留关键决定与未决问题的做法,说明提前压缩的目的与保真要求。
- 国外:OpenCode:固定版本压缩服务与预算计算:项目答法中的三类触发、默认缓冲、用量估算和摘要保留策略以此实现为依据;会话执行器支持每步检查与有限溢出恢复的说明。
相关面经
8 篇长鑫存储
Agent 开发工程师上下文压缩什么时候触发?压缩会丢失信息吗
字节跳动
Agent压缩策略是什么、什么时候压、阈值怎么定
字节跳动
Agent 开发工程师项目里的上下文压缩是怎样实现的?在什么情况下开始压缩?压缩过程具体做什么?
小红书
AI 应用开发工程师你刚提到了上下文如果过多,大模型可能会有些幻觉对吧?但是我们比如说 AI 靠近对话的过程中,它的上下文也会持续增加对吧?然后如果快到上下文超过的时候,它的那个编码功就会发生压缩是吗?
科大讯飞
AI 应用开发工程师什么时候检测并触发压缩,大 Tool Result 的阈值是什么?



