资讯详情

资讯详情

蚂蚁面试官追问:Claude Code的/compact到底做了啥?TaoToken实测拆解上下文压缩链路

1. 面试官那句“你理解得有点浅”到底浅在哪Claude Code 的/compact是什么一句话说它是把一段已经跑得很长的对话重写成一份结构化摘要再拼回上下文里继续干活。它能解决的核心问题是长任务跑到一半上下文窗口快满了token 烧得心疼但你又不想丢掉之前改过哪些文件、定过哪些约束。适合谁适合用 Claude Code 做真实项目、动辄几十轮对话、被上下文漂移折磨过的开发者。很多人第一次被问“/compact做了啥”脱口而出就是“自动总结对话”。这个回答不算错但面试官一追问就露馅压缩之后模型怎么知道之前改过哪些文件如果文件在压缩后又变了摘要里写的是旧的模型怎么拿到新的这两个问题一出来“自动总结”四个字就撑不住了。我一开始也以为它就是个总结接口。仔细拆完才发现/compact根本不是“调一个总结 API 把历史揉成一段话”而是一整套链路拼接一条伪装成 user 的强制指令、让模型按 9 章固定模板产出结构化摘要、客户端丢掉思维链只留 summary、再额外补上文件重读和各类 attachment。摘要只是第一步真正让模型“能继续干活”的是摘要之外那一堆补偿机制。这篇就按这条链路逐层拆先讲清楚/compact触发时到底发生了什么再讲怎么在 TaoToken 上把这套流程跑起来做实测然后给你可复制的配置、压缩前后的 token 对比验证动作最后把常见报错一个个排掉。读完你应该能自己回答面试官那两连问而不是停在“自动总结”。2. 拆解 /compact 的压缩链路与 token 回收机制先把链路讲透不然后面配置和验证都是空中楼阁。/compact激活之后Claude Code 做的第一件事不是“总结”而是拼接一条伪装的 user 消息。原始对话可能有 99 条消息、接近 10 万 token客户端会把这条新消息追加到末尾用CRITICAL级别的大写开头属于强制指令级别。目的很明确让模型按固定模板、不能省略、不能用普通聊天的方式去处理。这条指令要求模型把完整对话历史压缩成一个固定模板的结构化摘要模板写成 9 个章节任务目标、整体架构、文件变更、决策、已解决的问题、全部用户指令、约束、当前状态、下一步。这本质上是一种“让模型自己按固定模板把长对话压成结构化摘要”的策略靠固定模板加容错模式设计保证压出来的信息是可复用、结构化的而不是一段自由发挥的摘要。模型回复里会有三个部分属于“两层皮”设计。第一层是禁止执行任何工具禁止模型在总结过程中调用 Read、Bash、Edit防止它偷偷替用户改文件。第二层是强制生成analysis和summary先做一轮内部推理也就是思维链 CoT再产出摘要确保准确性。同时第 6 章“全部用户指令”要求原封不动保留防止复述时添油加醋第 9 章每一步都加一句 direct quote 原文摘录保证压缩后还能准确衔接上下文。关键的一步在模型写完之后客户端会把analysis全部丢弃只保留summary。analysis是模型自己打的草稿不是给用户看的也不是给未来模型看的它只是用来消耗一部分原始对话的 token。最终进入上下文的核心内容只有 summary。压缩效果大概是原始 10 万 token、99 条消息压缩后只剩 1 万 token、messages 从 99 条变成 4 条。但压缩后的 4 条消息里装的可不只是摘要。它包含9 章结构化摘要、紧接着的一条 assistant 回复保证对话结尾不缺失、5 个文件自动附录把之前对话里提到过的文件重新读一遍确保客户端状态是新的而不是摘要里可能过时的片段以及一些 hook context 和系统注入的辅助信息。也就是说“恢复”不是“总结对话”那么简单而是要恢复成可继续工作的状态。所以我的结论是/compact更像一个工程补丁而不是优雅的上下文压缩。只靠一个 summary模型无法恢复“可继续执行”的工作状态——摘要会丢细节、缺可执行计划、缺约束。客户端必须额外补上最近文件的 Read 结果、planAttachment当前任务规划附件、skillAttachment技能/指令附件模板等等。核心矛盾在于要压得足够小以省 token但压缩过程中位置信息必然丢失于是只能靠多层机制拼出一个“够用”的上下文。这也是复杂长任务里上下文漂移、状态丢失、连续性断裂会很明显的原因。3. 在 TaoToken 上跑通 /compact 的可复制配置要把这套链路实测出来先得把 Claude Code 接到一个稳定的入口上。我用的是 TaoToken官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。下面这套配置你可以直接抄路径和字段名保持一致。先拿 Key进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建一个新 Key复制出来。注意 Key 只在创建时完整显示一次丢了就重建。Claude Code 的配置走settings.json路径一般是~/.claude/settings.json。可复制片段如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-5-20250929, ANTHROPIC_SMALL_FAST_MODEL: claude-haiku-4-5-20251001 }, permissions: { allow: [Read, Edit, Bash] } }三件套对齐一下Base URL 填https://taotoken.net/apiKey 填你刚建的sk-开头那串Model ID 填claude-sonnet-4-5-20250929或你账号可用的其他模型。如果你用的是 Codex 那套配置落在~/.codex/auth.json字段是OPENAI_BASE_URL和OPENAI_API_KEYBase URL 同样指向 TaoToken 的 API 入口Model ID 换成对应模型即可。如果你用 CC Switch 管理多套配置在它的 provider 列表里新增一条Base URL、Key、Model ID 三件套照上面填切换时直接选这条。Cline 走 MCP 的话在 MCP server 配置里把 endpoint 指向 TaoToken 的 API 地址鉴权头带上Authorization: Bearer sk-你的Key。配置完先别急着压先确认基础连通。跑一条最小请求curl https://taotoken.net/api/v1/messages \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-5-20250929, max_tokens: 64, messages: [{role: user, content: reply with ok}] }返回里能看到content字段带正常文本说明 Base URL 和 Key 都对。这一步过了再进 Claude Code 里做/compact实测否则后面报错你分不清是压缩逻辑的问题还是接入的问题。4. 压缩前后 token 对比验证与成功结果配置通了接下来做压缩前后的对比验证。这一步是回答面试官问题的关键你得亲眼看到 token 从多少掉到多少、messages 从几条变成几条。先构造一段足够长的对话。在 Claude Code 里连续做几轮真实操作比如让它读几个文件、改一处逻辑、跑一次测试把对话堆到几十条消息。然后记录压缩前的状态。Claude Code 里可以用/cost或状态栏看当前 token 用量也可以直接观察上下文占用百分比。假设你现在是 99 条消息、约 10 万 token。触发压缩/compact回车之后客户端会拼接那条 CRITICAL 级别的伪装 user 消息模型开始按 9 章模板产出analysis和summary。你会看到它先输出一段内部推理再输出结构化摘要。等它跑完客户端丢掉analysis只留summary然后补上文件附录、assistant 衔接回复、hook context 和各类 attachment。压缩完成后再记录一次状态。实测下来token 会从约 10 万掉到 1 万以内messages 从 99 条变成 4 条左右。这个压缩率很高但你要清楚代价抹掉的是过程细节留下的是结构化结论。验证“文件附录是否生效”有个直接办法压缩前让 Claude Code 改一个文件压缩后再问它“刚才改的是哪个文件、改成什么了”。如果它答得出来说明文件附录把最新内容重新读进来了而不是只靠摘要里可能过时的片段。再问它“我们之前定过哪些约束”看它能不能从第 7 章约束里准确复述。这两个动作做完你对/compact的边界就有体感了。想更细地看 token 回收可以在压缩前后各跑一次带usage的请求对比input_tokens字段。压缩后的请求因为上下文变短input_tokens会明显下降。这就是 token 回收的直接证据。5. 常见报错排查401、local proxy failed 与 reading choices实测过程中最容易撞的几个错我一个个列出来对照。401 Unauthorized多半是 Key 没填对或没生效。检查settings.json里ANTHROPIC_AUTH_TOKEN是不是完整的sk-开头串有没有多余空格或换行。如果刚在控制台重建过 Key旧 Key 会失效记得同步更新配置。还有一种情况是 Base URL 写成了带路径的完整地址正确写法是https://taotoken.net/api不要自己拼/v1/messages到 Base URL 里。local proxy failed / connection refused这类通常是本地网络或代理层的问题。先确认ANTHROPIC_BASE_URL没被其他工具覆盖比如你同时装了多个 Claude Code 配置管理工具环境变量互相打架。检查env里有没有残留的旧地址。如果用了 CC Switch确认当前选中的 provider 就是 TaoToken 那条。reading choices 报错这个一般出现在响应结构不符合预期时比如模型返回的 JSON 里没有choices或content字段。常见原因是 Model ID 填错请求打到了一个不支持的模型上。回到三件套核对Base URL、Key、Model ID 是否和账号可用模型一致。换成claude-sonnet-4-5-20250929再试。OAuth 相关报错如果你之前用官方登录态跑过 Claude Code切到 API Key 模式后可能残留 OAuth token导致鉴权冲突。清掉旧的凭据缓存确保走的是ANTHROPIC_AUTH_TOKEN这条路径而不是 OAuth 流程。压缩后模型“失忆”这不是报错但很常见。表现是压缩后模型不记得某个细节。原因就是摘要丢了过程信息而文件附录只覆盖提到过的文件。解决办法是在压缩前把关键约束、关键决策明确写进对话里让它们落进第 6、7 章。或者压缩后手动补一句“当前任务是 X约束是 Y”帮它重新对齐。排查顺序建议先跑第 3 节那条 curl 确认接入层没问题再进 Claude Code 看是不是压缩逻辑本身的行为。接入层和压缩层分开定位能省很多时间。6. 把 /compact 用对的几个实操建议回到面试官那两连问现在你应该能答了压缩后模型靠 9 章摘要里的“文件变更”和“当前状态”知道改过哪些文件文件在压缩后变了靠客户端的文件自动附录重新读最新内容而不是信摘要里的旧片段。这就是/compact比“自动总结”复杂的地方。实操上给你几条建议。第一别等上下文快满了才压留出余量压缩本身也要消耗 token。第二压缩前把关键约束和决策显式写进对话它们才有机会进摘要模板。第三压缩后如果要做精细操作先让模型重读相关文件别直接信摘要。第四长任务里把 planAttachment 和 skillAttachment 维护好它们是摘要之外维持连续性的关键。如果你要长期跑编码任务或 Agent 流程可以考虑用 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 来管理额度接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型对话行为可以直接在模型对话 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 里试。Claude Code 相关的接入细节参考 https://taotoken.net/doc/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 。最后一句实在话/compact不是银弹它是压缩和保真之间的一个工程折中。理解它的边界比记住它的名字有用得多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →