Skip to content

3.5.4 上下文管理:让 AI 记住你说过的话

经过本节学习,你将掌握

  • 理解 AI 的「记忆」是如何工作的
  • 识别上下文「溢出」的信号
  • 四个实用的上下文管理技巧
  • 使用工具级配置让 AI「自动记住」项目规范

AI 的「记忆」是如何工作的

先来理解一个关键概念:AI 并没有真正的「记忆」。

每次你和 AI 对话时,AI 看到的是整个对话历史。就像你把一叠纸递给一个人,让他读完后回答问题。纸越多,他需要处理的信息就越多。

这叠「纸」有个名字:上下文窗口

用「工作台」来理解

想象 AI 的上下文窗口是一张工作台:

┌────────────────────────────────────────────┐
│                 AI 的工作台                 │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐      │
│  │ 第1轮 │ │ 第2轮 │ │ 第3轮 │ │ 第4轮 │ ... │
│  │ 对话  │ │ 对话  │ │ 对话  │ │ 对话  │      │
│  └──────┘ └──────┘ └──────┘ └──────┘      │
│                                            │
│  工作台大小有限(如 128K tokens)           │
└────────────────────────────────────────────┘

工作台的特点

  • 大小有限(不同模型不同,通常 8K-200K tokens)
  • 放不下时,最早的内容会被「挤出去」
  • 被挤出去的内容,AI 就「忘记」了

不同模型的上下文窗口大小

模型上下文窗口大约相当于
GPT-4o128K tokens约 300 页文档
Claude 3.5 Sonnet200K tokens约 500 页文档
DeepSeek64K tokens约 150 页文档
较老的模型4K-8K tokens约 10-20 页文档

看起来很大?但在长对话中,消耗速度比你想象的快。

上下文「溢出」的信号

当对话太长,早期内容被挤出上下文窗口时,就会出现「溢出」。

常见症状

症状表现原因
AI 突然「失忆」忘记之前约定的技术栈或命名规范早期对话被挤出
开始「自相矛盾」前后回答不一致只看到部分历史
重复问你问过的问题"请问你用的是什么框架?"(之前说过了)那部分对话已不在窗口内
代码风格突变之前用 TypeScript,突然开始写 JavaScript忘记了技术栈约定

一个真实场景

第 1 轮:你说"请用 TypeScript 和 Tailwind"
第 2 轮:AI 用 TypeScript 写代码
第 3 轮:继续用 TypeScript
...
第 15 轮:你让 AI 写一个新组件
第 16 轮:AI 突然给你 JavaScript 代码 ← 问题出现

这就是上下文溢出。第 1 轮的约定已经被挤出工作台了。

四个上下文管理技巧

技巧一:关键信息置顶

在每轮对话开始时,重申关键约定。

markdown
继续我们的待办清单项目。

提醒:
- 技术栈:React + TypeScript + Tailwind
- 命名规范:组件用 PascalCase,函数用 camelCase
- 所有函数需要类型声明

现在请帮我实现 [新功能]...

效果:关键信息始终在 AI 的「视野」中。

技巧二:定期总结

当对话进行到 10 轮以上时,主动让 AI 总结已完成的工作。

markdown
我们已经聊了很多轮。请总结一下目前的项目状态:
1. 已完成的功能
2. 使用的技术栈和约定
3. 待完成的功能

然后我们继续开发。

效果

  • 把散落在各处的信息「压缩」成一段总结
  • 总结在最新位置,不会被挤出
  • 你也可以确认 AI 的理解是否正确

技巧三:分块传递

不要一次性发送大量信息。分成多个小块,每块确认 AI 理解后再继续。

❌ 错误做法:
一次性发送 3000 字的需求文档

✅ 正确做法:
第一条消息:"我要做一个待办清单应用,先来定义核心数据结构..."
等 AI 回复确认后
第二条消息:"数据结构定好了,接下来是主要功能列表..."

效果

  • 每块信息都得到充分处理
  • 减少 AI 遗漏信息的概率
  • 便于及时发现理解偏差

技巧四:约定重申

在关键节点重申重要约定,尤其是:

  • 开始新功能时
  • 发现 AI 偏离约定时
  • 对话超过 10 轮时
