Skip to content
Unstructured Play
Go back

智能体记忆系统解剖:当下 Agent '记忆库'与认知科学的差距

回路 / The Loop — 提出有价值的问题,比直接获取答案更重要。

这个专题收集和整理我与 Gemini、ChatGPT、Claude 等 AI 的对话记录。每一篇对应一次完整的提问与回答过程。通过留存这些层层追问,还原日常思考的真实轨迹。


概要

这是一场围绕 智能体记忆系统(Agent Memory) 的深度对话。起点是 brgsk 的一篇博文 agent memory: an anatomy。作者用 Endel Tulving(恩德尔·图尔温,加拿大爱沙尼亚裔认知心理学家,1972 年首次提出”情节记忆 vs 语义记忆”二分法,被誉为”现代记忆研究之父”)1972/1985 年提出的认知科学记忆分类作为标尺,去丈量当下主流的智能体记忆库(LangMem、Mem0、Graphiti),结论相当扎心——很多库只是把认知科学的术语原封不动搬到了 API,工程实现却根本不分流

围绕这篇文章,我从”提炼核心观点”一路追问到”那我们应该怎么做”,再到”LangMem 的程序记忆实现到底在哪里”、“create_prompt_optimizer 怎么避免越改越差”,最后回到原文中四类核心引用各自在论证什么。

核心结论

  1. 绝大多数所谓的”智能体记忆库”,本质上只是”自传体语义记忆系统” —— 帮用户代管 TA 的个人事实库,比”记忆”这个词所承诺的要狭窄得多。
  2. 三类工程误区必须停止:把所有记忆类型挤进同一个向量库只靠 metadata 标签区分;同步在每条消息后做提取;盲目模仿生物式遗忘真的去删数据。
  3. 正确的方向是分流架构 + 离线巩固:程序记忆走 System Prompt 演进(如 LangMem 的 create_prompt_optimizer),自传体语义记忆走异步的 sleep-time / Dreams 管道,前瞻性记忆走条件监听器。

Q: 一个智能体”记忆库”在工程上由哪些组件构成?

按 brgsk 的拆解,任何一个智能体记忆库都可以解剖成三个核心组件,看懂它们就能读懂任何记忆库的文档:

提取器(Extractor) — 一次 LLM 调用,从对话流水里把”值得记的事”压成一条短小、抽象的 statement(陈述)。比如把”用户周二喝咖啡时说他偏好 TypeScript”压成”用户偏好 TypeScript”。

提取器最关键的设计抉择是时机

更重要的是,提取本身就是一种 从”具体场景事件”到”去情境化事实”的压缩。“周二喝咖啡时说的”会丢失时间锚点;“昨天/下周”这种相对时间词、强调语气、哪些被详细解释了哪些被一带而过——都会在压缩中蒸发。

存储器(Store) — 数据库。可以是向量索引(按语义相似度查)、关系表(按列过滤)、知识图谱(按类型化的边连接)。每条 statement 都附带 metadata:时间戳、置信度、回指原始对话的指针。

存储器最难回答的问题不是”放在哪儿”,而是 “新陈述与旧陈述矛盾时怎么办”。用户 4 月之前住在巴黎,现在搬到阿姆斯特丹——库里现在两条都在,且都呈现为”当前事实”。三种选择:

brgsk 的判断很直接:一个无法回答”上个月我们当时认为是什么”的存储器,根本不是记忆系统,只是一张带时间戳的快照表。

检索器(Retriever) — 查询时把当前问题转成一次搜索,返回最相关的 statements。基线是向量相似度,第二层叠关键词搜索,第三层加一个 reranker(重排序模型)。结构上就是 RAG,只不过语料不是文档库而是用户累积的陈述库。一些进阶库还会加:


Q: 在认知科学的分类里,这些工程实现到底覆盖了哪些?又落空了哪些?

主流认知科学把人类记忆分四种(图尔温 1972/1985 + Baddeley & Hitch(艾伦·巴德利与格雷厄姆·希契,英国心理学家,1974 年合作提出”工作记忆”多组件模型)1974):情节、语义、程序、工作。再加一个不在经典分类里、但被广泛研究的 前瞻性记忆。映射到工程上:

