Appearance
第 09 课 · 记忆、多轮与上下文
模型天生失忆(无状态)。「记住你」靠外部存储 + 检索补,本质是「对交互历史做 RAG」。 长程 Agent 崩溃,一大半是上下文没管好。
本课要解决的问题
答疑做多轮、Agent 跑长程时,三个问题接踵而来:
- 模型换个对话就 忘了 之前说的 —— 怎么让它「记住」学员?
- 多轮聊下去 越来越贵、还可能 忘掉开头 —— 怎么管?
- Agent 跑久了 撑爆窗口 —— 怎么办?
答案统一到一个更大的命题:上下文工程。
一、两种记忆
| 短期记忆 | 长期记忆 | |
|---|---|---|
| 载体 | 上下文窗口(临时) | 外部存储(持久) |
| 特点 | 换对话就没 | 要主动存 / 取 |
| 实现 | 把历史拼进这次请求 | 存文件 / 数据库 / 向量库,用时检索 |
长期记忆的三种类型
| 类型 | 记什么 | 网校例子 |
|---|---|---|
| 语义记忆 | 事实 / 偏好 | 「这个学员偏好图解、数学薄弱」 |
| 情景记忆 | 往事 | 「上周问过二次函数」 |
| 程序记忆 | 做法 / 技能 | 「给他讲题要先举例再抽象」 |
记忆 vs RAG: RAG 补「知识」,记忆补「连续性 / 个性化」—— 技术相似(都是检索拼回上下文),用途不同。
二、记忆怎么实现:存 → 取 → 用
写入:判断「什么值得记」 → 存外部(文本 / 向量库)
检索:新对话按相关性捞回相关记忆 → 塞进上下文(和 RAG 一样)
用: 记忆进了上下文,模型就「记得」了⭐ 三大难题
| 难题 | 说明 |
|---|---|
| 记什么 | 全记会爆炸,记太少漏关键 |
| 何时取 | 捞错了没用,捞多了污染上下文 |
| 怎么忘 / 更新 | 过时信息要删,否则和新信息矛盾 |
三、多轮对话怎么管
多轮的核心矛盾:历史越攒越长 → 越贵、越容易「迷失在中间」。
| 技术 | 做什么 |
|---|---|
| 压缩 / 摘要 | 长历史总结成几句再放(省窗口省钱) |
| 取舍 | 只留和当前问题相关的历史,无关的剔除 |
| 排序 | 重要信息放 开头 / 结尾(模型对两头更敏感,中间易忽略) |
四、上下文工程:管好「进入窗口的全部内容」
上下文工程 = 优化 进入有限窗口的全部内容(指令 + 历史 + RAG 资料 + 工具结果 + 记忆 + 当前问题),而不只是写好一句 prompt。
核心矛盾与技术
想挤进窗口的:System + 历史 + RAG 资料 + 工具结果 + 记忆 + 当前问
→ 装不下 / 太贵 / 相互干扰 → 你要当「守门人」决定优先给谁技术:取舍、压缩、检索(RAG)、记忆管理、排序。
四种常见「病」
| 病 | 说明 |
|---|---|
| 迷失在中间 | 重要信息埋在长上下文中间被忽略 |
| 上下文污染 | 塞太多无关 / 过时 / 矛盾内容,带偏模型 |
| 窗口溢出 | 超上限,老信息被挤掉 |
| 成本失控 | context 越长,每次调用越贵 |
核心教训:context 不是越多越好,而是少而精、放对的。塞垃圾进去,输出就是垃圾。
五、⭐ Agent 是上下文最大战场
ReAct 每轮工具结果都拼回 context
→ 跑 20 轮就撑爆窗口
→ 必须及时压缩 / 丢弃旧工具结果,关键结论存长期记忆长程 Agent 稳定性,一大半取决于上下文管理。 上一课的自主 Agent「上下文管理」必备项,落地就在这里。
本课结论
- 模型无状态,记忆靠「外部存储 + 检索」补,本质是对历史做 RAG。
- 长期记忆三类: 语义(偏好)、情景(往事)、程序(做法)。
- 记忆三难题: 记什么、何时取、怎么忘 / 更新。
- 多轮管理: 压缩摘要、取舍、把重点放两头。
- 上下文工程是最高统筹;Agent 是最大战场,不管理必崩。
课后自检(3 分钟)
- [ ] 我区分了短期(窗口)和长期(外部)记忆
- [ ] 我的长期记忆有「记什么 / 何时取 / 怎么更新」的策略
- [ ] 多轮对话我做了历史压缩 / 摘要,控制了长度和成本
- [ ] 重要信息我放在上下文开头 / 结尾
- [ ] 若跑 Agent,我会及时丢弃旧工具结果、把关键结论存记忆
下一课预告
第 10 课 · Eval 与降级:Agent 怎么测 —— 输出不确定的系统怎么评好坏,以及挂了怎么优雅降级。
延伸阅读
© 曹宇春