Agent 上下文管理与压缩策略

Agent 开发深水10讲解 5

上下文快满时三条路:滑动窗口丢最旧的、摘要压缩把历史变成一段、重要性过滤只留关键项 —— 各有各的失败模式。触发时机有三种策略;压缩的隐藏成本是缓存失效。压缩前必须固化 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 记忆系统与上下文压缩——被摘要掉的那条约束,读全文能看到前后语境。

延伸阅读

考这个知识点的题1

会连带问到9