← 所有文章

上下文窗口管理:50次会话教会我的AI开发经验

我在50次Claude Code开发会话中测量了token消耗情况。结果呈现出一致的规律:输出质量在上下文利用率约60%时就开始下降,远早于硬性限制触发压缩之前。1

TL;DR

上下文窗口耗尽会悄无声息地降低AI编码质量。在构建Claude Code基础设施博客质量系统的50次会话追踪中,我发现了三种能在多小时会话中保持输出质量的模式:每完成一个子任务后主动压缩、基于文件系统的跨上下文边界持久化记忆,以及保持主上下文精简的子代理委派。核心洞察:将上下文窗口视为稀缺资源,而非无限的对话线程。


质量退化的真实表现

每次文件读取、工具输出和对话轮次都会消耗token。单次大文件读取(2,000行)可消耗15,000至20,000个token。读取10个文件并运行若干命令后,上下文窗口中的工具输出已远超实际指令内容。2

这种退化是隐性的。Claude不会宣布”我的上下文已满80%”。相反,模型开始: - 遗忘20分钟前建立的指令 - 重复三轮之前已被否决的建议 - 忽略对话早期建立的模式 - 产出连贯性较差的多文件变更

我在构建协商系统时注意到了这一模式。一个以跨8个Python模块精确进行多文件编辑开始的会话,在90分钟后退化为单文件的”隧道视野”。代理停止引用它早前读取的架构信息,因为那些上下文已被压缩掉了。


策略1:主动压缩

Claude Code的/compact命令会总结对话并释放上下文空间。系统保留关键决策、文件内容和任务状态,同时丢弃冗长的工具输出。3

何时进行压缩: - 完成一个独立子任务后(功能实现、缺陷修复) - 开始处理代码库的新区域之前 - 当Claude开始重复或遗忘早期上下文时

在密集会话中,我大约每25至30分钟压缩一次。在协商基础设施构建过程中(9份PRD,3,455行Python代码),我在每份PRD完成后进行压缩。每次压缩都保留了架构决策,同时为下一个实现阶段释放上下文空间。


策略2:文件系统即记忆

跨上下文边界最可靠的记忆存储在文件系统中。Claude Code在每次会话开始和每次压缩后都会读取CLAUDE.md及记忆文件。4

我的.claude/目录是一个结构化的”记忆宫殿”:

~/.claude/
├── configs/           # 14 JSON configs (thresholds, rules, budgets)
│   ├── deliberation-config.json
│   ├── recursion-limits.json
│   └── consensus-profiles.json
├── hooks/             # 95 lifecycle event handlers
├── skills/            # 44 reusable knowledge modules
├── state/             # Runtime state (recursion depth, agent lineage)
├── handoffs/          # 49 multi-session context documents
├── docs/              # 40+ system documentation files
└── projects/          # Per-project memory directories
    └── {project}/memory/
        └── MEMORY.md  # Always loaded into context

MEMORY.md文件跨会话捕获错误、决策和模式。目前它记录了54个有跨领域学习模式的失败案例。当我发现bash中((VAR++))set -e环境下VAR为0时会失败,我会将其记录下来。三个会话后,当我在Python中遇到类似的整数边界情况时,MEMORY.md中的条目会呈现出相关模式。5

跨领域复合效应: hook开发中的一个bash转义错误促进了Python博客检查器中正则表达式的改进。一个CSS token缺失(--spacing-2xs不存在)触发了对所有自定义属性引用的系统性审计。每条记录都连接了原本会被隔离在各个会话上下文中的不同领域。


策略3:会话交接

对于跨多个会话的任务,我会创建交接文档来捕获完整状态:

## Handoff: Deliberation Infrastructure PRD-7
**Status:** Hook wiring complete, 81 Python unit tests passing
**Files changed:** hooks/post-deliberation.sh, hooks/deliberation-pride-check.sh
**Decision:** Placed post-deliberation in PostToolUse:Task, pride-check in Stop
**Blocked:** Spawn budget model needs inheritance instead of depth increment
**Next:** PRD-8 integration tests in tests/test_deliberation_lib.py

