滑动窗口 上下文与记忆
别名:
trimHistory
历史超过预算时,保留头部(system 与最初的用户指令)和尾部(最近的工作),裁掉中间最旧的部分。0 次 API、纯数组切片,代价是被裁掉的信息永久消失——它是「用遗忘换长度」。
它是什么
滑动窗口(trimHistory)是最朴素也最便宜的上下文管理:历史超过预算时,保留头部(system 与最初的用户指令——身份与任务定义,丢不得)和尾部(最近的工作——模型正在看的内容),裁掉中间最旧的部分。0 次 API、纯数组切片,代价是被裁掉的信息永久消失——它是「用遗忘换长度」。
配对的完整性优先于条数预算
切割点有一个 API 硬约束:tool_calls 消息和它的 tool_result 必须成对出现——把 assistant 留在头部、结果裁进中间,下一次调用直接 400。所以:
- 头部保护:头部最后一条是带
tool_calls的 assistant 时,把它后面的tool结果吞进头部; - 尾部保护:尾部第一条是
tool结果时,向左扩展把它的 assistant 一起保留。
配对保护会让结果偶尔比预算多一两条——配对的完整性优先于精确的条数预算,这是「会写滑动窗口」和「写对滑动窗口」的区别。
与摘要压缩的分工
滑动窗口是「删掉」,摘要压缩是「换一种更短的表示」。生产系统两者叠用:先滑动窗口扔掉彻底没用的,再对「还有价值但太长」的部分做摘要,最后才轮到别的。完整实践见第 09 章。