conv-compactor
对话压缩 / 遗忘机制 — 基于 Claude Code compaction 系统。
让 AI 在上下文即将耗尽时,自动把对话历史压缩成结构化摘要,而不是粗暴截断。
核心概念
为什么需要压缩?
- - 对话越来越长 → Token 越来越多 → 超出上下文窗口 → 无法继续
- 错误做法:直接从头部截断(丢失关键上下文)
- 正确做法:压缩成摘要,保留精华
压缩不是什么?
- - ❌ 不是"忘记"——是提炼,不是丢弃
- ❌ 不是"截断"——是结构化摘要,不是删除
- ❌ 不是"总结"——是保留决策过程和代码细节,不只是大意
触发机制
自动触发阈值
CODEBLOCK0
三种触发方式
| 方式 | 触发条件 | 说明 |
|---|
| auto | Token 接近阈值 | 自动压缩,保留最近对话 |
| manual |
用户说"压缩" | 自定义压缩范围 |
|
micro | 单次工具结果太大 | 只压缩大文件/图片 |
压缩级别
Level 1:Micro Compact(微观压缩)
触发: 单个工具结果太大(如 grep 返回 100K tokens)
做法:
CODEBLOCK1
保留: 对话结构 + 关键结论
Level 2:Auto Compact(自动压缩)
触发: Token 即将用尽
做法:
- 1. 从最老的对话开始
- 按"API round"分组(一问一答+工具调用 = 一组)
- 把早期组压缩成结构化摘要
- 保留最近 2-3 组原始对话
- 插入压缩边界标记
Level 3:Full Compact(全量压缩)
触发: 手动 /compact 或上下文严重不足
做法:
- 1. 全部对话压缩成单一摘要
- 可选择保留特定文件内容
- 生成下一步建议
压缩 Prompt(精华)
当需要压缩时,使用以下 prompt 模板:
CODEBLOCK2
上下文窗口参考
| 模型 | 上下文窗口 | 安全阈值(87%) |
|---|
| MiniMax-M2.7 | 200K | ~174K |
| MiniMax-M2.5 |
200K | ~174K |
| MiniMax-M2.1 | 200K | ~174K |
| GPT-4o | 128K | ~111K |
| Claude 3.5 | 200K | ~174K |
压缩边界标记格式
压缩完成后,插入以下标记:
CODEBLOCK3
使用时机
当以下情况发生时,自动使用本 skill:
- - 对话 Token 接近安全阈值(> 80% 上下文)
- 用户说"压缩"、"compact"、"总结一下"
- 单个工具结果异常大(如 > 10K tokens)
- 对话明显变慢或开始重复之前的内容
与 memory-hierarchy 的关系
memory-hierarchy 负责:对话外的长期记忆
conv-compactor 负责:对话内的上下文压缩
两者互补:
新对话开始 → 加载 MEMORY.md(记忆)
↓
对话进行中 → 监控 Token 使用
↓
触发压缩 → 结构化摘要
↓
可选择 → 写入 memory/(新记忆)
实施检查清单
压缩前确认:
- - [ ] Token 使用是否超过 80%?
- [ ] 是否有未完成的用户请求?
- [ ] 是否有用户的特殊偏好/反馈需要保留?
- [ ] 是否有重要的代码片段?
压缩后确认:
- - [ ] 摘要是否包含所有用户消息?
- [ ] 关键代码是否完整?
- [ ] 用户反馈是否被标记?
- [ ] 下一步是否清晰?
禁止事项
❌ 不要直接截断对话头部
❌ 不要只保留大意而丢失代码细节
❌ 不要在压缩时调用工具
❌ 不要删除用户反馈相关内容
❌ 不要压缩正在进行的开发工作
❌ 不要在摘要中保留明文敏感信息(API keys、密码、tokens)
❌ 不要原文抄录所有用户消息
conv-compactor
对话压缩 / 遗忘机制 — 基于 Claude Code 压缩系统。
让 AI 在上下文即将耗尽时,自动将对话历史压缩为结构化摘要,而非粗暴截断。
核心概念
为什么需要压缩?
- - 对话越来越长 → Token 越来越多 → 超出上下文窗口 → 无法继续
- 错误做法:直接从头部截断(丢失关键上下文)
- 正确做法:压缩成摘要,保留精华
压缩不是什么?
- - ❌ 不是遗忘——是提炼,而非丢弃
- ❌ 不是截断——是结构化摘要,而非删除
- ❌ 不是总结——是保留决策过程和代码细节,而非仅保留大意
触发机制
自动触发阈值
上下文窗口 200K → 有效窗口约 100K
触发阈值 = 有效窗口 - 13K 缓冲区
≈ 87K tokens
三种触发方式
| 方式 | 触发条件 | 说明 |
|---|
| auto | Token 接近阈值 | 自动压缩,保留最近对话 |
| manual |
用户说压缩 | 自定义压缩范围 |
|
micro | 单次工具结果太大 | 仅压缩大文件/图片 |
压缩级别
Level 1:Micro Compact(微观压缩)
触发: 单个工具结果太大(如 grep 返回 100K tokens)
做法:
大文本 → 保留前 500 字符 + ...
图片 → [image]
文件内容 → [文件内容已压缩]
保留: 对话结构 + 关键结论
Level 2:Auto Compact(自动压缩)
触发: Token 即将用尽
做法:
- 1. 从最旧的对话开始
- 按API 轮次分组(一问一答+工具调用 = 一组)
- 将早期组压缩为结构化摘要
- 保留最近 2-3 组原始对话
- 插入压缩边界标记
Level 3:Full Compact(全量压缩)
触发: 手动 /compact 或上下文严重不足
做法:
- 1. 将所有对话压缩为单一摘要
- 可选择保留特定文件内容
- 生成下一步建议
压缩 Prompt(精华)
当需要压缩时,使用以下 prompt 模板:
压缩任务
你是一个对话压缩器。请将以下对话历史压缩为一个结构化摘要。
压缩规则
- 1. 保留用户的原始反馈 — 用户纠正你、确认你的内容最为重要
- 保留完整代码片段 — 不是修改了文件A,而是完整的函数体
- 保留错误和修复 — 犯过的错误不能遗忘
- 保留用户关键决策 — 用户明确做出的选择、偏好、方向性决策
- ❌ 不要原文抄录所有用户消息
- ✅ 提炼:用户选择了方案A,理由是...
- 5. 脱敏处理 — 过滤所有敏感信息
- API keys / tokens → 替换为 [REDACTED: api_key]
- 密码 / secrets → 替换为 [REDACTED: secret]
- 私钥 / credentials → 替换为 [REDACTED: credential]
- 完整文件路径(本地)→ 简化保留文件名即可
- 6. 不要调用工具 — 你已拥有所有上下文
输出格式
必须包含以下章节:
1. 用户主要请求
详细描述用户想要什么。
2. 关键技术点
列出涉及的技术、框架、概念。
3. 文件和代码
- - 文件名 + 为什么重要
- 做了哪些修改
- 完整代码片段
4. 错误和修复
5. 用户关键决策和反馈
提炼用户的核心选择、偏好、纠正内容。不是原文抄录,而是结构化表达。
6. 悬而未决的任务
用户让你做但尚未完成的。
7. 当前工作
最后正在做什么。
8. 下一步建议
基于用户最新请求,下一步应该做什么。
上下文窗口参考
| 模型 | 上下文窗口 | 安全阈值(87%) |
|---|
| MiniMax-M2.7 | 200K | ~174K |
| MiniMax-M2.5 |
200K | ~174K |
| MiniMax-M2.1 | 200K | ~174K |
| GPT-4o | 128K | ~111K |
| Claude 3.5 | 200K | ~174K |
压缩边界标记格式
压缩完成后,插入以下标记:
markdown
对话已压缩 @ {timestamp}
摘要概要
[1-2句话描述对话主题]
保留内容
- - 最近对话组数:{N} 组
- 压缩组数:{M} 组
- 关键文件:{file list}
压缩后的对话历史
[结构化摘要内容]
使用时机
当以下情况发生时,自动使用本技能:
- - 对话 Token 接近安全阈值(> 80% 上下文)
- 用户说压缩、compact、总结一下
- 单个工具结果异常大(如 > 10K tokens)
- 对话明显变慢或开始重复之前的内容
与 memory-hierarchy 的关系
memory-hierarchy 负责:对话外的长期记忆
conv-compactor 负责:对话内的上下文压缩
两者互补:
新对话开始 → 加载 MEMORY.md(记忆)
↓
对话进行中 → 监控 Token 使用
↓
触发压缩 → 结构化摘要
↓
可选择 → 写入 memory/(新记忆)
实施检查清单
压缩前确认:
- - [ ] Token 使用是否超过 80%?
- [ ] 是否有未完成的用户请求?
- [ ] 是否有用户的特殊偏好/反馈需要保留?
- [ ] 是否有重要的代码片段?
压缩后确认:
- - [ ] 摘要是否包含所有用户消息?
- [ ] 关键代码是否完整?
- [ ] 用户反馈是否被标记?
- [ ] 下一步是否清晰?
禁止事项
❌ 不要直接截断对话头部
❌ 不要仅保留大意而丢失代码细节
❌ 不要在压缩时调用工具
❌ 不要删除用户反馈相关内容
❌ 不要压缩正在进行的开发工作
❌ 不要在摘要中保留明文敏感信息(API keys、密码、tokens)
❌ 不要原文抄录所有用户消息