跳到主要内容

记忆落地:episodic、semantic 与 procedural

这一章讲三件事: 给第 08 章那个「一转身就忘」的 agent 接上情景与语义记忆的最小实现; 程序性记忆怎么让 agent 从「记得住」升级为「会改进」;以及让整套东西能换域复用的架构分离。 原书在此处有一句点题:没有 RAG,这一章的一切都不可能——记忆的存与取,靠的就是前面 十章的向量检索(即第 04、05 章的那一整套)1

1. 基线:一个没有长期记忆的 agent

起点是第 08 章 agent 的精简版,但做了两处为记忆铺底的改动2:

  • AgentState 加了三个占位字段:working_memory(短期上下文)、episodic_recall(取回的旧经历)、semantic_facts(取回的事实)——图还没接记忆,状态容器先留好位置;
  • 向量库落盘: Chroma(collection_name="agent_memory", persist_directory="./memory_store")—— 没有 persist_directory 的库是易失的,kernel 一关全没了;加了它,记忆跨会话存活3

此时的工作记忆就是「最近 5 条消息」的滑动窗口。跑通验证只问了一个问题: 「法国的首都是哪?」——答对,证明管道没断;但它记不住你上一轮说过什么4

2. 情景记忆:给对话装上「录像机」

对话结束后,一个存储节点把整段对话作为一条文档写进向量库,metadata 带上 类型(type: "episodic")、会话 ID、时间戳、消息数。不足两条消息的对话不存——噪声不入库5

每次回答前,拿当前问题做相似搜索,过滤条件 type == "episodic"(Chroma 的 metadata 支持 MongoDB 风格的操作符,$eq 就是「等于」),取最相关的 2 条旧对话6

取回的旧对话带着时间戳格式化成一段「相关过往对话」上下文,连同当前对话一起进提示词。 主走查——原书给的验收场景:一位客户上周问过物流问题,今天回来问「我的订单怎么了?」—— agent 检索出上周的整段对话,客户不用把故事重讲一遍。原书说这直接改善客户满意度、 缩短解决时间7

写回与取出首尾相接,原书称之为持续学习循环:每一次对话都会充实记忆库,下一次相似场景就有据可依8

3. 语义记忆:从「发生了什么」到「知道了什么」

情景记忆存的是「发生过的事」;语义记忆存的是从经历中蒸馏(即提炼浓缩)出的事实—— 「这位用户偏好简洁要点」「这位用户的风险承受度是中等」。 实现上是同一个向量库的另一种条目:type: "semantic",提取时由 LLM 从对话中抽出值得长期保留的 事实,检索时同样按类型过滤9

两套记忆的分工可以用一个对比钉住:情景记忆让你能问「上周我们聊到哪了」; 语义记忆让你不用再问「我叫什么」

4. 程序性记忆:从「记得住」到「会改进」

前两种记忆都是「存信息」;程序性记忆存的是「怎么做事」,而且它改变的是 agent 的行为本身。 原书给它的定位很重:「把一个称职的 agent 变成自主的 agent」的分界线—— (1) 自己学习,(2) 自愈(检测并纠正自己的失败模式),(3) 越用越好, (4) 沉淀客户智能(重复意图、摩擦点、解决模式——原本要人工标注数月才能发现的东西)10

LangMem(LangChain 的程序性记忆 SDK——SDK 即封装好给你调用的开发工具包)之上,原书自建了一套分层学习系统,两个核心设计:

4.1 分层作用域:不是所有模式都该全局生效

学到的模式按四个层级归档11:

层级存什么例子(书中的领域观察)
user这个用户的偏好「这位用户要先看风险再看过往业绩」
community一类用户的共性老年患者上午就诊效果更好;企业客户偏爱技术深潜、个人用户偏爱分步指南
task某类任务的专门打法退款类咨询先安抚再核对流程
global全局有效图示比纯文字更利于理解

学到的每条策略都是可读的指令文本,可以查看、编辑、删除;每条带自己的成功指标, 可以独立评估、更新或回滚12。安全机制齐备:A/B 测试(即新旧两版同时跑、比哪版好)、灰度发布、即时回滚—— 改进先验证再全量,防止回归波及用户13

4.2 域分离:学习机制是域无关的

架构上最重要的决定:核心学习系统(procedural_memory.py)完全不知道自己在服务什么领域; 领域逻辑(提示词、社区定义、成功指标)全部住在独立目录(domain_investment/domain_educator/…),通过一个 DomainAgent 接口与核心对接14

换领域的代价是实现一个接口。原书举的例子读起来像一本领域观察笔记15: 医疗系统自己发现「老年患者上午就诊效果更好」「特定的解释方式能提高糖尿病患者的服药依从性」; 客服系统发现「某些情况下早早提出退款能阻止升级」;教育系统发现「视觉型学习者受益于图解」。 同一个学习内核,三套领域,一行核心代码不改

原书对这个架构的总结是一个准确的概念:程序性记忆是一个元学习(meta-learning)层—— 传统 RAG 检索文档,记忆增强 RAG 检索个性化上下文,程序性记忆优化的是 agent 的运作机制本身16

5. 边界与局限

  • 这套实现是教学骨架:episode 存储没有做压缩与去重(第 12 章的 bloat 问题在这里原样存在);
  • 「成功/失败」的判定依赖域指标的定义——指标定错了,agent 会认真地学错东西(下一章的主题);
  • LangMem 本身只提供原语,原书自建的分层框架是教学代码,生产化要补的工程原书没有假装覆盖17