记忆类型认知科学智能体工程实现
工作记忆巴德利与希契 (1974):短期处理系统上下文窗口(Context Window)—— 是另一台机器,不在本话题讨论范围
情节记忆图尔温 (1972):特定时间地点的事件一张带时间戳的陈述表 —— 但提取阶段就被压成了去情境化的语义事实
语义记忆图尔温 (1972):脱离情境的世界知识这是当前几乎所有库的实际核心
程序记忆图尔温 (1985):非陈述性技能、肌肉记忆检验”贴标签 vs. 真实现”的最干净试金石(见下文)
前瞻性记忆”在未来某条件下记得做某事”生产级库基本完全空白

brgsk 的论断之一:这四类记忆里有三类在生产库中基本是缺席的

剩下的就只有语义记忆,而且具体到其中一个子集:自传体记忆(autobiographical memory)——智能体替用户代管 TA 的个人生活事实(住哪、在做什么项目、谁对 TA 重要、做过什么决定)。

大多数智能体记忆库本质上只是”多了几个步骤的自传体记忆系统”。 把问题缩窄并精确命名,工程挑战会变得清晰得多。


Q: 那作者眼里的”工程误区”和”正确方向”分别是什么?

brgsk 把生物记忆的几个特征逐一拆开,分别归类到三种态度:应当引入、结构性缺失、不应模仿

应当引入:记忆巩固(Consolidation)

人类睡眠时会”重放”白天的经历,慢速压缩并修剪冗余记忆。工程类比就是 离线巩固管道:定期重新审视累积的记忆库,去重、解决矛盾、跨会话发现模式。

两个 mid-2026 的生产级例子:

注意:两者都是调度执行或用户触发,不是真正的”自动 idle-time”;而 LangMem、Mem0、Graphiti、Cognee 等库里被叫作 “consolidation” 的东西,大多只是写入时(write-time)的去重 / 合并机制,而不是离线对累积的存储库做反思。

那些在每条消息后同步跑提取的库,做的只是”在实时延迟预算下退化版的 consolidation”。在结构上确实没有离线、对累积陈述做反思的版本来得清爽——虽然”输出是否更好”还是开放的实证问题。

结构性缺失:情绪显著性(Emotional Salience)

人类大脑的杏仁核会给带有强烈情感(恐惧、惊讶、尴尬)的经历打更深的编码标签。纯文本智能体没有身体、没有自主神经系统、没有感受,输入只是文本 token,根本没有这种信号

斯坦福小镇论文(Park et al., 2023, arXiv:2304.03442,一作 Joon Sung Park——朴俊成,斯坦福大学博士,2023 年”生成式智能体(虚拟小镇)“开创性论文的第一作者)让 LLM 给每条记忆打 1–10 的”深刻度(poignancy)“评分,再用 recency × importance × relevance 做加权检索——这是用一个本身没有情感的模型去”估计”情感,是一个代理指标,不是真正的情感。多模态、有环境根植的模型未来或许有类似物,纯文本智能体做不到

不应模仿:盲目模仿生物式遗忘

很多库用 recency 衰减、importance 评分、定时清理任务来”模仿”人类遗忘——前提是”既然人会忘,那 agent 也应该忘”。

brgsk 的反驳很直接:人类遗忘是约束(constraint),不是功能(feature)。大脑因为生理资源有限不得不忘,不是因为遗忘本身有价值。智能体没这个约束——存储几乎免费,保留一切反而能让系统支持审计、可调试,能回答”上个月我们当时认为是什么”。

注:这里说”几乎免费”是字面成本极低——但索引开销、检索延迟、token 注入成本都会随存储增长,且 PII / 数据保留 / 用户删除请求(DSR)等合规约束并不会因为磁盘便宜就消失。

那么”存储增长导致检索退化”这个生物式遗忘真正想解决的问题怎么办?答案是把它重新表述为两个独立问题

像 Dreams 这样的离线巩固系统则从另一端攻击同一个问题:会话之间做非破坏性的重组,产出更干净的存储库,但不丢失原始输入。


Q: 既然”概念分类与工程实现严重脱节”是核心病灶,那应该怎么做?

打破”概念上高大上、工程上靠打标签”的伪记忆僵局,关键是 按记忆类型的本质构建完全分流(decoupled)的工程支撑,不要指望一个统一的 VectorStore 包治百病。

程序记忆:从”事实检索”转向”指令演进”

