跳到主要内容

用户记忆:让 Agent 记住你是谁

这一章讲三件事: 「记住用户」到底指什么(不是存记录,是建模型); 记下的东西用什么格式存(四种格式与它们各自的代价);以及记忆多了之后 怎么整理、冲突了怎么办、隐私怎么保。

1. 这一章讲什么

上一章的上下文管理管单次任务;这一章问的是:对话结束后,怎么让 Agent 仍然记得。书里把持久化记忆分成两个尺度:用户记忆针对单个用户—— 在与这位用户的交互中逐渐了解其偏好习惯,构建专属于他的知识模型;知识库 面向所有用户共享——行业法规、公司流程、专业文档。前者让 Agent 成为 「懂你的助手」,后者让它成为「领域专家」1。本章讲前者,后者(知识库:把「在资料库里找内容、拼进上下文」做成一套手艺,行话叫检索增强生成,缩写 RAG(它是下一章的主角)。

先立住一个观念:记忆并非简单记录用户说过的每一句话。就像与朋友相处, 你不会记住每次对话的原文,而是通过持续交互形成一个关于对方的生动模型—— 爱好、习惯、价值观——这个模型让你能理解甚至预测对方的需求2

2. 顶层全景

一次对话结束
│ 提取:从对话里抽出候选事实(「用户靠窗座」「常旅客号 12345678」)

对比:与已有记忆比较 ── 新增?更新?删除?还是不动?

存储:四种格式选一种(或混合)写入长期记忆


整理:重要性评分 → 聚类摘要 → 抽象泛化 → 冲突版本化


下次对话:按需取回相关记忆,注入上下文(工作记忆)

图说:这条流水线里,「提取-对比-决策」是 Mem0 的骨架,
「整理」是 3.5 节的内容,「取回」是下一章检索的主场。

3. 核心原理

3.1 主走查:订一次机票,留下四条记忆

场景与记忆条目来自原书;英文对话为原书示例。

用户说:「帮我订下周五去东京的航班,我偏好靠窗座位」;几轮后补充: 「用我的美联航常旅客号 12345678」。对话结束后,记忆系统从这几句话里 提取出3:

- 用户偏好靠窗座位 (偏好类)
- 用户的常旅客号: 12345678 (会员项目类)
- ……(共四条,每条是一个最小事实,不带对话原文)

注意被丢掉的是什么:问候语、检索过程、「Here are your options」这类过程性 文本——记忆要的是结论,不是录音。这几条记忆将跨会话生效:三个月后用户 再说「订机票」,Agent 不必再问座位偏好;而当他订国际航班时,系统还可以主动 调出数月前存的护照信息(3.2 节的第三层能力)。

顺带看清记忆与轨迹的分工:轨迹是一次运行的完整历史,按时间追加、只增不改; 用户长期记忆是跨会话提炼的稳定信息,会被反复改写、合并、淘汰。书里一句话 钉住两者的差别:前者是流水账,后者是档案4

3.2 评估先立尺子:三层次框架

「什么样的记忆系统算好?」书里先引学术基准 LoCoMo(长期对话记忆,数百轮对话的 公开测试集),再自己设计了更贴 Agent 场景的三层次评估框架5:

要求例子
一:基础回忆准确存取用户直接给的无歧义信息「我的会员号是 12345」,要用时精确返回
二:多会话检索从不同对象、不同时期的会话里集齐相关信息并推理用户有两辆车,说「为我的车预约保养」时应找齐两辆并问哪辆,而不是随便猜一辆
三:主动服务综合跨越很久之前的会话,提供预见性帮助订国际航班时主动调出护照信息,发现即将过期并预警;手机坏了,主动整合自带保修+信用卡附加险+运营商保障6

第三层是「助理」与「查询接口」的分水岭:它要求从看似无关的记忆里发现联系。 书里的实验按此框架构造评估集:每层 20 个用例,每个用例合计约 50 轮对话,且 被测 Agent 只能访问记忆、不能回看原始会话——逼着系统把宝押在记忆质量上7

3.3 四种存储格式:简单性与表达力之争

同一条信息,粒度和结构可以差很远。书里给了四种递进的格式,每一种都在 「简单」与「表达力」之间做了不同的交换8:

格式长什么样代价
Simple Notes每条是最小不可分事实(「用户邮箱:john@example.com」),增删改 O(1)关联完全丢失——工作信息被拆成三条互不相干的事实
Enhanced Notes带完整上下文的段落冗余、更新要重写多处;段落越长,后续检索越难精确——简介越长越难抓住重点
JSON Cards三层嵌套(类别→子类别→键值对),支持部分更新刚性结构假设信息可清晰分类
Advanced JSON Cards在事实之外记录来源背景(backstory)、主体(person)、与用户的关系(relationship)、时间最全面也最重

第四种的存在理由值得单独讲:它解决消歧。「张医生」可能是用户自己的牙医, 也可能是他父亲的心脏科医生——简单键值存无法区分;有了 backstory(为什么 存这条)和 relationship(为谁存的),系统才能答对「我父亲的医生」这类问题9

实践取舍,书里的标准很干脆:关键且少量的数据(偏好、关键人物关系)用 Advanced 保证可检索;大量非关键的对话事实用 Simple 降成本;多数生产系统是混合模式—— 同一 Agent 内,不同类信息走不同的路10

3.4 再往前:把记忆写成代码、写进参数

四种格式再怎么变,本质都是文本——存和用始终是两步:先捞回文本,再让 LLM 「读一遍再心算」。文本记忆擅长召回单条事实,却做不好聚合统计、冲突检测、 逻辑约束,因为这些全靠 LLM 心算。书里沿着「表示介质」这条线给了更激进的谱系11:

User as Code:把记忆写成带类型的 Python。两阶段运转——记忆阶段把对话事实 逐条追加进只增不删的事实日志(一条条只追加的流水记录);结构化阶段周期性地从日志重新生成整份带类型的 代码(日期用 date 类型、集合用带类型列表)。收益是确定的(同样输入永远同样输出):论文实测, 「去年出了几次国」这类聚合问题,检索式记忆正确率只有 6%–43%,代码形态一行 表达式、正确率接近 99%;药物过敏冲突检测、护照 180 天有效期约束,都从 「LLM 心算」变成「解释器执行」——Agent 于是能在你开口前提醒「护照快过期了」12

User as Engram:往前一步,把事实写进模型权重(给每个用户练一个专属 LoRA ——冻结大模型、只训一小片参数的适配技术)。但书里报告了一个耐人寻味的障碍: 这样训出的记忆模块,直接提问几乎能完美复述,一旦要在这些事实之上做间接推理 便告失灵——冻结的骨干从未学过「带着这些事实思考」13

参数化多模态记忆:存「无法言说的感知」——一张脸的模样、一段嗓音的疲惫。 写成「棕发男人」的那一刻,恰恰丢掉了区分两个棕发男人的那点细微信号;这条路线 把感知向量直接映射(一一对应地搬)进表示空间,不经文字14

3.5 认知科学:另一套正交的坐标

认知科学把人类记忆分成工作记忆、情景记忆、语义记忆、程序记忆,Agent 侧各有 对应:工作记忆对上下文窗口;情景记忆对具体事件(「订了下周五去东京的航班」); 语义记忆对抽象出的稳定特征(「用户是素食者」);程序记忆对行为流程(「先搜直飞 →确认座位→用常旅客号」)15

最容易犯的错是把三套分类搅在一起,书里特意列表澄清它们正交:记忆层次 (存哪里:轨迹/长期记忆/业务状态)、存储格式(怎么存:四种)、认知类型(存什么: 情景/语义/程序)可以自由组合——一条「偏好靠窗」的语义记忆,可以用 Simple 格式 存进长期记忆。选哪套看工程需求,不互相替代16

3.6 框架案例:Mem0 与 Memobase

两个开源框架代表两种理念。Mem0 的核心是「提取—对比—决策」两阶段流水线: 新对话结束后,结合最近内容与已有记忆摘要,提取候选记忆(「用户搬到了上海」); 更新阶段对每条候选,先向量检索(按意思的远近找)语义相近的旧记忆,再由 LLM 对比关系,做四种 决策之一——ADD(全新)、UPDATE(更新,如「住在北京」改「搬到上海」)、 DELETE(作废)、NOOP(不动)。要留意:这是 Mem0 论文口径;我们书架 pin 的 开源实现把「对比决策」从写入端拿掉了(见下一条脚注),两边并不一致。

工程上嵌入(把文本变成一串可比较的数字)与存储分离,另有图记忆变体 Mem0-g(把记忆组织成实体—关系图)17

Memobase 则聚焦「用户画像」:开发者配置一组槽位(按主题—子主题组织), 配合事件记忆,缓冲批处理摊薄成本18

书里诚实地说:两个框架各自只覆盖了设计空间的一角。它给出的参考架构(作者明说 是对设计空间的概括,不是某个具体项目的实现)新增的着眼点是情景记忆的 多维元数据检索——带时间戳、情感标记、任务标识的事件序列,支持「我们上次讨论 预算是什么时候」这类组合查询;并显式保留工作记忆一层,与长期记忆动态交换19

3.7 整理:遗忘、聚类(把相似记忆归堆)与冲突

记忆只进不出会爆炸,还拖累检索准确率。书里的整理机制分三层:重要性评分 (综合访问频率、时间衰减、情感强度、信息独特性,低于阈值标记可压缩可删除)、 聚类摘要(相似记忆分组,如多次天气对话压成「用户常问天气,特别关心降雨」)、 抽象泛化(从具体情景提炼一般规律,升级成语义或程序记忆)20

冲突用版本化处理——保留历史、标记最新;但分类对待:地址只留最新版, 工作经历保留全史——前者过时即错,后者从来不会「错」,只是变多了21

边界要划清:本节是存储层的整理;第 05 章的上下文压缩管单次会话内的窗口; 第 12 章把「在线追加、离线整理」推广到 Agent 的行为改进——三个层次各管一段22

3.8 隐私:脱敏这一关

记忆系统的隐私挑战:既要利用用户信息做个性化,又不让敏感数据暴露在 LLM 上下文 与日志里。书里的实验用本地小模型(0.6B,跑在 CPU/消费级设备)做日志脱敏—— 本地部署的理由很直接:日志本身就含敏感信息,发到云端脱敏违背初衷。它能识别 结构化(身份证号、银行卡号)、半结构化(地址)和自然语言表达的敏感内容 (「我的密码是 abc123」);相比纯正则,LLM 脱敏召回率(该找出的找出了多少)95% 以上、假阳性显著 更低;生产上常配混合策略——正则快滤常见的,LLM 深析长尾的23

4. 作者的判断与证据

书里给了证据的: 三层次评估框架配了可运行的评估集(每层 20 用例);四格式 对比与 User as Code 的 6%–43% 对 99% 是论文实测;Mem0 的四决策管线有论文出处。

是作者的判断: 参考架构(书里自己注明「非具体项目的实现」);「关键数据用 Advanced、大量数据用 Simple」的混合标准是工程建议而非测量结论。可证伪条件: 若某类「关键少量」数据在 Simple 格式下靠检索也能稳定召回,Advanced 的必要性 就只剩余下那些需要消歧的场景。

5. 边界与局限

  • 本章与下一章共享「向量检索」这把工具,但本章刻意不展开技术细节——只读了 本章会缺「向量是什么」的那一层,下一章补全;
  • User as Code 需要代码生成与执行的工程支撑,对结构化程度低的杂项事实并无 优势(书里原话);
  • 记忆的「遗忘」目前只是阈值与聚类,离人类「该忘的忘、该记的记」还差得远;
  • 三层次框架是作者自建的评估口径,与其他论文的口径不可直接对比。

6. 可带走的

  1. 记忆是关于用户的预测模型,不是聊天记录的归档;
  2. 轨迹是流水账(只增不改),长期记忆是档案(反复改写)——别混;
  3. 评估先于设计:基础回忆/多会话检索/主动服务,三层次递进,第三层才是「助理」;
  4. 存储格式的根本张力是简单性 vs 表达力;生产答案是混合模式;
  5. 「张医生」问题:关键记忆要带来源、主体、关系,否则消歧必错;
  6. 聚合统计类问题(「出了几次国」),文本记忆 6%–43% vs 代码形态约 99%—— 能变成代码的记忆就别让 LLM 心算;
  7. ADD/UPDATE/DELETE/NOOP 四决策:记忆更新的本质是先比对再动手;
  8. 地址只留最新,工作经历留全史——冲突处理要按「过时即错与否」分类;
  9. 脱敏用本地小模型,别把含敏感信息的日志发上云;
  10. 三套分类(层次/格式/认知类型)正交,自由组合,不要搅在一起。

7. 原文地图

主题原书章原文位置
两个尺度3 用户记忆和知识库text/05-ch03.txt:5(搜「对话结束后」) · text/05-ch03.txt:7(搜「两个尺度」)
记忆=预测模型3 用户记忆和知识库text/05-ch03.txt:17(搜「生动模型」)
订机票与四条记忆3 用户记忆和知识库text/05-ch03.txt:23(搜「window seats」) · text/05-ch03.txt:33(搜「prefers window seats」) · text/05-ch03.txt:35(搜「MileagePlus」)
轨迹 vs 长期记忆3 用户记忆和知识库text/05-ch03.txt:81(搜「只增不改」) · text/05-ch03.txt:83(搜「流水账」)
LoCoMo 与八项能力3 用户记忆和知识库text/05-ch03.txt:41(搜「LoCoMo」) · text/05-ch03.txt:55(搜「花生过敏」)
三层次框架3 用户记忆和知识库text/05-ch03.txt:63(搜「基础回忆」) · text/05-ch03.txt:65(搜「多会话检索」) · text/05-ch03.txt:67(搜「主动服务」)
实验 3-1 设计3 用户记忆和知识库text/05-ch03.txt:71(搜「20 个测试用例」)
四种存储格式3 用户记忆和知识库text/05-ch03.txt:97(搜「Simple Notes」) · text/05-ch03.txt:99(搜「Enhanced Notes」) · text/05-ch03.txt:101(搜「简介越长越难」) · text/05-ch03.txt:103(搜「JSON Cards」) · text/05-ch03.txt:105(搜「张医生」) · text/05-ch03.txt:107(搜「消歧」)
根本张力与混合模式3 用户记忆和知识库text/05-ch03.txt:109(搜「根本张力」) · text/05-ch03.txt:111(搜「混合模式」)
User as Code3 用户记忆和知识库text/05-ch03.txt:121(搜「User as Code」) · text/05-ch03.txt:123(搜「两阶段」) · text/05-ch03.txt:141(搜「6%–43%」) · text/05-ch03.txt:165(搜「开口之前」)
User as Engram3 用户记忆和知识库text/05-ch03.txt:169(搜「User as Engram」)
参数化多模态记忆3 用户记忆和知识库text/05-ch03.txt:171(搜「无法言说」)
认知科学四类3 用户记忆和知识库text/05-ch03.txt:179(搜「工作记忆」) · text/05-ch03.txt:181(搜「情景记忆」) · text/05-ch03.txt:183(搜「语义记忆」) · text/05-ch03.txt:185(搜「程序记忆」)
三套体系正交3 用户记忆和知识库text/05-ch03.txt:187(搜「三套分类体系」) · text/05-ch03.txt:207(搜「正交」)
Mem0 与 Memobase3 用户记忆和知识库text/05-ch03.txt:213(搜「提取—对比—决策」) · text/05-ch03.txt:217(搜「ADD」) · text/05-ch03.txt:221(搜「用户画像」)
参考架构与工作记忆3 用户记忆和知识库text/05-ch03.txt:223(搜「参考架构」) · text/05-ch03.txt:231(搜「动态子集」) · text/05-ch03.txt:233(搜「大而全」)
记忆压缩三层3 用户记忆和知识库text/05-ch03.txt:239(搜「重要性评分」) · text/05-ch03.txt:241(搜「聚类」) · text/05-ch03.txt:243(搜「抽象和泛化」)
冲突版本化3 用户记忆和知识库text/05-ch03.txt:245(搜「版本化」)
章节边界3 用户记忆和知识库text/05-ch03.txt:247(搜「记忆存储层的整理」)
脱敏3 用户记忆和知识库text/05-ch03.txt:255(搜「本地」) · text/05-ch03.txt:257(搜「95%」)

Footnotes

  1. 出处:「3 用户记忆和知识库」第 5-7 段(text/05-ch03.txt:5,搜「对话结束后」;text/05-ch03.txt:7,搜「两个尺度」)。

  2. 出处:「3 用户记忆和知识库」第 17 段(text/05-ch03.txt:17,搜「生动模型」)。

  3. 出处:「3 用户记忆和知识库」第 23-35 段(text/05-ch03.txt:23,搜「window seats」;text/05-ch03.txt:33,搜「prefers window seats」;text/05-ch03.txt:35,搜「MileagePlus」)。

  4. 出处:「3 用户记忆和知识库」第 81-83 段(text/05-ch03.txt:81,搜「只增不改」;text/05-ch03.txt:83,搜「流水账」)。

  5. 出处:「3 用户记忆和知识库」第 41 段(text/05-ch03.txt:41,搜「LoCoMo」)与第 61 段(text/05-ch03.txt:61,搜「三层次评估框架」)。

  6. 出处:「3 用户记忆和知识库」第 63-67 段(text/05-ch03.txt:63,搜「基础回忆」;text/05-ch03.txt:65,搜「多会话检索」;text/05-ch03.txt:67,搜「主动服务」)。

  7. 出处:「3 用户记忆和知识库」第 71 段(text/05-ch03.txt:71,搜「20 个测试用例」)。

  8. 出处:「3 用户记忆和知识库」第 97-105 段(text/05-ch03.txt:97,搜「Simple Notes」;text/05-ch03.txt:99,搜「Enhanced Notes」;text/05-ch03.txt:101,搜「简介越长越难」;text/05-ch03.txt:103,搜「JSON Cards」)。

  9. 出处:「3 用户记忆和知识库」第 105-107 段(text/05-ch03.txt:105,搜「张医生」;text/05-ch03.txt:107,搜「消歧」)。

  10. 出处:「3 用户记忆和知识库」第 109-111 段(text/05-ch03.txt:109,搜「根本张力」;text/05-ch03.txt:111,搜「混合模式」)。

  11. 出处:「3 用户记忆和知识库」第 121 段(text/05-ch03.txt:121,搜「User as Code」)。

  12. 出处:「3 用户记忆和知识库」第 123-165 段(text/05-ch03.txt:123,搜「两阶段」;text/05-ch03.txt:141,搜「6%–43%」;text/05-ch03.txt:165,搜「开口之前」)。

  13. 出处:「3 用户记忆和知识库」第 169 段(text/05-ch03.txt:169,搜「User as Engram」)。

  14. 出处:「3 用户记忆和知识库」第 171 段(text/05-ch03.txt:171,搜「无法言说」)。

  15. 出处:「3 用户记忆和知识库」第 179-185 段(text/05-ch03.txt:179,搜「工作记忆」;text/05-ch03.txt:181,搜「情景记忆」;text/05-ch03.txt:183,搜「语义记忆」;text/05-ch03.txt:185,搜「程序记忆」)。

  16. 出处:「3 用户记忆和知识库」第 187 与 207 段(text/05-ch03.txt:187,搜「三套分类体系」;text/05-ch03.txt:207,搜「正交」)。

  17. 出处:「3 用户记忆和知识库」第 213-219 段(text/05-ch03.txt:213,搜「提取—对比—决策」;text/05-ch03.txt:217,搜「ADD」)。补充(不在书里,依据我们的 frontier 书架):书里的「提取—对比—决策」是 Mem0 论文口径;书架 pin 的开源实现(sourceCommit 001c235)与之不同——ADD-only 单次抽取、md5 哈希去重,「判断要不要改旧记忆」从写入端拿掉、只增不改。依据: shelf=ai-frontier-reference/mem0#01-add-pipeline.md 事实=该拆解明写 ADD-only 抽取加 md5 去重,对比决策已从写入端移除。读时以书里的论文口径理解概念,以书架版本理解当前开源实现。

  18. 出处:「3 用户记忆和知识库」第 221 段(text/05-ch03.txt:221,搜「用户画像」)。

  19. 出处:「3 用户记忆和知识库」第 223-231 段(text/05-ch03.txt:223,搜「参考架构」;text/05-ch03.txt:227,搜「多维元数据检索」;text/05-ch03.txt:231,搜「动态子集」)。

  20. 出处:「3 用户记忆和知识库」第 239-243 段(text/05-ch03.txt:239,搜「重要性评分」;text/05-ch03.txt:241,搜「聚类」;text/05-ch03.txt:243,搜「抽象和泛化」)。

  21. 出处:「3 用户记忆和知识库」第 245 段(text/05-ch03.txt:245,搜「版本化」)。

  22. 出处:「3 用户记忆和知识库」第 247 段(text/05-ch03.txt:247,搜「记忆存储层的整理」)。

  23. 出处:「3 用户记忆和知识库」第 255-257 段(text/05-ch03.txt:255,搜「本地」;text/05-ch03.txt:257,搜「95%」)。