上下文过长时 /context 与 /compact 命令的职责分工(详解 Claude Code 的会话窗口治理机制)

会话上下文窗口逼近上限时,Claude Code 提供了一对”看”与”治”的命令:/context 负责把当前窗口的 token 构成、占用大头、可优化点以可视化方式呈现出来,但不会动任何东西;/compact 负责把历史对话压缩成结构化摘要,让同一会话”瘦身续命”,但会丢掉部分中间过程。这一对职责的清晰分层,背后反映的是 Claude Code 把上下文窗口作为”一等资源”来治理的设计取向——把诊断与治疗分开,让用户能基于可视化的判断决定是否动手。

一、为什么需要把”诊断”和”压缩”分成两条命令

Claude Code 的会话窗口承载三类内容:系统提示词与 CLAUDE.md 指令、对话历史、工具调用结果。一段长会话下来,单是”读文件”和”跑测试输出”就能吃光大半窗口;模型不会主动告诉你”它已经忘了前 30 轮说过什么”,等到表现下滑再处理往往已经太晚。把诊断(/context)和压缩(/compact)拆成两条命令,是为了让”了解现状”和”动手治理”成为两个独立决策——前者永远零成本,后者可带提示。

二、两条命令的职责对照

维度 /context /compact
是否修改上下文 否,仅展示 是,替换历史为摘要
主要输出 彩色网格 + 各部分 token 占比 一段结构化摘要 + 续接会话
典型用途 诊断 token 都花到了哪里 释放空间,让同一会话继续推进
成本 零成本,只读本地会话元数据 触发一次模型调用生成摘要
与 CLAUDE.md 关系 在 Memory files 段列出已加载文件 摘要保留 CLAUDE.md 指令不被压缩
建议时机 上下文超过 50%、准备压缩前 上下文 70%–90%、任务阶段切换

一句话区分:/context 决定”该不该动手”,/compact 真的去动手。

三、/context:只看不动的诊断视图

/context 接收一个可选参数 all,输出包含四段:token 分布(系统提示词 / CLAUDE.md / 对话历史 / 工具结果各占多少)、Top 贡献者(哪些文件被读了多次、哪些工具输出特别大)、可执行建议(”建议删除某文件””建议执行 /compact”)、优化机会(路径限定、技能去重、MCP 缓存)。它会从本地 ~/.claude/projects/*.jsonl 读取会话元数据,不发起新的模型调用,是一个零成本的体检动作。

落地时按四步用:

  1. 在长会话任意节点执行 /context 看基线;
  2. 跑完一段大文件读取或测试套件后,再跑一次 /context 看新增占用;
  3. 看到某类文件被多次读取且无修改时,准备进入 /compact;
  4. 准备压缩前再用一次 /context 全量视图,确认要保留的”重点”。

下面是一次典型的输出形态(示意):

⚠️ Top token consumers:
- src/legacy/old-api.ts (12.4k tokens, read 3 times)
- tests/fixtures/large-data.json (8.9k tokens)
💡 Suggestions:
- Remove src/legacy/ from context (not modified this session)
- Consider /compact (context at 73%)

注意:这条命令不会真去删任何文件或清理上下文,它只告诉你”如果不处理会怎样”。

四、/compact:可携带保留指令的压缩动作

/compact 接收一段可选的提示词,作用是把此前的对话历史压成一段结构化摘要,并让会话从摘要处续接。它的工作方式有四个关键点:

  1. 调用模型生成摘要,原对话轮次被摘要替换;
  2. 最近约 10–15 条消息原样保留,避免”刚做的决策也被吃掉”;
  3. CLAUDE.md 指令、当前文件内容、工具状态原样保留;
  4. 典型能腾出 40%–60% 的可用空间,具体幅度取决于被压缩的轮次长度。

落地步骤按四步走最稳:

  1. 在自然的阶段边界(设计→实现、调试→修复)触发,不要等满了才压;
  2. 写明要保留的内容,例如 保留已确认的鉴权方案与未解决的边界 case;
  3. 压完之后跑一次 /context 复检,确认占比回落到安全区;
  4. 在新阶段开始前再压一次,把上一阶段的试错过程丢掉。

下面给一个带提示词的压缩写法示例:

/compact 保留:
- 已确认的接口契约与命名
- 已修复的 Bug 与其根因
- 仍存在的边界 case 与下一步动作
丢弃:失败尝试、临时讨论、过期方案

/compact 是”在同一会话内”延续工作的关键。释放空间的同时不丢”长期事实”,这是它与 /clear 的根本区别——后者会把对话清空、靠 CLAUDE.md 重新初始化,会话状态彻底换新。

五、这反映了 Claude Code 在哪一核心机制上的设计

两条命令的分层背后,是 Claude Code 把”上下文窗口当作一等资源来治理”的设计:会话从启动那一刻起,就同时存在”常驻成本”(系统提示词、CLAUDE.md、Skills 描述)和”会话成本”(历史、工具结果)两类占用。设计者没有把”什么时候压缩”完全交给模型自动决定,而是把它拆成”先看 /context,再做 /compact”的两步流程,把决策权留给用户。

具体表现为四个设计选择:

  • 诊断零成本:/context 不发起模型调用,只读本地元数据,鼓励用户频繁用;
  • 压缩可带提示:/compact 接受自然语言提示词,把”什么值得保留”的判断权交还用户;
  • CLAUDE.md 永远在:被压缩的只是对话历史,常驻指令始终保留,因此压缩不丢”团队规则”;
  • 自动压缩作安全网:当窗口逼近极限,会触发自动压缩,但生产实践中仍推荐在自然阶段边界手动压缩,让摘要抓住”干净状态”。

理解这一层之后,治理长会话就有了一条清晰的决策链:先 /context 体检 → 在阶段边界手动 /compact 并附上保留指令 → 跑完大段读取后再 /context 复查。

六、两个常见误区

第一个误区是”等到满了再压”。自动压缩虽然兜底,但它不知道哪条决策对你重要;满了才压意味着上一阶段的关键推理已经被挤掉。第二个误区是”频繁压”。过度压缩会丢”为什么”——决策理由被吃掉,Claude 在下一阶段就可能提出与早期结论冲突的建议,常见表现是”明明已经拒绝的方案又被翻出来”。

折中做法是:把”项目级”长期事实(架构、命名规范、不可妥协的约束)放进 CLAUDE.md,让它们永远不进入压缩;把”会话级”短期事实(这次会话的决策、未解决的 case)放在 /compact 的提示词里,让压缩只丢过程不丢结论。

常见问题(FAQ)

Q1:/context 会改变会话状态吗?

不会。它只读本地元数据、生成诊断视图,不修改任何上下文。

Q2:/compact 之后 CLAUDE.md 还在吗?

在。常驻指令永远保留,被压缩的只是此前的对话历史。

Q3:什么时候用 /clear 而不是 /compact?

任务目标彻底换新、与上一段对话无任何上下文重叠时,用 /clear 重置;否则用 /compact 续命。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qiqicto@qq.com 举报,一经查实,本站将立刻删除。
赞 (0)
套餐观察官的头像套餐观察官普通用户

相关推荐

返回顶部