适用读者:要做"跨会话记住用户"的产品、要判断记忆该存成什么形态、以及被 RAG 效果不稳定困扰的人。
前置:S21-J09(上下文)、B06(记忆与状态);S20-J04(RAG 基础)。
覆盖旧文:A-4569(用户记忆和知识库,第 3 章,42,345 字符)→ 24 小节 / 约 4.2 万字符。
扩展点:E-S21-032(记忆提取三条规则)、E-S21-033(记忆三层次与四种存储格式)、E-S21-034(User as Code:把记忆变成可执行状态)。
上一篇:S21-J09 · 上下文工程:静态前缀、轨迹与压缩
下一篇:S21-J11 · 工具:分类、ACI 与披露策略。
1. 一句话结论
记忆不是"多存点对话",而是"用额外一次 LLM 调用提炼出对未来有用的稳定事实"。 判断记忆系统好不好,先定评估层次(基础回忆 / 多会话检索 / 主动服务),再决定"放哪里、怎么存、存什么"。
出处:《AI Agent 深入理解》第 3 章(
A-4569)。
轨迹(append-only,会话内) ≠ 用户长期记忆(跨会话,反复改写/合并/淘汰)
2. 记忆提取的三条规则(E-S21-032)
User: 订下周五去东京的机票,靠窗,我吃素要特殊餐。
User: 用我的 United MileagePlus 号 12345678。
→ 会话结束后额外调用一次 LLM 提炼:
- 偏好靠窗座位(preference)
- 素食,需特殊餐(dietary restriction)
- 会员号 12345678(loyalty)
- 近期有东京行程(recent activity)
| 规则 | 含义 | 反面 |
|---|---|---|
| 选择性 | 丢掉"搜索返回 3 个选项"这类短期细节 | 把工具输出全存进去 → 噪声淹没 |
| 抽象化 | 把本次"靠窗座位"归纳为长期偏好 | 只存事件,不存倾向 |
| 结构化 | 用可检索字段保存 | 存整段自然语言,检索靠猜 |
判据:记忆的写入成本要单独核算——它是每轮结束后的一次额外模型调用,不是免费的。
3. 先定标准:三层次评估(E-S21-033)
| 层 | 能力 | 例子 | 失败表现 |
|---|---|---|---|
| 一·基础回忆 | 存/取无歧义的结构化事实 | "我的会员号是 12345" | 记不住、取错 |
| 二·多会话检索 | 跨会话、跨对象找全相关信息 | "给我的车约保养"→ 有两辆车要反问 | 随便猜一辆 |
| 三·主动服务 | 无需指令预见问题 | 订国际航班时提醒护照 6 个月内过期 | 等用户问才说 |
公开基准:LoCoMo(平均约 300 轮、最多 35 个会话),任务含单跳/多跳/时间推理/开放域/对抗性问答、事件摘要、多模态对话生成。
评估做法(实验 3-1):每层 20 例;Agent 只能看记忆、不能回看原始会话;用 LLM-as-a-judge 打分。
4. 放哪里:三个层次
| 层 | 内容 | 读写特征 | 用途 |
|---|---|---|---|
| 轨迹 | 一次运行的全部事件(用户消息/模型回复/工具结果) | append-only | 即时上下文、审计 |
| 用户长期记忆 | 跨会话提炼的稳定信息 | 反复改写、合并、淘汰 | 个性化、连续性 |
| 业务状态 | 开发者定义的任务阶段(澄清中/处理中/待付款/完成) | 状态机 | 事件驱动架构 |
要点:轨迹"只增不改"指原始记录;发给模型的运行时上下文可以压缩重组(J09)。流水账 vs 档案——别用同一种存储承担两种职责。
5. 怎么存:四种格式的递进
| 格式 | 形态 | 优势 | 代价 |
|---|---|---|---|
| Simple Notes | 最小不可再分事实 | O(1)、生成极便宜 | 关联丢失,"在 TechCorp 任高级工程师负责推荐系统"被拆成三条 |
| Enhanced Notes | 带完整上下文的段落 | 语义完整、可读 | 冗余、更新要重写多段 |
| JSON Cards | 三层嵌套(work.position.title) |
可部分更新、可预测 | 刚性:一条信息跨多类时被迫归一类 |
| Advanced JSON Cards | 事实 + backstory + person + relationship + 时间戳 | 解决消歧("张医生的两个身份") | 生成与维护成本高 |
混合策略(生产常见):关键且少量(偏好、关键人物关系)用 Advanced JSON Cards;大量且非关键(对话事实)用 Simple Notes。
实验结果(原文实验 3-2,属复算/作者观察而非你的实测):Simple Notes 在第一层多数通过、二三层频繁失分;Advanced JSON Cards 在消歧与跨会话关联上最好,但每次会话后的维护调用明显更贵更慢。
6. 进阶形态:把记忆写成可执行代码(E-S21-034)
文本记忆擅长召回单条事实,聚合、冲突检测、约束执行只能让 LLM"心算"。User as Code 把用户状态变成带类型的对象 + 普通函数:
state = {
"passport": PassportInfo(number="AB1234567", country="US", expiry_date=date(2025, 2, 18)),
"trips": [Trip(destination="Tokyo", departure_date=date(2025, 1, 15), is_international=True)],
}
# 聚合:确定性计算,不靠"心算"
count(t for t in state["trips"] if t.is_international and year(t.departure_date) == 2025) # => 1
# 冲突发现:药物 × 过敏
def check_drug_allergy(profile):
for med in profile.current_medications:
for allergy in profile.allergies:
if med.drug_class == allergy.drug_class:
emit_conflict(med, allergy)
# 约束执行:护照有效期在写入后自动检查
def check():
for t in state["trips"]:
if t.is_international and days(state["passport"].expiry_date - t.departure_date) < 180:
alert("passport expires too soon", t)
机制:借用"预写日志 + 检查点"——会话结束先把事实追加到只增日志,再定期从完整日志重建带类型状态。既留原始证据,又得到可查询、可执行的派生状态。
判据:只要"推理规则是确定的",就该写成代码而不是提示词。 提示词做聚合,结果不稳定且不可测。
7. 知识库侧:RAG 的六个真问题
| 问题 | 要点 |
|---|---|
| 分块 Chunking | 语义边界优先于固定长度;小块召回、大块阅读(父文档召回) |
| 稠密嵌入 | 语义相似,适合"换个说法也能找到" |
| 稀疏嵌入 | 关键词精确匹配,适合编号、专名 |
| 混合检索 | 两路召回 + 融合排序,通常优于单路 |
| 结构化索引 | 从"信息检索"升级到"知识建模"(实体/关系) |
| 文件系统范式 | 用目录组织知识,Agent 按路径导航(比向量堆更可解释) |
知识更新:要能回答"这条知识什么时候、因为什么被改过"——否则冲突无法仲裁。
智能体化 RAG:把检索工具化,由 Agent 自己决定检索几次、检索什么(与 J11 的工具设计同源)。
上下文感知检索:检索时带上当前任务与已确认约束,而不是只拿用户最后一句话当 query。
8. 隐私与脱敏
| 项 | 做法 |
|---|---|
| 日志脱敏 | 会员号/证件号/手机号入库前打码,保留可关联的哈希 |
| 最小化 | 只存"对未来有用"的字段(第 2 节三规则) |
| 隔离 | 记忆按用户 ID 分片,禁止跨租户检索 |
| 可删除 | 用户要求删除时,日志与派生状态都要清 |
判据:记忆是"长期存储的敏感数据",按数据处理合规来做,不是按缓存做。
9. 反例与排障
| 现象 | 根因 | 处理 |
|---|---|---|
| 记住了所有对话、回答却更差 | 无选择性 | 走提取三步 |
| 用户改了偏好仍按旧偏好推荐 | 无冲突解决 | 加"记忆更新"用例(第二层) |
| 同名实体张冠李戴 | 缺 person/relationship | Advanced JSON Cards |
| RAG 召回对了但答案错 | 分块把答案切断 | 父文档召回 / 重叠加大 |
| 编号类查询查不到 | 只用稠密向量 | 加稀疏/关键词路 |
10. 自测
- 轨迹与长期记忆的本质差别?为什么一个 append-only、一个反复改写?
- 四种存储格式各自的代价是什么?生产为何常用混合?
- User as Code 解决文本记忆的哪三个短板?
- 稠密 + 稀疏混合检索分别补什么?
答案
- 轨迹是会话内原始流水(要审计,故只增不改);长期记忆是跨会话提炼的稳定结论(会过时,故要改写淘汰)。
- Simple Notes 便宜但丢关联;Enhanced 完整但冗余难更新;JSON Cards 可部分更新但刚性;Advanced 解决消歧但贵。混合是成本/可检索性的折中。
- 聚合统计、冲突检测、约束执行(都是确定性推理)。
- 稠密补语义相似,稀疏补精确匹配(编号、专名)。
11. 下一篇
S21-J11 · 工具:分类、ACI 与披露策略 —— 五类工具的调用方向与作用对象、ACI 的三条原则、专用工具/通用执行器/Skill 的形态谱系,以及"工具太多"时的层次化组织与按需加载。
本篇属于系列《S21 · Agent 工程与 MCP》。旧文来源:A-4569(《AI Agent 深入理解》第 3 章);扩展点 E-S21-032/033/034。实验 3-1/3-2 的数字为原文作者观察,非本机实测。