你有没有遇到过这种情况:跟Claude Code聊了很久,让它回忆之前讨论的内容,它却说"我不太确定"?

这不是AI变笨了,而是压缩后的"失忆"现象。今天咱们聊聊压缩后,AI到底还记得什么。

搬家时的"标签系统"

想象一下你要搬家,但新房子只有原来一半大。你怎么办?

不可能把所有东西都带过去,得有所取舍:

  • 扔掉:那些旧报纸、过期的优惠券
  • 装箱:不常用的东西,贴上标签放储藏室
  • 随身携带:每天用的东西,放随手可及的地方

Claude Code的上下文压缩也是一样的逻辑。

200K token的上下文窗口就像新房子,装不下整个代码库(旧房子)。所以得"搬家"——把旧内容"装箱压缩",只带最重要的。

有损压缩:扔掉什么、留下什么

压缩是"有损"的——就像你把高清照片压缩成微信头像,细节会丢失。

Claude Code扔掉什么

  1. 完整文件内容

    • 你之前让AI读了一个5000行的日志文件
    • 压缩后,这5000行具体内容没了
    • 但AI记得"我读过这个文件"
  2. 工具返回的详细结果

    • Grep搜索返回了1000个匹配项
    • 压缩后,1000个具体匹配没了
    • 但AI记得"我搜过,找到了一些结果"
  3. 中间思考过程

    • AI之前分析了三种方案,选了第二种
    • 压缩后,三种方案的细节没了
    • 但AI记得"我分析过,选了方案B"
  4. 过时的信息

    • 之前说"这个bug在v1.0存在"
    • 现在版本到v2.0了
    • v1.0的信息可以扔了

Claude Code留下什么

  1. 存在性记忆

    "我读过 /src/main.rs"
    "我执行过 git status"
    "我搜索过 'user authentication'"
    
  2. 关键结论

    "那个bug在utils.js第45行"
    "配置文件用YAML格式"
    "项目用React不是Vue"
    
  3. 元数据标签

    文件:/src/config.js
    读取时间:2026-05-23 10:30
    文件大小:2KB
    关键内容:数据库配置
    引用ID:file-read-12345
    

这就像搬家后的箱子:你可能不记得箱子里每件东西,但箱子上的标签告诉你"这是冬季衣服"“这是厨房用品”。

元数据:压缩后的"标签"

元数据是压缩后留下的"信息摘要"。

一个典型的压缩后状态

文件操作记录:
- 路径:/src/auth/login.js
- 操作:FileRead
- 时间:5分钟前
- 关键函数:validatePassword、generateToken
- 引用ID:read-001
- 状态:已压缩(完整内容在磁盘)

工具执行记录:
- 工具:GrepTool
- 搜索:"TODO"
- 结果数:15个匹配
- 关键发现:3个高优先级TODO
- 引用ID:grep-002
- 状态:已压缩(详细结果可重新获取)

AI看到这些,知道:

  • “我读过登录相关的代码”
  • “我搜过TODO,发现有3个重要的”
  • “如果需要详细内容,可以通过引用ID重新获取”

引用链接:需要时重新加载

压缩不是删除,而是"归档到储藏室"。需要时可以"取回来"。

重新加载的方式

方式1:自动重新读取

当AI需要被压缩的文件时,会自动用FileReadTool重新读取:

AI:我记得之前读过config.js,让我再看看
发现内容已压缩
自动执行 FileReadTool(path: "/src/config.js")
重新获取内容
继续任务

用户几乎感知不到这个过程。

方式2:摘要足够用

有时候不需要完整内容,摘要就够了:

用户:之前那个TODO找到了吗?
AI:找到了,在utils.js第45行,是关于缓存优化的。(不需要重新读取完整文件)

方式3:用户提醒

如果AI似乎忘了关键信息,你可以提醒它:

用户:我们之前不是说好用Redis做缓存吗?
AI:啊对,我想起来了。让我确认一下配置...
(AI根据你的提醒,重新加载了相关上下文)

状态恢复的策略

Claude Code会智能判断是否需要恢复状态:

自动恢复

  • AI引用被压缩的文件时
  • 系统自动用FileReadTool重新读取
  • 新读取的内容会再次进入缓存

延迟加载

  • 只在需要时才恢复
  • 避免不必要的开销
  • 类似"懒加载"模式

智能判断

  • AI自己决定"这个信息重要吗?"
  • 如果重要,会主动保留或恢复
  • 如果不重要,就让压缩掉

这就像你搬家后:

  • 每天用的东西放桌上(不压缩)
  • 偶尔用的放柜子里(轻度压缩)
  • 很少用的装箱放储藏室(深度压缩)
  • 垃圾直接扔掉(删除)

实战:应对AI的"失忆"

理解状态保留,能帮你更好地使用Claude Code:

场景1:AI说"我不太确定"

这通常是因为相关信息被压缩了。

应对:主动提醒关键信息

用户:帮我改一下认证逻辑
AI:我不太确定你指的哪个文件...
用户:就是之前我们讨论的 /src/auth/login.js
AI:啊对,我想起来了...

场景2:关键信息放CLAUDE.md

项目级的关键信息放在CLAUDE.md,它会被优先保留:

# CLAUDE.md

## 项目关键信息
- 技术栈:React + TypeScript + Node.js
- 数据库:PostgreSQL
- 认证方式:JWT
- 重要:所有API都需要认证

这些信息在系统提示词里,不会被压缩。

场景3:分段处理长对话

如果对话很长,可以主动结束当前会话,开启新会话:

"我们先到这儿,新开一个会话继续讨论下一个模块"

这样新会话的上下文是干净的,不会受之前压缩的影响。

场景4:理解不是bug

长对话中的"遗忘"是正常机制,不是AI出问题。

就像你跟朋友聊了一整天,他也不一定能记住早上说的每一个细节。

这对构建AI Agent的启示

如果你想构建自己的AI Agent,状态保留是关键:

设计压缩策略

  • 什么可以压缩?(详细内容、中间过程)
  • 什么必须保留?(关键结论、用户明确强调的)
  • 怎么判断重要性?(用户标记、AI判断、使用频率)

保留元数据

  • 即使压缩内容,也要保留"存在性"
  • 提供"引用链接"让内容可恢复
  • 记录时间、类型等关键属性

支持状态恢复

  • 提供重新加载内容的工具
  • 延迟加载,避免不必要开销
  • 缓存恢复后的内容,避免重复加载

总结

压缩后的状态保留机制,让AI能在有限记忆中优雅地工作:

  • 有损压缩:保留关键,丢弃细节
  • 元数据标签:记得"读过什么",忘了"具体内容"
  • 引用恢复:需要时可以重新加载
  • 智能判断:AI自己决定什么重要

这就像人类记忆:你记得"昨天看了一篇关于Rust的文章",但不一定记得每句话——如果需要,你可以回去再读。

理解这一点,你就能:

  • 理解AI的"失忆"行为
  • 主动帮助AI回忆关键信息
  • 在自己的AI Agent中实现类似的机制

下篇咱们聊聊微压缩——更精准的上下文修剪。