「AI 的最大短板不是智力,而是记忆。但有了正确的上下文管理,你可以绕过这个限制。」
开场:AI 的"失忆症"
小维在用 Claude Code 做一个项目,已经和 AI 对话了一个小时。
突然,AI 给他生成了一段代码,忘记了他们一开始定好的 TypeScript 接口格式,直接用了 JavaScript 风格。
"你忘了我们用的是 TypeScript 了?"小维无奈地问。
这是 AI 编程工具最常见的问题之一:上下文遗忘。
在一次长对话中,早期说过的内容可能被 AI "忘记"。对话越长,这个问题越严重。
好消息是:这个问题有系统性的解决方法。
全局视角:上下文遗忘的原因和应对策略
graph TD
A["上下文遗忘问题"] --> B["原因:\n上下文窗口有限\n早期内容被截断"]
A --> C["影响:\n代码风格不一致\n忽略前期约束\n重复解释同样的事"]
B --> D["应对策略"]
C --> D
D --> E["策略一:\n结构化上下文文件\n.cursorrules/CONTEXT.md"]
D --> F["策略二:\n对话分段管理\n每段一个功能"]
D --> G["策略三:\n关键信息重新注入\n定期提醒AI"]
D --> H["策略四:\n利用工具的上下文特性\n@文件引用"]
核心知识点一:上下文窗口——AI 记忆的物理限制
AI 的"记忆"是有物理限制的——这个限制叫上下文窗口(Context Window)。
什么是上下文窗口:
AI 在回答每一个问题时,能"看到"的文本量是有限的,这个限制用 Token 来计量。
| 模型 | 上下文窗口 | 大约等于 |
|---|---|---|
| GPT-3.5 | 16K tokens | 约 12,000 字 |
| GPT-4o | 128K tokens | 约 96,000 字 |
| Claude 3.5 | 200K tokens | 约 150,000 字 |
| Claude 3.7 | 200K tokens | 约 150,000 字 |
关键问题:即使上下文窗口很大,在长对话中 AI 的注意力也不是均匀分布的。
研究表明,AI 对对话开头和对话结尾的内容关注度更高,中间的内容容易被"遗忘"(注意力变弱)。
这意味着:在很长的对话中,即使内容还在上下文窗口内,早期说的事情也可能被 AI 忽略。
核心知识点二:上下文管理的四种策略
策略一:.cursorrules 文件——全局项目上下文
在项目根目录创建 .cursorrules 文件,Cursor 会自动将这个文件的内容注入到每次对话的上下文中。
这意味着什么:你在 .cursorrules 里写的内容,Cursor 每次都会"记得",不会遗忘。
.cursorrules 文件示例:
# 项目规范
## 技术栈
- 语言:TypeScript 5.0
- 框架:Node.js 20 + Express 5
- 数据库:PostgreSQL 16 + Prisma ORM
- 测试:Jest + Supertest
- 代码风格:ESLint + Prettier
## 目录结构
src/
routes/ # Express 路由
controllers/ # 业务逻辑
services/ # 服务层(数据库操作)
models/ # Prisma 模型
middleware/ # 中间件
utils/ # 工具函数
types/ # TypeScript 类型定义
## 代码规范
- 所有函数必须有 TypeScript 类型注解
- 使用 async/await,不用 Promise.then
- 错误处理:业务错误用 AppError 类,HTTP 错误用相应状态码
- 日志:使用 logger.ts 中的 logger 对象,不直接用 console.log
- 所有 API 接口返回格式:{ data: T, message: string } 或 { error: string }
## 重要约束
- 不引入新的 npm 包,使用已有依赖
- 不修改 src/types/index.ts 中已有的类型定义
- 所有数据库操作必须有事务处理(关键操作)
- 不在代码里硬编码配置值,使用环境变量
使用技巧:.cursorrules 里放项目级别的永久约束,不要放任务特定的临时约束。
策略二:对话分段——一次对话一个功能
错误做法:在一个对话里完成整个项目的开发
对话1: 帮我设计整个系统架构
对话1: 实现用户认证模块
对话1: 实现商品管理模块
对话1: 实现订单模块
对话1: 帮我优化性能
...(对话越来越长,AI 越来越"失忆")
正确做法:每个功能用一个新的对话
graph LR
A["对话1\n系统架构设计\n(完成后关闭)"] --> B["对话2\n用户认证模块\n(新开对话)"]
B --> C["对话3\n商品管理模块\n(新开对话)"]
C --> D["对话4\n订单模块\n(新开对话)"]
每次新对话时,在开头注入关键上下文:
项目背景(请记住以下内容):
- 技术栈:Express.js + TypeScript + PostgreSQL
- 用户认证已完成,使用 JWT,具体实现在 src/middleware/auth.ts
- 数据库 Schema 在 prisma/schema.prisma
- 代码风格:async/await,不用 Promise.then
当前任务:实现商品管理 CRUD API
...
策略三:CONTEXT.md——便携式上下文文件
对于复杂项目,创建一个 CONTEXT.md 文件,记录最重要的项目信息,每次开新对话时引用它:
CONTEXT.md 模板:
# 项目上下文(每次新对话时粘贴此文件内容)
## 项目简介
[一段话描述项目是什么]
## 当前状态
- 已完成:[列出已完成的模块]
- 进行中:[当前工作的模块]
- 待开发:[还没开始的模块]
## 关键决策记录
- 选用 PostgreSQL 而不是 MongoDB,因为数据有复杂的关联关系
- 认证用 JWT 无状态 Token,不用 Session,因为需要支持多端
- 文件存储用 MinIO,不用云存储,因为数据安全要求
## 已有的重要文件
- src/lib/db.ts:数据库连接
- src/lib/auth.ts:JWT 工具函数
- src/middleware/errorHandler.ts:统一错误处理
- src/types/index.ts:所有 TypeScript 类型定义
## 接口规范
所有 API 返回格式:
成功:{ success: true, data: T }
失败:{ success: false, error: string, code: number }
使用方式:
在 Cursor 里:@CONTEXT.md 帮我实现...
在 Claude Code 里:先读 CONTEXT.md,然后帮我...
策略四:关键信息重新注入
当对话比较长时,主动将关键信息重新注入:
提醒一下关键约束(在继续之前请确认你记得这些):
1. 我们用的是 TypeScript,所有代码需要类型注解
2. 不要引入新的 npm 包
3. 接口返回格式是 { success: boolean, data?: T, error?: string }
确认后,帮我实现下一个功能...
深度拆解:不同工具的上下文管理方法
Cursor 的上下文管理
文件引用(@功能):
在 Cursor 对话框里,可以用 @ 来引用:
@filename:引用特定文件@folder:引用整个文件夹@web:在网络上搜索@docs:引用技术文档
示例:
@src/models/user.ts 基于这个 User 模型,帮我实现一个用户列表的分页 API
Codebase 引用:
Cursor 可以理解整个代码库的结构(前提是项目不太大)。
在 Composer 模式下,可以直接说"基于现有的代码结构",Cursor 会自动扫描相关文件。
Claude Code 的上下文管理
Claude Code 的工作方式更像一个程序员:它会主动读取项目文件来理解上下文。
最佳实践:在项目根目录创建 CLAUDE.md 文件:
# CLAUDE.md - Claude Code 项目规范
当你在这个项目中工作时,请遵循以下规范...
[和 .cursorrules 类似的内容]
Claude Code 会在开始工作前自动读取这个文件。
案例解析:一个实际的上下文管理系统
项目:一个电商平台的后端 API
项目结构的上下文文件:
project/
├── .cursorrules # 全局 Cursor 规范
├── CLAUDE.md # Claude Code 规范
├── CONTEXT.md # 项目上下文(每次对话引用)
└── docs/
├── api-spec.md # API 接口规范
├── db-schema.md # 数据库 Schema 说明
└── decisions.md # 架构决策记录
实际的工作流:
- 开始新功能前,在 Cursor 里:
@CONTEXT.md @docs/api-spec.md 帮我实现... - AI 阅读这些文件后,给出符合规范的实现
- 如果 AI 偏离了规范,指出哪里不对,AI 会修正
- 重要决策记录到
CONTEXT.md和docs/decisions.md
实际效果:整个项目开发过程中,代码风格高度一致,几乎没有因为 AI "遗忘"规范而导致的不一致问题。
实操指南:为你的项目创建上下文系统
步骤一:创建 .cursorrules 文件
# [项目名] Cursor 规范
## 技术栈
[你的技术栈]
## 目录结构
[你的目录结构]
## 代码规范
[最重要的 5-10 条规范]
## 重要约束
[绝对不能做的事]
步骤二:创建 CONTEXT.md 文件
# 项目上下文(对话时引用)
## 当前状态
[项目进度]
## 已有基础设施
[重要文件和功能]
## 关键决策
[架构决策和理由]
步骤三:建立更新习惯
每次完成一个重要功能或做出重要决策,更新 CONTEXT.md。
本讲小结
mindmap
root((上下文管理策略))
问题根源
上下文窗口有限
注意力分布不均
长对话易遗忘
四种策略
.cursorrules全局注入
对话分段管理
CONTEXT.md文件
关键信息重新注入
工具特性
Cursor @文件引用
Claude Code CLAUDE.md
最佳实践
每个功能独立对话
开始时注入背景
重要决策记录文件
思考题
-
在你的项目中,有哪些信息是"跨对话必须记住"的?如何把这些信息组织成一个有效的
.cursorrules文件? -
.cursorrules里应该放什么内容?有没有不应该放的内容?(提示:考虑"全局有效"和"任务特定"的区别) -
对话分段管理有一个代价:每次开新对话都要重新建立上下文。如何最小化这个代价?
下一讲预告
我们学会了如何管理 AI 的"记忆"。
下一讲讲一个更实用的技巧:迭代式开发提示词——如何把一个大任务拆成一系列小提示词,通过多轮对话逐步完成?