Compaction

定义

Compaction 是 coding agent 在长会话中当上下文逼近窗口上限时,把较老轮次通过一次独立的 LLM 调用序列化为结构化摘要(goal / progress / key decisions),保留最近 N 个消息不变,结果作为新 turn 前缀插入的工程机制。由 Pi coding agent 团队在 2026-08 工程博客中详细描述,被 Claude Code、Codex 等同类 agent 普遍采用。

关键数据点

触发机制(三类)

触发类型触发条件时机
Auto-trigger上下文逼近窗口上限turn 结束后检查(保留 cache 链)
Manual-trigger用户执行 /compact 命令即时
Emergency-triggermid-turn context overflow errormid-turn

摘要结构(Pi 工程实现)

before compaction: [system + tools][older turns][recent retained messages]
after compaction:  [system][tools][summary][recent retained messages][new user message]
  • system prompt:独立 = "you are a context summarization assistant"
  • user message:独立 = "structured summary of this conversation branch for context when returning later"
  • 三段式输出:goal / progress / key decisions
  • standalone request:不嵌入常规对话,可用不同 LLM 模型

配置参数(Pi 默认)

参数默认值说明
Retained token budget20k tokens保留的最近消息总 token 数
折算 turn 数5-20 turns取决于 turn 平均长度(tool call 多则 turn 短)

与 Prompt Cache 的张力

cached before compaction:    [system][tools][older history][recent retained turns]  ← 全 cached
first request after compaction: [system][tools][summary][recent retained turns][new user message]
                              ^ retained turns 同样 tokens,但前缀变了 → cached prefix 作废
                              <-- reusable -->^ | 重新计算起点
  • compaction 一次 = 一次 cache miss 链重置
  • 之后请求重新建立 cache 链(warm-up 成本)
  • trigger 阈值选择 = cache 利用 vs overflow 风险的权衡

跨模型延续

  • summary 存为 plain text(非结构化嵌入)
  • 切换 LLM 模型时 summary 仍可读(session portability)
  • tradeoff:portability 优于 structured embedding,但 loss of programmatic queryability

关键命题

命题 1:Compaction 是 Context-Engineering 的核心子机制

Context-Engineering 关注"Agent 看到什么、何时看到";Compaction 关注"如何让 agent 在长会话中保留关键决策"——是 Context-Engineering 在"会话生命周期"维度的具体实现

命题 2:Compaction 对抗 Context-Rot

Context-Rot 主张"上下文填充越多,模型推理下降"——这是一个观察性现象。Compaction 提供工程手段对抗——通过定期压缩保持 high-signal token 比例。但触发阈值 / 摘要质量上限决定对抗效果

命题 3:Compaction 与 Ralph-Loops 是同一问题的两种解

机制Ralph-LoopsCompaction
对抗问题context 衰减context 衰减
路径同一上下文无限循环上下文定期压缩重置
cache 利用高(无 compaction 触发)中(每次 compaction 后 warm-up)
信息保留完整摘要(信息有损)

→ 适用场景不同:Ralph-Loops 适合结构化短任务;Compaction 适合长会话多任务

命题 4:独立 LLM 调用是核心设计选择

  • 优势:可用更小/更便宜的模型做摘要;不污染主对话上下文;可在不同模型间共享
  • 代价:compaction 本身消耗 token;摘要质量受模型能力限制
  • 决策点:Pi 未披露默认 compaction 模型选择策略(成本 vs 质量权衡)

多平台实现与目标保持(2026-09)

MarkTechPost 的横向材料补充了 Pi 之外的实现差异:Deep Agents 用 session intent、artifacts created 和 next steps 作为摘要的固定字段,并把完整 transcript 落盘;Claude Code 在压缩后重读最近修改的文件和匹配规则;OpenAI Responses API 与 Claude Developer Platform 则把 compaction 提升为 API 层的 context-management 能力,允许设置阈值、插入自定义摘要指令或在压缩后暂停注入内容。

判断:Compaction 的关键不只是把历史变短,而是把“继续完成任务所需的状态”显式命名,并保留细节恢复路径。摘要结构、恢复动作和触发阈值共同决定 goal loss,而不是摘要长度单独决定。

  • 证据:20260912-context-engineering-inside-the-harness(raw 第 41–49 行)。
  • 边界:以上是媒体文章对产品文档和博客的转述;各实现的当前版本、默认阈值、摘要质量和恢复成功率需要回到对应官方文档或评测核查,不能由横向描述推出统一最佳实践。

前提与局限性

  • trigger 阈值未披露——影响 user 反馈时间
  • 20k tokens 默认值是经验值——深度调试类任务可能不够
  • compaction 模型选择未披露——小型模型做摘要可能遗漏关键决策点
  • 摘要结构固定为三段式——未必适用所有任务类型(数据探索 / 写作 / 调试需要不同模板)
  • compaction 成本未量化——cache miss + LLM 调用合计开销
  • plain text 存储 vs structured embedding 的 tradeoff——portability 优于 programmatic queryability
  • 任务感知的摘要模板缺失——Pi 没实现"任务类型感知 compaction"

时间线

  • 2026-08 — Earendil Engineering 发布 Pi compaction 详细工程文档(GitHub 源码链接)
  • 同期 — Claude Code、Codex 等同类 coding agent 普遍实现 compaction,但实现细节与 Pi 略有差异

关联概念

  • Context-Engineering — 父概念;Compaction 是子机制
  • Context-Rot — Compaction 对抗的现象
  • Ralph-Loops — 同一问题的替代方案
  • Memory-Summary-Page — Obsidian vault 轻量索引模式,同构的"摘要 + 按需加载"
  • Agent-Harness — Compaction 是 harness 的子组件(context 管理维度)
  • Coding-Agents — Claude Code / Codex / Pi 等同类 agent 普遍采用
  • AGENTS-md — Coding agent 的初始配置;与 compaction summary 是两类不同 artifact