Skip to content

智能记忆:上下文管理

200K 的预算怎么花?

Claude 模型的上下文窗口是 200K tokens(大约 15 万个英文单词或 10 万个中文字)。听起来很多,但在 Agent 场景下,消耗速度比你想象的快得多:

System Prompt 包含工具描述和项目信息,通常占 5-15K tokens。

一次 Read 调用可能返回几千 tokens 的文件内容;一次 Bash 可能返回大量日志输出;对话进行了十几轮后,历史消息本身就占了大半。

上下文不够用了怎么办? 这就是 Claude Code 的压缩策略要解决的问题。

三层压缩:让对话"永不超限"

所有 LLM 都有上下文窗口限制。对话越长,历史消息越多,最终一定会超出限制。Claude Code 为此设计了三层渐进式压缩

第一层:微压缩——最小代价

微压缩只动旧的工具调用结果——把"10 分钟前读的那个 500 行文件的内容"替换成 [Old tool result content cleared]

提示词和对话主线完全保留。这一层几乎没有信息损失。

第二层:自动压缩——主动收缩

当 token 消耗接近上下文窗口的 87%(窗口大小 - 13,000 buffer),自动触发。有一个熔断器设计:连续 3 次压缩失败后停止尝试,避免死循环。

第三层:完全压缩——AI 总结

让 AI 对整段对话生成摘要,然后用摘要替换所有历史消息。生成摘要时有一个严厉的前置指令——禁止 AI 在总结过程中调用任何工具,因为这样会产生更多 token 消耗,适得其反。

压缩后的 token 预算分配

用途预算
文件内容恢复50,000 tokens
每个文件上限5,000 tokens
技能内容25,000 tokens

这些数字不是拍脑袋定的——它们是在"保留足够上下文继续工作"和"腾出足够空间接收新消息"之间的平衡点。

可以自定义压缩行为

Claude Code 在压缩前后各有 hook 点。你可以指定"这条信息绝对不能被压缩"或"压缩后额外注入这些上下文"。

这在处理重要的项目约束时很有用——比如"永远不要修改 production.config.js"这样的指令。

"Search, Don't Index" —— 搜索而非索引

这是 Claude Code 最有争议也最有教育意义的设计决定。

你可能以为会有的方案

很多 AI 编程工具用 RAG(检索增强生成)

  1. 启动时用 embedding 模型把整个代码库转成向量
  2. 用户提问时,先搜索最相关的代码片段
  3. 把相关片段注入到模型的上下文中
  4. 模型基于这些片段回答

Claude Code 实际用的方案

Claude Code 不用 RAG。它直接让模型调用 Grep(ripgrep)和 Glob 工具来搜索。

左:RAG 方案(Claude Code 不用) | 右:Search 方案(Claude Code 用的

为什么 grep 比 RAG 好?(在这个场景下)

维度RAGgrep 搜索
需要索引要。启动慢,需要同步更新不要。即搜即用
外部依赖需要 embedding 服务只需要 ripgrep(本地)
安全性代码可能发送到外部 embedding API完全本地,不泄露代码
准确性语义近似,可能不精确精确匹配,不会遗漏
复杂度需要维护索引、处理增量更新零维护
Token 成本低(只注入相关片段)高(模型可能搜多次)

核心取舍

RAG 省 token 但复杂;grep 费 token 但简单。

当模型足够聪明(知道该搜什么关键字)且上下文窗口足够大(200K)时,grep 的"笨办法"反而更实用。

Anthropic 团队说:他们试过 RAG,内部基准测试显示 grep 方案效果更好。

记忆层级

Claude Code 的"记忆"不止是对话历史。它有一个完整的记忆层级:

层级生命周期谁写的内容
CLAUDE.md永久你写项目规则、构建命令、架构说明
Auto Memory跨会话Claude 写Claude 自己总结的经验和模式
对话历史当前会话对话产生你和 Claude 的对话记录
工具缓存当前会话工具产生已读文件内容,避免重读
System Prompt每次 API 调用系统组装工具列表、项目信息、规则

CLAUDE.md — 你写给 Claude 的说明书

CLAUDE.md 是一个你手动维护的 Markdown 文件。你可以在里面写项目信息,它会在每次会话启动时自动加载到 System Prompt 中。

CLAUDE.md 可以存在多个层级:

位置作用域是否提交到 git
~/.claude/CLAUDE.md全局(所有项目)
项目根目录/CLAUDE.md当前项目(团队共享)
项目根目录/.claude/CLAUDE.md当前项目可选

建议控制在 200 行以内

CLAUDE.md 的内容会占用 System Prompt 的 token 预算。写太多反而浪费上下文空间。重点写:构建命令、测试命令、项目架构、编码规范。

Auto Memory — Claude 自己记的笔记

这是很多人好奇的功能。Auto Memory 是 Claude 自动写的,不需要你手动操作。

它存储在 ~/.claude/projects/<项目名>/memory/ 目录下:

  • MEMORY.md — 主索引文件,每次会话自动加载前 200 行
  • Topic 文件 — 按主题分类的笔记(调试经验、构建命令等)

Claude 在工作过程中会自动发现和记录有用的模式,比如"这个项目用 pnpm 而不是 npm"、"测试要用 pytest -v 才能看到详细输出"。

用 AI 来检索记忆

Claude Code 用**另一个 AI(Claude Sonnet)**来决定"哪些记忆和当前对话相关"。

不是关键词匹配,不是向量搜索——是让一个小模型快速扫描所有记忆文件的标题和描述,选出最多 5 个最相关的,然后把它们的完整内容注入到当前对话的上下文中。

策略是**"精确度优先于召回率"**——宁可漏掉一个可能有用的记忆,也不塞进一个不相关的记忆污染上下文。

KAIROS 模式:AI 在"夜间做梦"

这是源码中最让人觉得科幻的部分。

代码中有一个叫 KAIROS 的特性标志。在这个模式下:

  1. 长会话中的记忆不是存在结构化文件里,而是存在按日期的追加式日志
  2. 一个 /dream 技能会在**"夜间"(低活跃期)**运行
  3. 把这些原始日志蒸馏成结构化的主题文件

AI 在"睡觉"的时候整理记忆。 这已经不是工程了,这是仿生学。

你可能没注意到它在工作

Auto Memory 是静默运行的——Claude 不会明确告诉你"我正在记笔记"。你可以用 /memory 命令查看它记了什么,也可以开关这个功能。

如果你在用 Claude Code 时感觉"它好像越来越了解我的项目了",那就是 Auto Memory 在起作用。

和其他工具的对比

工具手动记忆自动记忆
Claude CodeCLAUDE.md(你写)Auto Memory(Claude 写)
Codex配置文件有,每次会话后自动记录
CursorRules / .cursorrules有 Memories 功能(设置中开启)

实际效果

这套上下文管理系统的实际效果是:

  1. 短对话(几轮):完全不需要压缩,200K 绰绰有余
  2. 中等对话(十几轮):可能触发一次压缩,不影响使用
  3. 长对话(几十轮):多次压缩,但关键信息保留。极长对话可能会"忘记"早期细节
  4. 跨会话:通过 CLAUDE.md 和 Auto Memory,项目级知识永不丢失

小结

上下文管理的核心原则:

  1. 压缩而非丢弃 — 旧消息被总结,不是被删
  2. 简单胜过精巧 — grep 搜索比 RAG 更可靠
  3. 分层记忆 — 不同生命周期的信息用不同方式存储
  4. 安全优先 — 不把代码发给外部服务做索引

到这里,你已经理解了 Claude Code 的所有核心系统。最后一章——自己动手:从读者到构建者