【Claude】半衰期管理:Claude Code 用一个档案员+收纳师的心法搞定上下文
你有没有遇到过这样的场景:和 Claude Code 对话到第 15 轮,它突然开始“失忆”——忘了你最初的需求,忘了刚刚改过的文件路径,甚至开始重复读取同一个大文件。你以为是模型变笨了,其实不是。是它的上下文窗口被“旧档案”塞满了。
这就好比你家的房间:台面只有那么大,你不断往里堆东西,却不做任何收纳整理。到后来,最常用的东西被埋在最底下,每次都要翻半天才能找到。
Claude Code 的解决方案不是“满了就扔”,而是请来了两位专家:一位档案管理员,负责给信息分级、建索引、做摘要;一位收纳师,负责按使用频率和“半衰期”来决定什么该摆在台面、什么该收进抽屉、什么该存进仓库。
这两位联手上阵,把上下文管理变成了一套基于信息半衰期的分级收纳体系。
下面我们就用这套“档案员 + 收纳师”的心法,把 Claude Code 的源码设计一层层拆开。
一、什么是“半衰期”?为什么信息会过期?
在物理学里,半衰期是指放射性原子核衰减到一半数量所需的时间。放在信息管理里,信息的半衰期指的是它从“有用”变成“过期”的速度。
举个例子:
| 信息类型 | 半衰期 | 说明 |
|---|---|---|
你刚执行的grep输出 | 极短(几轮对话) | 查完之后,很少再回头看原始结果 |
| 你刚读入的一个大文件内容 | 短(完成任务后) | 改完这个文件,旧内容就没用了 |
| 项目规范(CLAUDE.md) | 无限长 | 整个会话期间都必须记得 |
| 用户的核心需求 | 长 | 不能因为压缩就丢掉 |
传统的上下文管理要么不做区分(全留),要么一刀切(全删)。Claude Code 的做法是:给每条信息打上“半衰期标签”,然后让档案员和收纳师按标签执行不同的处理策略。
这两位角色是这样分工的:
- 收纳师:负责“前台”——工作台面上的即时整理。决定什么东西可以暂时收进抽屉(压缩),什么东西可以直接扔进仓库(落盘),什么东西必须摆在手边(永久保留)。
- 档案员:负责“后台”——信息的长效管理。当台面实在放不下时,启动全馆整理,对历史对话做结构化摘要,建立索引,确保关键信息能被快速找回。
二、收纳师的五层抽屉:从“随手放”到“进仓库”
Claude Code 的主循环里有 5 个连续的“收纳检查点”。收纳师会根据信息的半衰期,决定把它放进哪一层抽屉。
| 层级 | 收纳动作 | 对应半衰期 | 成本 |
|---|---|---|---|
| 1 | 大文件直接存磁盘 | 用完即弃 | 极低 |
| 2 | 精简纯工具输出 | 短 | 极低 |
| 3 | 清空老旧工具结果(占位符) | 很短 | 低 |
| 4 | 重组上下文结构 | 中等 | 中 |
| 5 | 全馆整理(LLM 摘要) | 按需保留长半衰期信息 | 高 |
收纳师有一条核心原则:先用最便宜的手段处理最短半衰期的信息,绝不轻易动用昂贵的 LLM 摘要。
🔹 第一层抽屉:大文件直接存磁盘(半衰期:用完即弃)
收纳师看到的第一类东西是体积巨大但只使用一次的工具输出,比如read_file返回的整个文件内容。
源码里定义了一个阈值:50,000 字符。超过这个大小的工具结果,不会塞进模型输入,而是直接写入磁盘文件。模型只收到一条替代消息,包含结果保存路径和开头约 2KB 的预览。
这就好比收纳师面对一个巨大的行李箱:你不会把它放在客厅茶几上,而是直接塞进储藏室。需要的时候再去拿,但平时它绝不占用台面空间。
🔹 第二层抽屉:精简纯工具输出(半衰期:短)
有些信息体积不大,但半衰期很短。比如你执行了一个ls -la命令,输出了一屏文件列表。收纳师知道:你只是想知道那个目录里有什么,看完了,这堆列表就没用了。
snipCompactIfNeeded就是做这件事的:它找到那些纯工具输出且没有后续依赖的消息,直接从消息列表中移除。
🔹 第三层抽屉:清空老旧工具结果(半衰期:很短)
到了这一层,收纳师开始更主动地“整理台面”。她不会删除信息,而是用占位符替换。
源码的microCompact.ts里有一个白名单:Read, Bash, Grep, Glob, WebSearch, WebFetch, Edit, Write。这些工具的输出结果可以被标记为“已压缩”。
具体做法是:根据时间衰减判断哪些工具结果已经够“老”了,然后把它们替换成[Old tool result content cleared]。原始数据还躺在本地 JSONL 日志里,但 API 调用时不会再发送出去。
这就像收纳师把你三天前看的杂志从咖啡桌上拿走,换成一张便签:“这里有本杂志,想看原版去书柜第三层找”。台面瞬间清爽,信息没有丢。
⚠️ 这一层不调用大模型,纯粹是本地字符串替换,每轮对话都会执行,成本几乎为零。
🔹 第四层抽屉:重组上下文结构(半衰期:中等)
前三层都搞不定时,收纳师会启动“结构性调整”——把松散的、重复的信息整合成更紧凑的形式。
源码中这部分实现文件缺失,但从调用链推断,它会在 LLM 响应生成之前,对上下文做一次重新组织,把 token 压力降到最低。
🔹 第五层抽屉:全馆整理(半衰期:按需保留长半衰期信息)
这是收纳师能用的最重的手段,也是唯一需要呼叫档案员支援的层级。
当 token 使用率达到约 80% 时,Auto‑Compact 自动触发。收纳师喊来档案员,说:“台面实在放不下了,你来做个全馆摘要吧。”
档案员接手后,执行三件事:
- 清理最占地方的旧工具结果
- 把整个对话历史压缩成结构化摘要
- 重新注入 CLAUDE.md 等永久档案,然后继续对话
三、档案员的独门绝技:摘要 + 索引 + 恢复
如果说收纳师负责“放得下”,档案员就负责“找得到”。他的核心工作不是删除,而是建立索引。
摘要不是随便写的
当档案员拿到整个对话历史,他不会让 LLM 随意总结。摘要 prompt(源码里叫AGB)强制要求输出四段式结构:
- 已完成事项:已经完成了什么功能、修复了什么 bug
- 进行中事项:当前正在做什么,做到哪一步了
- 受影响文件:修改了哪些文件,路径是什么
- 测试结果:测试通过情况、失败原因
关键代码片段、文件路径、测试输出等必须保留原始文本,不能抽象成“修改了登录模块”这种含糊说法。
这就像档案员给每份档案贴标签:不光写“财务报表”,还要写“2024年Q3、利润表、已审计”。以后找的时候,一翻索引就能定位。
文件恢复:把索引变回实物
摘要里只记录了“修改了auth.tsx”,但继续工作时,模型需要知道auth.tsx里到底有什么代码。档案员会自动恢复最多5 个最近读取的文件,总 token 预算 50K,每个文件不超过 5K。
这就像你从索引卡片上看到“资料在 B 区 3 排”,档案员会直接把那个档案盒拿到你面前。
CLAUDE.md:永久半衰期的“镇馆之宝”
有些信息半衰期无限长——项目规范、编码约定、个人偏好。这些信息绝对不能因为压缩而丢失。
Claude Code 把这些内容放在CLAUDE.md里。压缩后,档案员会从磁盘重新读取这些文件,再次注入到 system prompt 中。
你在对话里随口说的一句“记住这个路径”,半衰期很短,压缩后大概率被摘要掉。但你写在CLAUDE.md里的每一句话,都是永久馆藏。
四、收纳师 + 档案员 = 半衰期管理闭环
把两位角色的协作画成流程图:
这套闭环的核心思想是:把有限的上下文窗口,留给半衰期最长的信息。
- 半衰期极短的(单次工具输出)→ 直接存磁盘
- 半衰期短的(多次但易过时的输出)→ 精简或占位符
- 半衰期中的(历史对话)→ 结构化摘要
- 半衰期无限长的(规范、偏好)→ CLAUDE.md 永久保留
五、为什么这套心法比“截断”或“全摘要”强?
| 方案 | 缺点 | Claude Code 的解法 |
|---|---|---|
| 简单截断 | 丢掉长半衰期信息(如用户需求) | 摘要保留已完成/进行中事项 |
| 一次性 LLM 摘要 | 昂贵 + 可能丢细节 | 先尝试 4 层低成本手段,摘要作为兜底 |
| 全量保留 | 窗口很快爆满 | 按半衰期分层处理,优先淘汰短半衰期信息 |
这套心法还有一个隐藏优势:成本可控。绝大多数对话根本走不到第五层——前四层已经把短半衰期信息处理干净了,只有长时间、高复杂度的任务才会触发 Auto‑Compact。
六、面试官再问,你就这么答
如果面试官问你:“Claude Code 的上下文窗口是怎么管理的?”
你可以回答:
Claude Code 用了一套基于信息半衰期的分级管理机制。它把信息分成四类:半衰期极短的(如单次文件读取)、半衰期短的(如 grep 输出)、半衰期中的(历史对话)、半衰期无限长的(项目规范)。
针对不同半衰期,采用不同策略:短半衰期的用磁盘存储、占位符替换等低成本手段;中半衰期的做结构化摘要;无限长半衰期的放进
CLAUDE.md永久保留。这套机制的核心设计者可以理解为两位角色:收纳师负责前四层快速整理,档案员负责第五层深度摘要和索引恢复。两者配合,既保证了窗口不爆,又确保长半衰期信息永不丢失。
如果面试官追问:“那你觉得这套设计好在哪里?”
好在对成本和质量做了最优平衡。短半衰期信息不值得花 LLM 调用去做摘要,用本地字符串替换就够了;长半衰期信息值得动用昂贵的摘要,但只做一次。这种分层思想,比简单的截断或全量摘要要高明得多。
七、小结
Claude Code 的上下文管理,不是某个单一算法或阈值,而是一套完整的半衰期管理心法。
- 收纳师负责前台快速整理:磁盘落盘、占位符替换、结构调整,用最便宜的手段处理最短半衰期的信息。
- 档案员负责后台深度索引:结构化摘要、文件恢复、永久档案注入,确保长半衰期信息能被高效找回。
两位角色各司其职,层层递进,最终实现了“不删档案,只建索引”的设计哲学。
下次再遇到 Claude Code “失忆”,别怪它——可能是你的对话已经跑过了 5 层收纳,而那位档案员正在安静地为你整理下一份摘要。
