跳到主要内容

A3.2 长期记忆:跨会话的「我记得你」

金鱼的困境​

每开一个新会话,智能体都是和你初次见面:上下文清零,昨天教它的今天全忘——按 A0 的机制,这是必然的,循环结束、messages 释放,什么都不剩。

可你大概见过相反的体验:助手记得你上周说过「讨厌开会」,记得你的项目用的是哪个框架、代码风格是两格缩进。它靠的不是更大的窗口——窗口再大,会话结束也是清零。它靠的是长期记忆:把该记的写到上下文之外的持久存储里,下次用时再装回来。

一句话看清结构:上一节的上下文是工作记忆(快、贵、易失),这一节的长期记忆是硬盘(慢、便宜、持久)。计算机体系结构的老智慧,在智能体身上原样重演。

记在哪:三种载体​

① 文件笔记——最朴素,也最主流。 把要记的写成 markdown 文件(「用户偏好.md」「项目约定.md」),下次启动时读回上下文。别嫌它土:2025-2026 年主流编码智能体的记忆机制就是这么朴素——项目根目录放一个约定文件,每次会话开头自动加载。优点是人能直接看、直接改,记忆出错时你一眼就能发现。

② 结构化存储。 数据库或键值对,适合条目化的事实:「用户时区 = UTC+8」「部署密钥放在某某位置」。程序好查好改,但表达不了复杂的经验。

③ 向量库。 把每条记忆变成向量存起来,用的时候按语义相似度检索——这正是上篇词向量的直接应用:「意思相近,向量相近」,所以搜「他不爱社交活动」能命中「用户讨厌开会」。适合记忆条数多到没法全部装回上下文的场景。

记什么、何时记、何时读​

长期记忆的难点从来不是「存储」,而是读写时机:

  • 何时写:任务结束时让模型总结「这次学到了什么」;用户明说「记住这个」;执行中发现重要事实(踩过的坑、拿到的约定——上一节实验④的 📝 就是这个动作)。
  • 何时读:会话开始时加载核心记忆(谁、什么项目、什么偏好);任务进行中按需检索相关条目。

还有一个反直觉的设计要求:遗忘也是功能。 记忆会过时(「项目用 Python 3.8」早就升级了),错误的记忆比没有记忆更糟——它会让模型自信地做错事。所以像样的记忆系统必须能更新、能删除、带时间戳,而不是只进不出的仓库。

记忆也会坏:三种失败模式​

有了「存储 + 检索」,就有了和 K6 的 RAG 失败模式同构的坑——长期记忆不是存了就万事大吉,它会以三种方式反过来坑你:

  • 记错:把一个错误的事实写进了记忆(用户随口一句被当成了长期偏好),之后每次会话都自信地复用它,一错错很久——比不记还糟。
  • 检索不到:记忆是对的、也存了,但用时没被召回(措辞对不上、向量检索漏了)——等于没记。这正是记忆用向量库时,中篇检索那套问题会原样搬过来。
  • 记忆过时:存的事实曾经对,但世界变了(框架升级了、政策改了),记忆却没跟着更新,于是模型拿着旧地图走新路。

对应的解药也和 RAG 一脉相承:写入要谨慎(别把临时的当永久的)、检索要评测(该召回的有没有召回)、条目要带时间戳并定期复核。记忆系统的可靠性,一半在「怎么记」,另一半在「怎么防它记坏」。

「记忆」这个词的拟人陷阱

说了半天「记住」「忘记」,必须戳破一层窗户纸:模型的参数一个都没变。 所谓长期记忆,全部是「外部存储 + 检索 + 塞回上下文」的工程组合——模型本身依然是那个出厂后不再学习的预测机器(上篇第 5 章训练完就定型了)。真想「记进参数」的路线叫持续学习/在线微调,它面临灾难性遗忘等一整套难题(上篇 5.2 深入层提过一句),2026 年仍不是产品主流。

小结​

本节要点
  • 上下文是工作记忆(易失),长期记忆是外置硬盘(持久):文件、数据库、向量库三种载体各有分工。
  • 难点在读写时机:任务结束总结、重要事实随手记;会话开始加载、任务中按需检索。
  • 遗忘是功能不是缺陷:记忆要能更新、删除、带时间戳——错误记忆比没记忆更糟。
  • 参数一个没变:「记忆」= 外部存储 + 检索 + 塞回上下文,不是模型学会了什么。
📝 动手自测0/3
1. 智能体「记得」你上周的偏好,本质上是因为?
2. 为什么说「遗忘也是功能」?
3. 什么场景最适合用向量库(而不是文件笔记)做记忆载体?

延伸阅读​