Clipping 微信公众号

蚂蚁面试官:claude code的-compact到底做了啥- 我说-自动总结-,他说我理解的太肤浅了

by 算法狗 原文 ↗
Created: 2026-07-05

公众号名称:算法狗

作者名称:算法狗

发布时间:2026-07-04 17:40

前几天有个粉丝私信我,说他面蚂蚁的时候被问了一道题:你知道 Claude Code 的/compact 功能是怎么工作的吗?

他当时挺自信的,说这不就是”自动总结对话”嘛,把长对话压缩一下省 token。面试官听完笑了笑,问他:那压缩之后,模型是怎么知道之前改过哪些文件的?

他愣了一下,说应该也总结进去了吧。面试官又问:那如果文件内容在压缩之后变了呢?摘要里写的是旧的,模型怎么拿到新的?

他挠挠头,说不太清楚——这个细节他从来没想过。面试官没追问,只是说”你理解的有点浅了,回去研究研究”。

他后来私信我,问我/compact 到底做了什么。我一开始也以为就是个总结功能,仔细研究了一下才发现,这背后的设计比”自动总结”复杂得多。今天把这个说清楚。

✦ ✦ ✦

一、/compact 的时候到底发生了什么

/compact 激活之后会走一个流程,Claude Code 并不是简单地调一个”总结”接口,而是会做这些事情:

  1. 1.把原始对话(大概 99 条消息、10 万 token)最后拼接一条伪装的 user 消息。

  2. 2.这条消息用CRITICAL 级别的大写开头,属于强制指令级别的,目的是让模型按照固定模板、不能省略、不能用普通聊天方式去处理。

  3. 3.然后要求模型把完整对话历史给压缩成一个固定模板的结构化摘要,模板写成了9 个章节。这 9 个章节分别是:

  4. 1.任务目标

  5. 2.整体架构

  6. 3.文件变更

  7. 4.决策

  8. 5.已解决的问题

  9. 6.全部用户指令

  10. 7.约束

  11. 8.当前状态

  12. 9.下一步

这本质上就是一种”让模型自己按照固定模板把长对话压缩成结构化摘要”的策略,通过固定模板加容错模式设计,去保证压缩出来的信息是可复用的、结构化的,而不是一段模型自由发挥的摘要。

✦ ✦ ✦

二、模型内部的”两层皮”设计

模型回复里面会有 3 个部分,属于两层皮设计,每层都有各自的功能定位:

  • 禁止执行任何工具:禁止模型在”总结”过程中调用 Read、Bash、Edit 这些工具,防止它偷偷替用户去把文件改了。
  • 强制生成 和:强制模型先做一轮”内部推理/思考”,再去生成摘要,其实就是 Chain of Thought,也就是思维链,确保摘要的准确性。
  • 把第 6 章”全部用户指令”原封不动保留:防止模型在复述用户历史指令的时候”添油加醋”,丢失关键的原始细节。
  • 把第 9 章每一步都加一句 direct quote 原文摘录:保证压缩之后还能准确衔接对话的上下文,不会出现”片段”丢失的情况。

你可以看到这些设计策略其实都是有目的的写进 prompt 的,属于对压缩过程中容易出现的信息丢失模式做针对性防御。用工具就会改文件;直接摘要就会丢细节;转述就会丢原意;结尾没有原文就会衔接不上。

✦ ✦ ✦

三、模型写完之后,客户端会做什么

有一个很关键但也容易被忽略的一步。

  • ◆模型按照模板去生成 + 这些内容。
  • Claude Code 客户端会把 全部丢弃,只保留。核心内容才会进入上下文。

也就是说:

  • ◆ 里面是”模型自己打的草稿/思考过程”,这部分不是给用户看的,也不是给未来模型看的,只是用来消耗一部分原始对话的 token(这部分 token 还是挺大的)。
  • ◆最后客户端只看得到 这部分。

压缩效果大概是:

  • 原始对话:大概 10 万 token,99 条消息
  • 压缩后:只剩 1 万 token,messages 从 99 条变成 4 条

可以说压缩率非常高了,但是这种”高度压缩”本身是抹掉”过程细节”的,留下的只有结构化的最终结论信息。

✦ ✦ ✦

四、压缩后的”4 条消息”到底装了什么

值得注意的是,压缩之后剩下的可不只是那被精简的 4 条消息,还有这些内容:

    1. 里面是 9 章结构化摘要。
  1. 2.紧接着的一条 assistant 回复(最后一句衔接,确保对话结尾不缺失)。
  2. 3.5 个文件自动附录:Claude Code 会主动把之前对话里提到过的文件,确保客户端状态是新的,而不是摘要里可能已经过时的片段。
  3. 4.一些 hook context 和系统注入的辅助信息。

也就是说,“恢复”并不是”总结对话”那么简单,而是要恢复成可继续工作的状态。这里面有摘要、有文件附录、有上下文衔接。换句话说,实际工程里目前的做法其实远没有”一句话总结”那么简单,客户端还得额外做很多事情来保证上下文准确性。

✦ ✦ ✦

五、总结一下(“/compact 是个大补丁”)

我的结论是:/compact 并不能算是一种优雅的”上下文压缩”机制,反而更像是一种工程上的补丁

  • 局限性:只靠一个摘要(Summary),模型无法恢复”可继续执行”的工作状态。摘要会丢失细节、缺可执行的计划和可参考的约束。

  • 客户端的补偿:除了 Summary 以外,还要额外附加:

  • ◆最近文件的 Read 结果,确保内容是新的

  • planAttachment,也就是当前任务的规划/计划的附件

  • skillAttachment,技能/指令相关的附件模板

  • ◆以及各种其他上下文信息

换句话说,“摘要”只是压缩后的第一步,模型能不能”恢复”到能干活,还得靠摘要之外的一系列围绕文件重读、重新附计划、重新附技能文档等等来做弥补。这也说明在复杂项目/长任务场景下,目前的工程实现其实远没有”一句话总结”那么简单,上下文漂移、状态丢失、连续性断裂这些坑还是需要大量补丁来维持一致性的。

✦ ✦ ✦

六、附上流程图

99条消息 / ~10万token

拼接伪装的 CRITICAL user 消息(强制重写指令)

模型生成 +

(9章结构化模板)

客户端丢弃 ,只保留

客户端组装最终上下文(模板):

Summary + 紧接着一条assistant回复

+ 5个文件自动附录

+ hook context

+ planAttachment / skillAttachment …

最终模型:4条消息 / <1万token

✦ ✦ ✦

小结

/compact 并不是”总结对话”那么简单一句话能概括的,它是:

  1. 1.一次结构化的强制重写:用固定模板加容错模式设计,保证压缩过程的稳定性。
  2. 2.一次客户端的补偿机制:不只是靠模型摘要,还要靠文件重读、重新附计划、重新附技能文档等等来维持一致性。
  3. 3.一次对客户端资源的重建:摘要加文件附录加各种 attachment,共同拼出一个”压缩后的上下文”,让模型能继续干活。

这种设计的核心矛盾在于:要压缩得足够小以省 token,但压缩过程中位置信息必然丢失。所以客户端必须用多层机制来弥补:摘要加文件重读加重新附计划和技能文档等等,来拼凑出一个”够用”的上下文。这也是为什么在复杂对话/长任务场景下,上下文漂移、状态丢失、连续性断裂这些问题会变得很明显的原因。

你用过/compact 吗?有没有遇到过压缩之后模型”失忆”的情况?评论区聊聊。


内容效果不满意?点此反馈

输入关键词开始搜索