程序记忆的本质是 “知道怎么做”——一种行为倾向(behavioral disposition),不应该是向量库里一条冷冰冰的文本。

brgsk 在文章中点名:LangMem 是少有的把这件事做对的库——它通过对历史执行轨迹(trajectories)打分和反思,动态演进 System Prompt 或指令集,把”技能”内化在运行策略里,而不是在调用时去向量库捞一句”用户喜欢用 TypeScript”。

自传体语义记忆:放弃同步幻想,引入异步巩固

既然情节记忆不可避免地会被压成语义事实,那就大方承认在做的是”自传体语义记忆系统”,把它的核心工程问题——状态同步与矛盾裁决——做到极致:

前瞻性记忆:从”定时任务”转向”条件监听”

这是当前生产库的绝对蓝海。摆脱”在 T 时刻做 Y”的简单 cron 思路,去解决 “当条件 X 下次出现时做 Y”——在 agent loop 里加一层轻量级的”预设检查 / 意图监听器”,每次上下文更新时做低成本匹配,命中后把预存意图推入当前上下文窗口。

一句话工程落地方案:程序记忆去优化 Prompt,自传体语义记忆做离线巩固 RAG,前瞻记忆做条件监听。


Q: LangMem 的 GitHub 上只能看到两个 tool(create_manage_memory_toolcreate_search_memory_tool),所谓的”程序记忆”在哪里?

那两个 tool 是让 agent 在对话热路径(hot path)上实时读写自传体语义事实用的。“程序记忆”不在 tool 层,而在 create_prompt_optimizer 这个独立的离线/后台优化器 API 里。

它的调用范式不是去读写向量库,而是 输入”历史轨迹 + 旧 Prompt”,输出”新 Prompt”

from langmem import create_prompt_optimizer

# 1. 收集 Agent 的历史执行轨迹 + 评分反馈
trajectories = [
    (
        [{"role": "user", "content": "帮我写一段代码"}, ...],
        {"score": 0.2, "feedback": "未遵循 JSON 格式"}
    ),
    # ...
]

# 2. 创建 Prompt 优化器
optimizer = create_prompt_optimizer(
    "anthropic:claude-3-5-sonnet-latest",
    kind="metaprompt"  # or "gradient" / "prompt_memory"
)

# 3. 演进 System Prompt
updated_prompt = optimizer.invoke({
    "trajectories": trajectories,
    "prompt": "你是一个严谨的资深产品经理。"
})

它的底层逻辑是**“基于真实轨迹反思 + 文本梯度下降”的闭环**:

一句话区分:那两个 tool 解决的是 “What to know”(用户的事实),create_prompt_optimizer 解决的是 “How to do”(智能体的行为)。LangMem 在工程上真正把”事实存储”与”行为演进”分流成了两个机制,这就是 brgsk 评价它颇高的原因。


Q: create_prompt_optimizer 提供哪三种 kind?怎么避免越改越差?

LangMem 官方文档kind 参数有三个选项,复杂度与 LLM 调用次数依次递增:

三种算法

prompt_memory(单步推断) — 最轻量的方式(仅 1 次 LLM 调用)。把历史轨迹丢给一个内置元提示,让大模型单步推断出原 Prompt 需要追加或微调什么指令。适合对成本和延迟极敏感的轻量后台任务。

metaprompt(元提示词反思) — Meta-LLM 像”全局教练”一样通读历史日志,反思 System Prompt 在设计上的边界漏洞和歧义,然后用一套更健壮的提示词框架做整体重构。

gradient(文本梯度下降) — 最强大也最重,通常 2 到 10 次 LLM 调用。模仿深度学习的”梯度下降”:

  1. 计算文本梯度 — 第一步调用 LLM 分析历史轨迹与反馈,找出实际输出与预期目标之间的差距,生成一份详细说明哪些规则失效、需要如何修正的”文本梯度”;
  2. 应用梯度更新 — 第二步调用另一个 LLM,把这些建议精准融合进原 Prompt。

四层防退化护栏

