Skip to content

上下文管理策略

上下文窗口(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 CodeCLAUDE.md(自动加载)~200K tokens充分利用 CLAUDE.md,大任务按功能分对话
Cursor.cursorrules + @file32K-128K tokens用 @file 精准引入,避免 @codebase 全量
Copilot Chatcopilot-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 每次都能在最短时间内获取到最相关的信息。