大型 AI 项目不要把聊天记录当项目记忆
大型项目中,真正的问题通常不是“新上下文不方便”,而是:
项目状态只存在聊天记录里,没有独立保存成可复用的项目记忆。
大型项目不应该依赖一个无限增长的聊天窗口。更实际的做法是:
项目上下文文件 + 阶段快照 + 总控对话与执行对话分离
这样即使换新对话,也不需要重新解释整个项目。
一、不要把聊天记录当项目记忆
一个对话问得特别长,会逐渐出现这些问题:
- 早期需求被后面的内容覆盖
- AI 忘记之前确定的字段和接口
- 已废弃的方案仍然留在上下文里
- 报错日志和临时代码占用大量上下文
- AI 很难判断哪一版信息才是最新的
- 修改一个模块时,被其他无关内容干扰
所以正确思路不是坚持使用一个聊天,而是:
聊天负责执行任务
项目文件负责保存事实
Git 负责保存代码历史
二、建立一个项目上下文包
在项目根目录创建:
project/
├── AGENTS.md
├── docs/
│ ├── PROJECT.md
│ ├── ARCHITECTURE.md
│ ├── CURRENT_STATE.md
│ ├── DECISIONS.md
│ ├── TASKS.md
│ ├── API.md
│ └── DATABASE.md
├── backend/
├── frontend/
└── README.md
其中最重要的是下面五个文件。
1. PROJECT.md:项目基本信息
只保存长期稳定的信息:
# 项目基本信息
## 项目名称
冰雪景区综合服务系统
## 项目目标
为游客和景区工作人员提供门票、民宿、公告、订单及运营统计服务。
## 用户角色
- 游客
- 运营人员
- 系统管理员
## 技术栈
后端:
- JDK 17
- Spring Boot 3.3.x
- MyBatis-Plus 3.5.x
- MySQL 8.0
- Redis 7
前端:
- Node.js 20
- Vue 3
- TypeScript
- Element Plus
## 核心模块
- 用户认证
- 景区管理
- 门票管理
- 订单管理
- 民宿管理
- 公告活动
- 数据统计
- 系统管理
这个文件不要频繁修改。
2. CURRENT_STATE.md:当前开发状态
这是每次开启新对话时最有用的文件。
# 当前项目状态
更新时间:2026-07-16
## 已完成
- 后端项目初始化
- 前端项目初始化
- MySQL 数据库连接
- 统一返回 Result
- 全局异常处理
- 用户登录
- JWT 身份认证
- 门票分类管理
## 正在开发
订单创建功能。
## 当前实现情况
已经存在:
- Order 实体类
- OrderMapper
- OrderController
- 订单表和订单明细表
- 前端订单列表页面
尚未实现:
- 创建订单
- 库存扣减
- 重复提交防护
- 订单事务
- 创建订单测试
## 当前问题
创建订单时需要解决:
1. 库存并发扣减。
2. 订单价格必须以后端为准。
3. 重复点击不能产生重复订单。
4. 订单和库存必须在同一事务中。
## 下一步
实现订单创建服务和对应测试。
它相当于项目的“存档点”。
3. DECISIONS.md:已经确定的决定
AI 最容易反复改变已经确定的设计,所以要单独记录。
# 已确定的项目决策
## DEC-001:采用单体模块化架构
状态:已确定
原因:
当前项目规模不需要微服务,部署和答辩以简单可靠为主。
禁止:
不得擅自拆分成 Spring Cloud 微服务。
---
## DEC-002:数据库变更使用 Flyway
状态:已确定
规则:
- 已执行的迁移文件不得修改。
- 每次数据库变更新建迁移文件。
---
## DEC-003:接口统一返回 Result<T>
状态:已确定
格式:
{
"code": 200,
"message": "success",
"data": {}
}
禁止:
不得为某个模块重新创建另一套返回结构。
这样新对话中的 AI 不会重新建议一套完全不同的架构。
4. TASKS.md:任务清单
# 项目任务
## 当前里程碑:订单模块
- [x] 创建订单表
- [x] 创建订单实体
- [x] 创建订单查询接口
- [ ] 实现订单创建 DTO
- [ ] 实现订单金额计算
- [ ] 实现库存原子扣减
- [ ] 实现订单事务
- [ ] 实现重复提交防护
- [ ] 编写单元测试
- [ ] 编写接口测试
## 暂不处理
- 微信支付
- 自动退款
- 消息队列
- 微服务拆分
“暂不处理”很重要,可以防止 AI 擅自扩大范围。
5. AGENTS.md:AI 工作规则
# AI 开发规则
## 开始任务前
必须先阅读:
1. docs/PROJECT.md
2. docs/CURRENT_STATE.md
3. docs/DECISIONS.md
4. docs/TASKS.md
5. 当前任务相关代码
## 修改规则
- 只修改当前任务涉及的文件。
- 不进行无关重构。
- 不擅自升级依赖。
- 不擅自修改数据库字段。
- 不删除已有正常功能。
- 不虚构项目中不存在的工具类。
- 优先复用已有公共组件。
- Controller 不直接操作 Mapper。
- Entity 不直接作为新增、修改接口参数。
## 完成任务后
必须:
1. 执行编译。
2. 执行测试。
3. 列出修改文件。
4. 说明测试结果。
5. 更新 CURRENT_STATE.md。
6. 更新 TASKS.md。
7. 如有新架构决定,更新 DECISIONS.md。
三、把上下文分成三层
这是最实用的上下文管理办法。
第一层:永久上下文
长期基本不变化:
PROJECT.md
ARCHITECTURE.md
AGENTS.md
编码规范
技术版本
角色和模块
第二层:动态上下文
随着开发不断更新:
CURRENT_STATE.md
DECISIONS.md
TASKS.md
API.md
DATABASE.md
第三层:当前任务上下文
只提供当前任务需要的信息:
具体需求
相关数据库表
相关 Controller
相关 Service
相关前端页面
完整报错
验收条件
允许修改范围
开启新对话时,不需要把整个旧对话复制过去,只提供这三层中真正相关的部分。
四、采用一个总控对话加多个执行对话
不要让一个聊天同时负责所有事情。
总控对话
长期保留,只负责:
- 项目规划
- 任务拆分
- 架构决定
- 检查进度
- 决定下一步做什么
- 维护上下文文件
不要在总控对话里粘贴大量报错和完整代码。
执行对话
每个模块或任务一个:
对话 1:登录权限
对话 2:门票管理
对话 3:订单创建
对话 4:库存并发
对话 5:前端页面
对话 6:测试和排错
任务完成后,把结果压缩到 CURRENT_STATE.md,然后关闭这个执行对话。
结构相当于:
总控对话
│
┌───────────┼───────────┐
│ │ │
登录对话 订单对话 前端对话
│ │ │
└──────更新项目文件──────┘
总控对话不需要记住所有实现细节,因为项目文件才是最终事实来源。
五、旧对话太长时,生成阶段快照
可以直接在当前长对话中发送下面这段:
请把当前对话压缩成一份可用于新对话继续开发的项目快照。
要求不要复述聊天过程,只保留当前仍然有效的信息。
请按照以下结构输出:
# 项目快照
## 1. 项目目标
## 2. 技术栈及准确版本
## 3. 当前目录结构
## 4. 数据库表及关键字段
## 5. 已完成的功能
## 6. 正在开发的功能
## 7. 已确定且不得随意改变的设计决策
## 8. 已废弃的方案
说明哪些方案已经被否定,避免新对话重新采用。
## 9. 当前存在的问题
## 10. 相关文件路径
## 11. 当前代码行为
## 12. 下一步任务
## 13. 下一步验收标准
## 14. 禁止修改范围
## 15. 新对话开始时需要优先阅读的内容
要求:
- 只记录最新有效状态。
- 删除重复信息。
- 旧方案与新方案冲突时,以最新确认的方案为准。
- 不要声称未经过验证的代码已经运行成功。
- 对尚未确认的信息标记为“待确认”。
生成后保存为:
docs/CURRENT_STATE.md
六、新对话只需要发送一个接力提示词
开启新对话时,不需要重新讲整个项目,可以这样写:
这是一个已经开发中的项目,不是从零开始。
请先阅读:
- AGENTS.md
- docs/PROJECT.md
- docs/CURRENT_STATE.md
- docs/DECISIONS.md
- docs/TASKS.md
- 与当前任务相关的代码
当前任务:
实现订单创建功能。
验收标准:
1. 门票库存不足时不得创建订单。
2. 价格必须由后端查询。
3. 创建订单与扣减库存处于同一事务。
4. 相同 requestId 不得生成重复订单。
5. 自动测试必须通过。
允许修改:
- backend/src/main/java/.../order/
- backend/src/test/java/.../order/
禁止修改:
- 登录认证模块
- 公共返回类
- 已有数据库迁移文件
- 前端代码
请先分析现有实现和影响范围,再执行修改。
不要重新设计整个项目。
这比把旧对话全部复制过去更准确。
七、代码文件本身也应该成为上下文
对于 AI 编程,最可靠的上下文不是聊天总结,而是仓库里的实际代码。
例如处理订单功能时,只需要让 AI 读取:
OrderController.java
OrderService.java
OrderServiceImpl.java
OrderMapper.java
Order.java
OrderCreateDTO.java
Ticket.java
TicketMapper.java
相关 SQL
相关测试
不需要把景区公告、民宿、用户管理的全部代码都放进去。
原则是:
提供与当前任务有关的完整上下文,而不是提供整个项目的所有上下文。
八、每完成一个任务就建立一个检查点
推荐固定执行:
完成任务
↓
运行测试
↓
Git 提交
↓
更新 CURRENT_STATE.md
↓
更新 TASKS.md
↓
必要时更新 DECISIONS.md
↓
开始下一个任务
Git 提交示例:
git add .
git commit -m "feat(order): implement ticket order creation"
然后在 CURRENT_STATE.md 记录:
## 最近完成
提交:
feat(order): implement ticket order creation
实现:
- 后端计算订单金额
- 原子扣减门票库存
- requestId 重复提交防护
- 订单创建事务
验证:
- mvn test 通过
- 订单正常创建测试通过
- 库存不足测试通过
- 重复请求测试通过
这样即使换对话,也可以根据代码和 Git 状态继续工作。
九、不要频繁传递完整总结,要传递变化
新对话已经读取项目文件后,后续任务只说明变化即可:
上一任务已经完成订单创建。
本次只增加“取消待支付订单”功能。
新增规则:
1. 只有待支付订单可以取消。
2. 只能取消本人的订单。
3. 取消后恢复库存。
4. 订单取消和库存恢复必须在同一事务。
5. 已支付订单不能通过该接口取消。
这叫增量上下文,比每次重复整个项目更省。
十、推荐的实际使用方式
结合常见的 Java、Spring Boot、RuoYi、Vue 项目,可以采用:
一个项目文件夹
+
一个总控对话
+
每个模块一个执行对话
+
每完成一个任务更新 CURRENT_STATE.md
+
每完成一个功能进行 Git 提交
具体节奏:
1. 在总控对话中拆出一个小任务。
2. 创建一个新执行对话。
3. 执行对话读取项目上下文文件。
4. 完成代码和测试。
5. 更新项目状态文件。
6. 提交 Git。
7. 把完成结果告诉总控对话。
8. 总控对话安排下一个任务。
十一、关键结论
不要追求:
一个对话从项目开始一直聊到项目结束
应该追求:
任何一个新对话
都能在读取 5 个项目文件后
准确恢复当前项目状态
判断上下文管理是否合格,可以看这个标准:
即使旧聊天全部消失,只保留代码仓库、项目文档和 Git 历史,新的 AI 仍然能够继续开发。
这才是大型 AI 项目最稳定的上下文管理方式。