第09讲:上下文管理:如何让AI记住你说过的话

2 阅读7分钟

「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.516K tokens约 12,000 字
GPT-4o128K tokens约 96,000 字
Claude 3.5200K tokens约 150,000 字
Claude 3.7200K 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      # 架构决策记录

实际的工作流

  1. 开始新功能前,在 Cursor 里:@CONTEXT.md @docs/api-spec.md 帮我实现...
  2. AI 阅读这些文件后,给出符合规范的实现
  3. 如果 AI 偏离了规范,指出哪里不对,AI 会修正
  4. 重要决策记录到 CONTEXT.mddocs/decisions.md

实际效果:整个项目开发过程中,代码风格高度一致,几乎没有因为 AI "遗忘"规范而导致的不一致问题。


实操指南:为你的项目创建上下文系统

步骤一:创建 .cursorrules 文件

# [项目名] Cursor 规范

## 技术栈
[你的技术栈]

## 目录结构
[你的目录结构]

## 代码规范
[最重要的 5-10 条规范]

## 重要约束
[绝对不能做的事]

步骤二:创建 CONTEXT.md 文件

# 项目上下文(对话时引用)

## 当前状态
[项目进度]

## 已有基础设施
[重要文件和功能]

## 关键决策
[架构决策和理由]

步骤三:建立更新习惯

每次完成一个重要功能或做出重要决策,更新 CONTEXT.md


本讲小结

mindmap
  root((上下文管理策略))
    问题根源
      上下文窗口有限
      注意力分布不均
      长对话易遗忘
    四种策略
      .cursorrules全局注入
      对话分段管理
      CONTEXT.md文件
      关键信息重新注入
    工具特性
      Cursor @文件引用
      Claude Code CLAUDE.md
    最佳实践
      每个功能独立对话
      开始时注入背景
      重要决策记录文件

思考题

  1. 在你的项目中,有哪些信息是"跨对话必须记住"的?如何把这些信息组织成一个有效的 .cursorrules 文件?

  2. .cursorrules 里应该放什么内容?有没有不应该放的内容?(提示:考虑"全局有效"和"任务特定"的区别)

  3. 对话分段管理有一个代价:每次开新对话都要重新建立上下文。如何最小化这个代价?


下一讲预告

我们学会了如何管理 AI 的"记忆"。

下一讲讲一个更实用的技巧:迭代式开发提示词——如何把一个大任务拆成一系列小提示词,通过多轮对话逐步完成?