markdown
开始新功能之前,确认一下我们的约定:
1. 使用 TypeScript,不使用 any 类型
2. 组件放在 src/components 目录
3. 状态管理使用 useState,复杂状态用 useReducer
4. 错误处理使用 try-catch

确认后,请开始实现 [功能]。

上下文管理实用模板

对话开始时的上下文设定

markdown
项目背景:
- 项目名称:[名称]
- 技术栈:[技术栈列表]
- 当前进度:[简要描述]

本次任务:
[具体任务描述]

请注意以下约定:
1. [约定1]
2. [约定2]
3. [约定3]

长对话中途的「检查点」

markdown
暂停一下,让我确认当前状态:

已完成:
1. [功能1]
2. [功能2]

使用的技术/约定:
- [约定1]
- [约定2]

接下来要做:
[下一个任务]

以上理解正确吗?确认后继续。

约定违反时的纠正

markdown
注意:刚才的代码使用了 JavaScript,但我们项目约定使用 TypeScript。

请重新生成,并确保:
1. 所有变量和函数都有类型声明
2. 不使用 any 类型
3. 导出类型定义供其他组件使用

工具级上下文管理

除了在对话中管理上下文,主流 AI IDE 还提供了持久化配置功能。这些配置会在每次对话开始时自动加载,让 AI「天生」就知道你的项目规范。

主流工具的配置文件对照表

工具配置文件位置功能定位
Cursor.cursor/rules/*.mdc项目规范、编码风格、技术栈偏好
Windsurf.windsurf/rules/*.md.windsurfrules项目级 AI 行为规则
Trae.trae/project_rules.mduser_rules.md用户规则 + 项目规则
Claude CodeCLAUDE.md + SKILL.md项目上下文 + 可复用技能
GitHub Copilot.github/copilot-instructions.md仓库级指令
OpenAI CodexAGENTS.md代理指令文件
Factory Droid.factory/droids/*.md自定义 Droid 配置
AiderCONVENTIONS.md编码规范文件
Cline.clinerules项目规则

配置文件应该写什么?

无论使用哪个工具,配置文件通常包含:

  1. 项目概述:这是什么项目,解决什么问题
  2. 技术栈:使用的语言、框架、库
  3. 编码规范:命名约定、代码风格、目录结构
  4. 禁止事项:不要使用的库、不要采用的模式
  5. 常用命令:构建、测试、部署的命令

通用项目配置模板

markdown
# 项目配置

## 项目概述
这是一个待办清单应用,帮助用户管理日常任务。

## 技术栈
- 前端:React 18 + TypeScript 5
- 样式:Tailwind CSS 3
- 状态管理:Zustand
- 测试:Vitest

## 目录结构
- src/components:React 组件
- src/hooks:自定义 Hooks
- src/utils:工具函数
- src/types:TypeScript 类型定义

## 编码规范
- 使用函数式组件,不用 class 组件
- 所有函数必须有 TypeScript 类型声明
- 组件文件使用 PascalCase 命名
- 工具函数使用 camelCase 命名
- 使用中文注释

## 禁止事项
- 不要使用 `any` 类型
- 不要使用 jQuery
- 不要在组件中直接写内联样式(使用 Tailwind)
- 不要使用 `var`,使用 `const``let`

## 常用命令
- 开发:npm run dev
- 构建:npm run build
- 测试:npm test

为什么配置文件很重要?

没有配置文件有配置文件
每次对话都要重复说技术栈AI 自动知道技术栈
AI 可能用错误的规范规范始终一致
团队成员各自配置不同团队共享同一份配置
约定容易被遗忘约定被版本控制

提示:具体工具的详细配置方法,请参考各工具的官方文档。基础版只需了解这些功能存在即可,进阶版会有更详细的工具配置教程。

本节要点

AI 无真正记忆:它看到的是对话历史,历史太长会「溢出」

溢出信号:AI 失忆、自相矛盾、代码风格突变

四个管理技巧:关键信息置顶、定期总结、分块传递、约定重申

工具级配置:用配置文件让 AI 自动加载项目规范

团队协作:配置文件可纳入版本控制,团队共享

下一节,我们来学习什么时候应该放弃旧对话,开始一个全新的对话。