Agent 上下文管理与压缩策略
上下文快满时三条路:滑动窗口丢最旧的、摘要压缩把历史变成一段、重要性过滤只留关键项 —— 各有各的失败模式。触发时机有三种策略;压缩的隐藏成本是缓存失效。压缩前必须固化 MUST-PRESERVE 清单:目标、决定、约束、待办,丢了关键决定就是开篇那种故障。
也叫:上下文管理 · 滑动窗口 · 摘要压缩 · 重要性过滤 · MUST-PRESERVE
三种压缩手段,各自的失败模式出自 T3-6
| 手段 | 怎么做 | 省得多吗 | 失败模式 |
|---|---|---|---|
| 滑动窗口 | 只保留最近 N 轮 | 中 | 早期约束和决定直接消失,最粗暴 |
| 摘要压缩(compaction) | 让模型把历史压成叙述 | 高(常见 60–80%) | 语义丢失,且丢什么不可控;压缩本身要花一次模型调用 |
| 重要性过滤 / 结构裁剪 | 按类型清理(旧工具结果、旧 thinking),保留关键类型 | 中高 | 规则靠人写,长尾覆盖不全 |
生产系统里基本不会只用一种。成熟的组合是:结构裁剪打底(先清工具结果这种大块低价值内容)+ 摘要压缩兜底(还不够再摘要)+ 关键信息置顶保真(规则层与任务层单独维护,不进摘要器)。
一个可直接抄的策略骨架(阈值需按自己的模型和任务校准):
def manage_context(messages, state):
if tokens(messages) < THRESHOLD: # 未到阈值不动
return messages
# ① 结构裁剪:优先清理大块低价值内容
messages = drop_old_tool_results(
messages, keep_recent_groups=5,
protect_tools={"read_file", "memory", "task"}, # 关键工具结果不清
min_free=5000)
if tokens(messages) < THRESHOLD:
return messages
# ② 摘要压缩:但只摘要「对话与探索过程」这一段
head, mid, tail = split(messages, keep_tail=10)
summary = summarize(mid, must_preserve=MUST_PRESERVE_CHECKLIST)
# ③ 关键状态不走摘要器,从结构化 state 重新渲染
return [system(RULES), render(state), summary] + tail第 ③ 步是重点:把"当前任务目标、已确定的决定、硬约束、未完成 TODO、关键 ID/句柄"维护成一份结构化的 state 对象,每次压缩后从 state 重新渲染进上下文,而不是指望摘要器把它们留下来。 这是开篇故障最直接的修法。
以上节选自T3-6 Agent 记忆系统与上下文压缩——被摘要掉的那条约束,读全文能看到前后语境。