2470 字
约 8 分钟
13
S21-J10 · 用户记忆与知识库:从三种层次到可执行记忆

适用读者:要做"跨会话记住用户"的产品、要判断记忆该存成什么形态、以及被 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. 自测

  1. 轨迹与长期记忆的本质差别?为什么一个 append-only、一个反复改写?
  2. 四种存储格式各自的代价是什么?生产为何常用混合?
  3. User as Code 解决文本记忆的哪三个短板?
  4. 稠密 + 稀疏混合检索分别补什么?
答案
  1. 轨迹是会话内原始流水(要审计,故只增不改);长期记忆是跨会话提炼的稳定结论(会过时,故要改写淘汰)。
  2. Simple Notes 便宜但丢关联;Enhanced 完整但冗余难更新;JSON Cards 可部分更新但刚性;Advanced 解决消歧但贵。混合是成本/可检索性的折中。
  3. 聚合统计、冲突检测、约束执行(都是确定性推理)。
  4. 稠密补语义相似,稀疏补精确匹配(编号、专名)。

11. 下一篇

S21-J11 · 工具:分类、ACI 与披露策略 —— 五类工具的调用方向与作用对象、ACI 的三条原则、专用工具/通用执行器/Skill 的形态谱系,以及"工具太多"时的层次化组织与按需加载。


本篇属于系列《S21 · Agent 工程与 MCP》。旧文来源:A-4569(《AI Agent 深入理解》第 3 章);扩展点 E-S21-032/033/034。实验 3-1/3-2 的数字为原文作者观察,非本机实测。

S21-J10 · 用户记忆与知识库:从三种层次到可执行记忆
https://www.clxhxhhr.top/posts/5494/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。