上下文管理策略
上下文窗口(Context Window)是 AI 工具在单次对话中能"看到"的全部信息。有效管理上下文是保持 AI 输出质量、避免信息丢失的关键技能,尤其在处理大型项目和长时间开发会话时。
理解上下文窗口
什么占用上下文
上下文窗口内容(按优先级排序):
┌─────────────────────────────────────┐
│ 系统提示 (System Prompt) │ ← CLAUDE.md / .cursorrules
│ 对话历史 (Conversation History) │ ← 往来消息
│ 工具调用结果 (Tool Results) │ ← 文件读取、代码执行
│ 当前消息 (Current Message) │ ← 你的输入
└─────────────────────────────────────┘Claude Code 的上下文:约 200K tokens(约 15 万汉字) Cursor 的上下文:根据模型而异,通常 32K-128K tokens GitHub Copilot Chat:约 32K tokens
上下文溢出的信号
- AI 开始"忘记"早期讨论的约定
- 生成的代码与之前的风格不一致
- AI 重复询问已经提供过的信息
- 回答变得笼统,缺乏项目特异性
上下文分层策略
将信息按持久性分为不同层次,分别用不同方式管理:
永久层(Permanent)
→ CLAUDE.md、.cursorrules、copilot-instructions.md
→ 项目规范、架构约定、团队规则
→ 每次对话自动加载,无需手动提供
会话层(Session)
→ 当前任务的 PRD、相关代码文件
→ 在对话开始时手动提供
→ 随对话进行而逐渐消耗
即时层(Immediate)
→ 当前操作的具体代码片段
→ 只在需要时提供,用完即弃文件作为持久上下文
CLAUDE.md 的持久化作用
将会重复使用的信息提取到文件中,避免每次重复粘贴:
markdown
# CLAUDE.md(项目级)
## 常用命令
pnpm dev # 启动开发服务器(端口 3000)
pnpm test # 运行所有测试
pnpm db:migrate # 执行数据库迁移
pnpm build # 构建生产版本
## 关键文件位置
- 路由配置:src/app/ (Next.js App Router)
- 数据库 Schema:prisma/schema.prisma
- 环境变量说明:docs/env-setup.md
- API 文档:docs/api-reference.md
## 当前开发重点
- 正在开发:考试模块(feature/exam 分支)
- 待修复:评论加载慢(issue #234)
- 下一步:支付集成(需求文档:docs/specs/payment.md)Spec 文档作为上下文锚点
工作流:
1. 将功能 PRD 保存为 docs/specs/feature-name.md
2. 在 CLAUDE.md 中注明文档位置
3. 每次对话开始时引用:
"请先读取 docs/specs/payment.md,
然后实现其中的支付初始化接口"长对话的上下文管理
策略一:周期性摘要刷新
当对话超过 20 轮时,主动请求摘要并重置上下文:
在长对话的合适节点输入:
"请总结我们到目前为止完成的工作:
1. 已实现的功能(列出文件名)
2. 当前的代码结构
3. 未解决的问题
4. 下一步计划
我将用这个摘要开启新对话,继续后续工作。"然后在新对话中:
"继续之前的开发工作。以下是上次对话的摘要:
[粘贴摘要]
当前任务:继续实现 [下一步功能]"策略二:任务边界切换
每个独立功能使用独立对话,保持上下文干净:
对话 1:实现用户认证模块
→ 完成后将代码提交
对话 2:实现课程管理模块
→ 开始时只提供必要的认证相关接口文档
→ 不需要携带认证实现的详细代码
对话 3:集成测试
→ 只需要提供两个模块的公共 API 文档策略三:选择性上下文注入
不要一次性粘贴所有相关代码,按需提供:
❌ 低效方式:
"这是整个 src/ 目录的代码 [粘贴 5000 行],
帮我修复登录功能"
✓ 高效方式:
"登录接口返回 401 错误。
相关代码:
1. 路由处理(src/app/api/auth/login/route.ts):[粘贴 30 行]
2. 认证中间件(src/lib/auth/middleware.ts):[粘贴 20 行]
3. 错误信息:[粘贴日志]
其他文件暂不需要,有需要我再提供。"分块(Chunking)策略
当单个文件或任务超出上下文限制时,使用分块策略:
大文件处理
处理大型代码文件(>300 行)的建议流程:
第一轮:理解结构
"以下是 userService.ts 的内容,请分析:
1. 主要功能和职责
2. 依赖的外部模块
3. 公共 API 列表
[粘贴文件]"
第二轮:聚焦修改
"基于上一轮的分析,我需要修改 updateUserProfile 方法。
只粘贴该方法相关的代码:
[粘贴 updateUserProfile 函数和相关类型定义]
修改目标:[具体需求]"大型重构任务
将大型重构分为可独立执行的批次:
批次 1:数据层(models/)
→ 独立对话,只需要数据库 schema 和现有 model 文件
批次 2:服务层(services/)
→ 独立对话,需要提供批次 1 的新 model 接口
批次 3:控制层(controllers/)
→ 独立对话,需要提供批次 2 的新 service 接口
批次 4:测试更新
→ 独立对话,需要提供各层新接口文档上下文质量优化
减少噪音
提供上下文时的过滤原则:
✓ 应该包含:
- 与当前任务直接相关的代码
- 错误信息和堆栈跟踪
- 相关的类型定义
- 关键的配置文件
✗ 应该排除:
- 完整的 node_modules 路径
- 自动生成的代码(.d.ts、生成的迁移文件)
- 与当前任务无关的文件
- 已经讨论过且已解决的问题上下文锚定技术
在长对话中定期重申关键约束,防止"上下文漂移":
每隔 5-10 轮对话,加入一次锚定语句:
"提醒:本项目使用 TypeScript 严格模式,
所有函数必须有明确的返回类型,
继续当前任务..."上下文管理工具对比
| 工具 | 持久上下文方式 | 上下文窗口 | 建议策略 |
|---|---|---|---|
| Claude Code | CLAUDE.md(自动加载) | ~200K tokens | 充分利用 CLAUDE.md,大任务按功能分对话 |
| Cursor | .cursorrules + @file | 32K-128K tokens | 用 @file 精准引入,避免 @codebase 全量 |
| Copilot Chat | copilot-instructions.md | ~32K tokens | 每次只引入直接相关文件,多用 /fix /explain |
| 通用 LLM API | 系统提示 | 模型限制 | 实现滑动窗口,保留最近 N 轮 + 摘要 |
实战检查清单
开始新对话时:
- [ ] CLAUDE.md 是否包含当前任务相关的约定?
- [ ] 是否需要提供 PRD 或需求文档?
- [ ] 当前任务是否可以独立完成(不依赖本次对话历史)?
对话进行中:
- [ ] 是否已超过 15-20 轮(考虑摘要刷新)?
- [ ] AI 的回答是否开始偏离项目规范(考虑重新锚定)?
- [ ] 是否在重复粘贴相同内容(考虑提取到 CLAUDE.md)?
完成任务后:
- [ ] 将重要决策更新到 CLAUDE.md(
当前已知问题、架构约定) - [ ] 将完成的功能 spec 归档到 docs/specs/
- [ ] 清理 CLAUDE.local.md 中的临时调试信息
核心原则:将"对话中反复用到的信息"变成"文件中长期存储的知识"。上下文管理的本质是知识管理——让 AI 每次都能在最短时间内获取到最相关的信息。