自动化提示词优化最怕”按下葫芦起了瓢”——修了 A 的缺陷却毁掉了原本正常的 B。LangMem(及其背后的 Promptim 思路)有几层护栏:

  1. 基于得分轨迹(Scored Trajectories)的严密锚定 — 不允许脱离实际的盲目改写。轨迹必须是真实日志,且强烈依赖附加的质量评分或反馈({"score": 0.2, "feedback": "..."});
  2. “先诊断、再下药”的责任归因gradient 模式下,第一步专门寻找”导致失败的规则根源”并产出批判性诊断,把”诊断错误(计算梯度)“与”应用修改(更新权重)“彻底分离;
  3. 多步自省(max_reflection_steps — 优化器在组合出新 Prompt 后,在内部跑一轮模拟审判:“新规则是否与原有核心约束冲突?是否过于激进?“通过自省后才输出;
  4. 验证集测试与最高分保留 — 优化器在小批量历史劣质轨迹上学习并提出新 Prompt 变体,再在保持不动的 held-out dev set 上跑全局评分,只有新 Prompt 在验证集上整体超过历史最高版本时,才采纳并覆盖原 Prompt,否则触发回滚。

这套机制本质上就是把软件工程里的回归测试 + 机器学习里的训练/验证集分离搬到 Prompt 层,确保整体性能只进不退。


Q: 给 create_prompt_optimizertrajectories,仅传对话原文够吗?

技术上够,工程上强烈不建议。LangMem 的语法允许你只丢”纯对话原文”,但要让 Prompt 优化器越改越聪明、不产生负面退化,附加信息(评分 + 反馈)才是它计算文本梯度的真正灵魂

一条高质量的轨迹是个元组(tuple),通常包含两部分:

trajectories = [
    # Bad Case:明确负向反馈
    (
        [{"role": "user", "content": "帮我写快速排序"},
         {"role": "assistant", "content": "这里是冒泡排序:..."}],
        {"score": 0.1, "feedback": "严重错误!用户要快速排序,给了冒泡排序"}
    ),
    # Good Case:正向确认
    (
        [{"role": "user", "content": "分析这份财务报表"},
         {"role": "assistant", "content": "..."}],
        {"score": 1.0, "feedback": "结构清晰,优先列出核心指标"}
    ),
]

不带附加信息会让优化器陷入三种困境:


Q: 离线记忆巩固在 Anthropic Dreams 与 Letta sleep-time compute 里,具体长什么样?

两者都把”在闲置时离线重组累积的记忆”做成了产品级机制,但形态略有不同。

Anthropic Dreams:异步管道 + 全新输出存储

Dreams 是 Managed Agents 中 Build persistent memory 模块下的 Research Preview 特性,需要 dreaming-2026-04-21 beta header。它是一个异步任务,输入两类资源:

Dreams 的输入存储库永远不会被修改,它产出的是另一个独立的输出 memory store,你可以审查后选择启用或丢弃。

dream = client.beta.dreams.create(
    inputs=[
        {"type": "memory_store", "memory_store_id": store_id},
        {"type": "sessions", "session_ids": [session_a, session_b]},
    ],
    model="claude-opus-4-8",
    instructions="Focus on coding-style preferences; ignore one-off debugging notes.",
)

dream 的状态机:pendingrunningcompleted/failed/canceled。运行时通常需要数分钟到数十分钟,可通过 polling 跟踪 statususage。当一个 dream 在 running 时,它的 session_id 字段指向正在执行管道的底层 session,可以流式订阅这个 session 的事件,实时观察 dream 在读写什么

限制:单次 dream 最多 100 个 sessions,instructions 不超过 4096 字符。计费按所选模型的标准 API token 费率,与输入 sessions 的数量和长度大致线性相关。

Letta sleep-time compute:双 agent 架构 + 异步内存编辑

Letta 把这套思路落到了 开源 Letta 0.7.0+ 的一个新 agent 类型上。内部实际上跑了两个 agent

这种分工解决了 MemGPT 1.0 里”内存管理 + 对话 + 工具调用全挤在一个 agent”导致的慢和不可靠问题。两个 agent 可独立配置不同模型——latency 敏感的 primary 用 gpt-4o-mini,不那么敏感的 sleep-time 可以用 gpt-4.1 或 Sonnet 3.7 这类更强模型来”想得更深”。

底层论文 arXiv:2504.13171 在 AIME、GSM 等数学基准上证明了:sleep-time compute 是一种 Pareto improvement——把计算负载从高延迟的用户交互期挪到本来就空闲的时段,性能不降反升。

共同点:两者都用异步、调度执行的方式做记忆巩固,把高质量但耗时的记忆重组从用户的等待时间里剥离出去;都通过让一个独立的”管理 agent / 管道”专职处理 store,来避免主对话 agent 在每条消息后都被 fact extraction 拖慢。


Q: brgsk 的原文里,哪些引用是承重支柱?它们各自在论证什么?

整篇文章用四类引用搭起了论证骨架——理论奠基石、靶子、路标、互补视角

一、理论奠基石:图尔温 + 巴德利与希契

作用:这是 brgsk 整篇文章的批判起点。他用这套半个世纪的认知科学分类当作”尺子”,去丈量当今 LangMem、Mem0、Graphiti 等库——结论是”这些库直接搬走了术语,工程实现却根本没跟上”。

二、批判靶子:斯坦福小镇论文(朴俊成等,2023)

这是引爆”AI 虚拟小镇”的开创性论文,它为大模型 agent 设计了一套 memory stream 架构:每条记忆通过 LLM 打 1–10 分评估”深刻度(poignancy)“,结合时间衰减(recency)和语义相关度(relevance)做加权检索。

作用:brgsk 用它当反面教材或检验靶子——

  1. 批判假情感:让 LLM 强行打分模仿杏仁核,本质是”没有情感的模型在估计情感”,结构性缺失;
  2. 批判盲目模仿遗忘:用时间权重让记忆自然衰减,是把”人类大脑带宽不够”这个约束当成了功能导入。

三、正路标杆:Letta sleep-time compute + Anthropic Dreams

作用:mid-2026 的两个生产级”正面代表”,证明在工程上把生物学的”睡眠巩固”机制做对的姿势是——用离线算力(offline compute)在会话间隙对累积记忆做非破坏性重组,而不是在每条消息后同步跑提取。

四、互补视角:Sebastian Lund(塞巴斯蒂安·伦德,Cria 提示词组合库的作者)的 Ultimate Guide to LLM Memory

伦德完全绕开认知科学的生物类比,从运行时 Prompt 窗口被什么填充的工程视角,把 LLM 记忆切成四层:Working / Episodic / Semantic / Document——本质上是在描述”提示词组合(Prompt Composition)“的策略,而非记忆的本体论。

作用:brgsk 在文末特意点出伦德的视角”轴线不同但完全兼容”——他自己的轴线是**“在工程化之前的记忆类型本体”,伦德的轴线是”运行时怎么把记忆塞进 Prompt 窗口”**。两个不同维度的划分恰好可以”完美拼合(compose)“,给开发者一张更全面的全景图。


Q: 这四个延伸资源的链接和一句话总结?

资源链接一句话总结
brgsk 原文agent memory: an anatomy用图尔温的认知科学分类当尺子,揭露当下智能体记忆库”概念高大上、工程靠打标签”的伪记忆现状,并指明分流架构 + 离线巩固的正路
LangMemgithub.com/langchain-ai/langmemLangChain 推出的智能体记忆库,工程上把”实时事实读写”和”独立的后台 Prompt 优化器”分流成两个机制,是少数把程序记忆做对的库
Letta sleep-time computeletta.com/blog/sleep-time-computearXiv:2504.13171用闲置时段的后台 sub-agent 异步重写并合并归档记忆,论文在 AIME/GSM 等基准上证明这是一种 Pareto improvement
Anthropic Dreamsplatform.claude.com/docs/en/managed-agents/dreamsManaged Agents 的离线管道 beta 特性,吃进 memory store + 过往 sessions,输出一个全新的、合并矛盾、保留最新值、并提炼跨会话洞察的存储库(输入永不被改)
斯坦福小镇论文arXiv:2304.03442Generative Agents 的开创性论文,提出 LLM 给记忆打 1–10 深刻度分 + recency × importance × relevance 加权检索的 memory stream 架构
Sebastian Lund’s Ultimate Guide to LLM Memoryfastpaca.com/blog/ultimate-guide-to-llm-memory从”运行时 Prompt 窗口怎么被填充”的工程视角,把 LLM 记忆切成 Working / Episodic / Semantic / Document 四层,是对认知科学分类的互补视角

参考资料


Share this post on:

Previous Post
Managed Agents 与同类开源产品对比:LangGraph、E2B、SWE-agent、OpenHands 各守一层
Next Post
MCP 企业多用户认证:从 Harness 凭证隔离到 OAuth 2.1 动态授权全链路