6. 可带走的

  1. persist_directory 一个参数,决定记忆是「会话级的」还是「真的」。
  2. 情景记忆三件套:整段存、类型过滤取、带时间戳进提示词。
  3. 工作记忆的滑动窗口(最近 5 条)只是保底,长期记忆才是个性化的来源。
  4. 程序性记忆存策略不存事实;策略是可读、可改、可回滚的指令。
  5. 分层作用域防「过度泛化」:用户级模式别学成全局规则。
  6. 域分离接口让领域专家不动学习内核就能造专业 agent。
  7. 程序性记忆=元学习层:优化的对象是 agent 自己的运作方式。

7. 原文地图

主题原书章原文位置
没有 RAG 一切不可能Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:14(搜「Without RAG」)
记忆占位字段与基座RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:186(搜「working_memory」)
persist_directory 落盘RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:227(搜「persist_directory」)
五条消息窗口RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:230(搜「five-message」)
法国首都验证RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:247(搜「capital of France」)
情景记忆存储函数RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:311(搜「store_episodic_memory」)
MongoDB 风格过滤RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:628(搜「MongoDB-style」)
物流客户场景RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:523(搜「shipping issue」)
持续学习循环RAG-Based Agentic Memory in Codetext/129-fm-rag-based-agentic-memory-in-code.txt:458(搜「continuous learning loop」)
程序性记忆的定位Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:14(搜「turns a capable agent into an autonomous」)
四大收益(自学/自愈/学习环/客户智能)Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:17(搜「self-heals」)
分层作用域Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:128(搜「hierarchical namespace」)
策略可读可回滚Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:173(搜「readable instructions」) · text/130-fm-procedural-memory-for-rag-with-langmem.txt:173(搜「rolled back」)
A/B 测试与灰度Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:131(搜「A/B testing」)
DomainAgent 接口与域目录Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:153(搜「DomainAgent」)
领域观察笔记(医疗/客服/教育)Procedural Memory for RAG with LangMemtext/130-fm-procedural-memory-for-rag-with-langmem.txt:180(搜「elderly patients」)
元学习层Architectural implications and production readinesstext/136-fm-architectural-implications-and-production-readin.txt:4(搜「meta-learning layer」)
LangMem 只是原语的声明Advanced RAG with Complete Memory Integrationtext/137-fm-advanced-rag-with-complete-memory-integration.txt:23(搜「real, open source library」)
三记忆协作分工Advanced RAG with Complete Memory Integrationtext/137-fm-advanced-rag-with-complete-memory-integration.txt:43(搜「episodic memory providing conversation context」)

Footnotes

  1. 出处:「Procedural Memory for RAG with LangMem」第 14 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:14,搜「Without RAG」)。

  2. 出处:「RAG-Based Agentic Memory in Code」第 182-188 段(text/129-fm-rag-based-agentic-memory-in-code.txt:186,搜「working_memory」)。

  3. 出处:「RAG-Based Agentic Memory in Code」第 227 段(text/129-fm-rag-based-agentic-memory-in-code.txt:227,搜「persist_directory」)。

  4. 出处:「RAG-Based Agentic Memory in Code」第 230 段(text/129-fm-rag-based-agentic-memory-in-code.txt:230,搜「five-message」)与第 247 段(text/129-fm-rag-based-agentic-memory-in-code.txt:247,搜「capital of France」)。

  5. 出处:「RAG-Based Agentic Memory in Code」第 311-328 段(text/129-fm-rag-based-agentic-memory-in-code.txt:311,搜「store_episodic_memory」)。

  6. 出处:「RAG-Based Agentic Memory in Code」第 628 段(text/129-fm-rag-based-agentic-memory-in-code.txt:628,搜「MongoDB-style」)。

  7. 出处:「RAG-Based Agentic Memory in Code」第 523 段(text/129-fm-rag-based-agentic-memory-in-code.txt:523,搜「shipping issue」)。

  8. 出处:「RAG-Based Agentic Memory in Code」第 458 段(text/129-fm-rag-based-agentic-memory-in-code.txt:458,搜「continuous learning loop」)。

  9. 出处:「RAG-Based Agentic Memory in Code」第 27 段(text/129-fm-rag-based-agentic-memory-in-code.txt:27,搜「semantic memory」)与第 628 段(text/129-fm-rag-based-agentic-memory-in-code.txt:628,搜「MongoDB-style」)。语义记忆条目的类型过滤见同章代码实验室 17.3。

  10. 出处:「Procedural Memory for RAG with LangMem」第 14 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:14,搜「turns a capable agent into an autonomous」)与第 17 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:17,搜「self-heals」)。

  11. 出处:「Procedural Memory for RAG with LangMem」第 156-160 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:163,搜「Task-level」)与第 128 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:128,搜「hierarchical namespace」)。

  12. 出处:「Procedural Memory for RAG with LangMem」第 173 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:173,搜「readable instructions」)与第 173 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:173,搜「rolled back」)。

  13. 出处:「Procedural Memory for RAG with LangMem」第 131 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:131,搜「A/B testing」)。

  14. 出处:「Procedural Memory for RAG with LangMem」第 153 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:153,搜「DomainAgent」)。

  15. 出处:「Procedural Memory for RAG with LangMem」第 180 段(text/130-fm-procedural-memory-for-rag-with-langmem.txt:180,搜「elderly patients」)。

  16. 出处:「Architectural implications and production readiness」第 4 段(text/136-fm-architectural-implications-and-production-readin.txt:4,搜「meta-learning layer」)。

  17. 出处:「Advanced RAG with Complete Memory Integration」第 23 段(text/137-fm-advanced-rag-with-complete-memory-integration.txt:23,搜「real, open source library」)。原文明确:coala_agent.py 等是本书自建的教学框架,LangMem 只提供 create_memory_manager / create_prompt_optimizer 原语。