Skip to content

第 09 课 · 记忆、多轮与上下文

模型天生失忆(无状态)。「记住你」靠外部存储 + 检索补,本质是「对交互历史做 RAG」。 长程 Agent 崩溃,一大半是上下文没管好。


本课要解决的问题

答疑做多轮、Agent 跑长程时,三个问题接踵而来:

  • 模型换个对话就 忘了 之前说的 —— 怎么让它「记住」学员?
  • 多轮聊下去 越来越贵、还可能 忘掉开头 —— 怎么管?
  • Agent 跑久了 撑爆窗口 —— 怎么办?

答案统一到一个更大的命题:上下文工程


一、两种记忆

短期记忆长期记忆
载体上下文窗口(临时)外部存储(持久)
特点换对话就没要主动存 / 取
实现把历史拼进这次请求存文件 / 数据库 / 向量库,用时检索

长期记忆的三种类型

类型记什么网校例子
语义记忆事实 / 偏好「这个学员偏好图解、数学薄弱」
情景记忆往事「上周问过二次函数」
程序记忆做法 / 技能「给他讲题要先举例再抽象」

记忆 vs RAG: RAG 补「知识」,记忆补「连续性 / 个性化」—— 技术相似(都是检索拼回上下文),用途不同。


二、记忆怎么实现:存 → 取 → 用

写入:判断「什么值得记」 → 存外部(文本 / 向量库)
检索:新对话按相关性捞回相关记忆 → 塞进上下文(和 RAG 一样)
用:  记忆进了上下文,模型就「记得」了

⭐ 三大难题

难题说明
记什么全记会爆炸,记太少漏关键
何时取捞错了没用,捞多了污染上下文
怎么忘 / 更新过时信息要删,否则和新信息矛盾

三、多轮对话怎么管

多轮的核心矛盾:历史越攒越长 → 越贵、越容易「迷失在中间」

技术做什么
压缩 / 摘要长历史总结成几句再放(省窗口省钱)
取舍只留和当前问题相关的历史,无关的剔除
排序重要信息放 开头 / 结尾(模型对两头更敏感,中间易忽略)

四、上下文工程:管好「进入窗口的全部内容」

上下文工程 = 优化 进入有限窗口的全部内容(指令 + 历史 + RAG 资料 + 工具结果 + 记忆 + 当前问题),而不只是写好一句 prompt。

核心矛盾与技术

想挤进窗口的:System + 历史 + RAG 资料 + 工具结果 + 记忆 + 当前问
→ 装不下 / 太贵 / 相互干扰 → 你要当「守门人」决定优先给谁

技术:取舍、压缩、检索(RAG)、记忆管理、排序

四种常见「病」

说明
迷失在中间重要信息埋在长上下文中间被忽略
上下文污染塞太多无关 / 过时 / 矛盾内容,带偏模型
窗口溢出超上限,老信息被挤掉
成本失控context 越长,每次调用越贵

核心教训:context 不是越多越好,而是少而精、放对的。塞垃圾进去,输出就是垃圾。


五、⭐ Agent 是上下文最大战场

ReAct 每轮工具结果都拼回 context
   → 跑 20 轮就撑爆窗口
   → 必须及时压缩 / 丢弃旧工具结果,关键结论存长期记忆

长程 Agent 稳定性,一大半取决于上下文管理。 上一课的自主 Agent「上下文管理」必备项,落地就在这里。


本课结论

  1. 模型无状态,记忆靠「外部存储 + 检索」补,本质是对历史做 RAG。
  2. 长期记忆三类: 语义(偏好)、情景(往事)、程序(做法)。
  3. 记忆三难题: 记什么、何时取、怎么忘 / 更新。
  4. 多轮管理: 压缩摘要、取舍、把重点放两头。
  5. 上下文工程是最高统筹;Agent 是最大战场,不管理必崩。

课后自检(3 分钟)

  • [ ] 我区分了短期(窗口)和长期(外部)记忆
  • [ ] 我的长期记忆有「记什么 / 何时取 / 怎么更新」的策略
  • [ ] 多轮对话我做了历史压缩 / 摘要,控制了长度和成本
  • [ ] 重要信息我放在上下文开头 / 结尾
  • [ ] 若跑 Agent,我会及时丢弃旧工具结果、把关键结论存记忆

下一课预告

第 10 课 · Eval 与降级:Agent 怎么测 —— 输出不确定的系统怎么评好坏,以及挂了怎么优雅降级。


延伸阅读


© 曹宇春

© 曹宇春 · 个人学习整理,欢迎交流