我的~/.claude/handoffs/目录保存了49份来自多会话任务的交接文档。使用claude -c(继续)启动新会话或读取交接文档,能以最小的token开销为后续会话提供完整上下文。6

交接模式在协商系统构建中发挥了关键作用。PRD-4(递归守卫扩展)需要理解PRD 1-3中的决策。没有交接文档,新会话将需要重新读取所有修改过的文件。有了交接文档,会话直接从架构上下文开始,立即进入实现阶段。


策略4:子代理委派

子代理在独立的上下文窗口中运行。将研究或审查任务委派给子代理,可以为实现工作保留主会话的上下文。7

我的递归守卫系统自动管理此过程:

# From recursion-guard.sh - spawn budget enforcement
MAX_DEPTH=2
MAX_CHILDREN=5
DELIB_SPAWN_BUDGET=2
DELIB_MAX_AGENTS=12

每个子代理返回摘要而非原始输出,保持主上下文精简。在博客文章重写期间,我将探索性任务(收集CSS数据、读取hook代码、调查目录结构)委派给子代理。主上下文专注于写作,而子代理负责研究工作。

生成预算是通过惨痛教训得来的:早期一次没有限制的会话产生了递归子代理,每个子代理又生成更多子代理。递归守卫hook现在通过安全的整数验证和配置驱动的预算来强制执行深度限制。8


我从中吸取的反面教训

只需10行却读取整个文件。 在使用Claude Code的早期,我为了一个函数而读取整个2,000行的文件。使用行偏移:Read file.py offset=100 limit=20每次读取可节省15,000+个token。

将冗长的错误输出保留在上下文中。 调试生成预算问题后,我的上下文中保留了40多个失败迭代的堆栈跟踪。修复缺陷后执行一次/compact就释放了这些无用负担。

每次会话都预先读取所有文件。 我最初的会话会预加载8至10个文件”作为上下文”。现在我让Claude Code的glob和grep工具按需查找相关文件,节省了100,000+个token的不必要预加载。


核心要点

对于个人开发者: - 在每个子任务完成后主动压缩,而非等Claude强制压缩;以25至30分钟为间隔进行主动压缩可保持输出质量 - 在会话进行过程中将关键决策写入文件系统记忆文件;我的MEMORY.md有54条记录,跨越数百个会话持续生效 - 使用子代理处理会污染主上下文的研究任务;在主上下文中进行5个文件的研究查询消耗75,000+个token,而通过子代理仅需500个token的摘要

对于团队: - 统一多会话任务的交接文档格式;我的49份交接文档均遵循相同的”状态/文件/决策/阻塞/后续”结构 - 配置项目级CLAUDE.md文件,包含架构上下文,使其自动加载到每个会话中


参考文献


  1. 作者对50次Claude Code开发会话的token消耗测量(2025-2026)。在上下文利用率约60%时持续观察到输出质量退化。 

  2. 作者测量:平均文件读取消耗8,000至20,000个token,取决于文件大小。10次文件读取加上工具输出消耗200K上下文窗口的40-60%。 

  3. Anthropic,“Claude Code Documentation,” 2025。上下文压缩与/compact命令。 

  4. Anthropic,“Claude Code Documentation,” 2025。记忆文件与CLAUDE.md文档。 

  5. 作者的.claude/projects/*/memory/MEMORY.md文件。54个记录在案的错误,包含跨bash、Python、CSS和HTML验证的跨领域学习模式。 

  6. 作者的会话管理工作流。~/.claude/handoffs/中的49份交接文档,涵盖多会话基础设施构建。 

  7. Anthropic,“Claude Code Documentation,” 2025。子代理上下文隔离。 

  8. 作者的recursion-guard.sh实现。具有深度限制、安全整数验证和配置驱动预算的生成预算模型。