OpenCode · 第 9 章 上下文压缩与记忆管理 章节摘要:再大的模型窗口也会被一次长对话塞满——工具输出、文件内容、来回讨论,token 只增不减。当请求即将超出窗口时,OpenCode 必须做一件事:把旧的对话压缩成一个隐藏的检查点(hidden checkpoint),腾出空间让对话继续。但这件事远比「截断历史」复杂:你不能简单砍掉一段,因为厂商的原生消息(带签名的助手消息、加密的推理内容)一旦跨越压缩边界就会失效——签名校验失败、推理链断裂。OpenCode 的解法是:把旧对话替换成一个结构化的滚动摘要 + token 受限的近期上下文,并保证原生消息不跨边界;压缩完成后立刻开启一个新的上下文纪元(Epoch)。
章节摘要:再大的模型窗口也会被一次长对话塞满——工具输出、文件内容、来回讨论,token 只增不减。当请求即将超出窗口时,OpenCode 必须做一件事:把旧的对话压缩成一个隐藏的检查点(hidden checkpoint),腾出空间让对话继续。但这件事远比「截断历史」复杂:你不能简单砍掉一段,因为厂商的原生消息(带签名的助手消息、加密的推理内容)一旦跨越压缩边界就会失效——签名校验失败、推理链断裂。OpenCode 的解法是:把旧对话替换成一个结构化的滚动摘要 + token 受限的近期上下文,并保证原生消息不跨边界;压缩完成后立刻开启一个新的上下文纪元(Epoch)。本章要讲清压缩何时触发(额度估算公式)、检查点长什么样、跨边界的硬约束有哪些,以及它如何与第 8 章的纪元机制衔接。读完本章,你会理解 Agent 在马拉松式长对话里如何「不忘记重点又不撑爆窗口」——这是 Agent 能持续工作的关键能力。
阅读完本章,你应当能够:
一句话总结:压缩不是截断,而是「摘要 + 近期保留 + 边界守护」的三步——摘要留住重点,近期保留上下文连续,边界守护保证厂商签名与推理不失效,新纪元保证缓存前缀稳定。
讲压缩的触发逻辑:每一回合前如何估算请求 token(系统上下文 + 历史 + 工具描述 + 用户输入),何时判定需要压缩(估算值 > 模型窗口 - max(输出额度, 压缩缓冲))。给出估算公式,并说明为什么留缓冲。
讲检查点的结构:它不是一个简单的「总结」,而是「结构化滚动摘要 + token 受限的近期上下文序列化」。重点解释:为什么是滚动(多次压缩时摘要本身也被摘要)、为什么近期上下文要 token 受限(保证新窗口装得下)。
本章硬核。讲厂商原生消息不能跨压缩边界的根因:带签名的助手消息跨边界后签名校验失败、加密的推理内容跨边界后无法解密、工具结果跨边界可能引用已不存在的工具。说明 OpenCode 如何在压缩时保证这些消息要么完整保留在近期上下文、要么完全进入摘要,绝不切割。
讲压缩完成后立刻开启新上下文纪元(Epoch)的机制。重点解释:为什么必须新纪元(基准文本变了,旧缓存前缀失效)、新纪元如何让模型重新建立稳定缓存、以及这与第 8 章对话中途系统消息的协作关系。
本章遵循「何时压缩 → 压成什么 → 守住什么 → 之后如何」的机制拆解路径:
触发条件 (01) ──什么时候该压缩 │ ▼ 检查点 (02) ──压缩成什么 │ ▼ 边界约束 (03) ──压缩时不能破坏什么 │ ▼ 新纪元 (04) ──压缩之后如何重启 │ ▼ 第 10 章:压缩之外,如何接入外部能力
四节构成压缩机制的完整画像:触发是入口,检查点是产物,边界约束是硬规则,新纪元是收尾。理解了这四节,你就懂了 Agent 长对话不崩的秘密。
前置知识:
本章为后续章节奠定的基础: