Pi 的 Compaction 是什么?自动压缩 + 分支摘要共享一套摘要格式
· 8 min read
Pi 把上下文压缩做成一等公民:自动触发、结构化摘要、可扩展、可手动控制。两种机制——压缩和分支摘要——共用同一套文件跟踪与摘要格式。
- 触发条件:上下文超阈值或
/compact触发压缩;/tree切分支触发分支摘要 - 核心字段:
reserveTokens(默认 16384)、keepRecentTokens(默认 20000) - 七段式摘要 schema:Goal / Constraints / Progress / Key Decisions / Next Steps / Critical Context
- 关键设计:重复 compaction 从上一 compaction 的保留边界开始,磁盘上只有「三块」而非 N 段
- 累积文件跟踪:read/modified 文件清单跨多次 compaction 累积
- 可扩展:
session_before_compact钩子允许扩展完全替换摘要生成
Pi 把上下文压缩这件事做成了一等公民:自动触发、结构化摘要、可扩展、可手动控制。它同时承担两种角色——compaction 在「上下文快爆了」时收尾,branch summary 在「切到不同分支」时存档。两套机制共用同一套文件跟踪与摘要格式。
两种机制一个套路
| 机制 | 触发 | 目的 |
|---|---|---|
| Compaction | 上下文超阈值 或 /compact | 把旧消息摘要掉以释放空间 |
| Branch summarization | /tree 导航切分支 | 把离开的分支摘要成一段上下文 |
两者共用同一套结构化摘要格式与文件跟踪累积机制。差异只在触发点和写入位置:compaction 写在「old messages → firstKeptEntry」之间,branch summary 写在「从旧 leaf 切到新 leaf」的节点上。
何时自动触发
自动 compaction 的条件非常直白:
contextTokens > contextWindow - reserveTokens
reserveTokens默认 16384 tokens,给 LLM 响应留空间- 配置在
~/.pi/agent/settings.json或<project>/.pi/settings.json
{
"compaction": {
"enabled": true,
"reserveTokens": 16384,
"keepRecentTokens": 20000
}
}
| 字段 | 默认 | 含义 |
|---|---|---|
enabled | true | 是否启用自动 compaction |
reserveTokens | 16384 | 给 LLM 响应保留的 tokens |
keepRecentTokens | 20000 | 摘要后保留的最近 tokens |
把 enabled 设成 false 可以关掉自动 compaction,但 /compact 仍然可用。