LangChain 的 Memory 组件有什么作用?常见的 Memory 类型有哪些?
- 标签:LangChain、Memory 记忆机制
🏛 业务架构师
Memory 组件负责在多轮对话间保存和传递状态,解决 LLM"每次调用无记忆"的问题——没有它,每轮对话都是初次见面。
常见类型按机制分:
- ConversationBufferMemory:原样保存全部对话历史。简单直接;token 成本随轮次线性膨胀——短对话可用;
- ConversationBufferWindowMemory:滑动窗口,只留最近 K 轮。成本恒定;早期信息丢失——最常用的平衡选择;
- ConversationTokenBufferMemory:按 token 预算截断——精确控成本;
- ConversationSummaryMemory:用 LLM 把历史滚动摘要成纪要。保长期脉络;多一次摘要调用的成本与时延——长会话推荐;
- 向量记忆(VectorStoreRetrieverMemory):历史向量化存储,按当前话题检索相关片段注入——跨会话长期记忆的方案;
- 实体记忆(EntityMemory):抽取对话中实体(人名、订单)的记忆——需要追踪关键对象的场景。
业务视角的选型逻辑:先问"业务需要记多久"——任务型对话(查订单)窗口记忆够;陪伴型/顾问型对话(长期服务同一用户)必须摘要+向量长期记忆。再算"记忆成本账"——每轮注入的历史都是 token 开销,窗口大小直接影响毛利。
2026 年的实践提示:LangChain 新版已把 Memory 范式迁移到 LangGraph 的 Checkpointer+状态管理(显式状态更可控),新项目建议直接用 Graph 的状态机思路管理记忆;Agent 的长期记忆则普遍走"外置记忆系统"(向量库+Profile 表)而非框架内置组件。
🏗 系统架构师
Memory 组件负责跨轮次的对话状态管理——让"无状态的 LLM 调用"具备会话连续性。作用:存取历史消息、控制上下文长度、必要时做摘要压缩,并支持持久化与多实例共享。
常见类型(按机制排):
- Buffer Memory:原样保存全部历史消息——最简单,轮次多后 token 爆炸;
- Window Memory:滑动窗口只保最近 K 轮——控制成本但丢早期信息;
- Summary Memory:旧对话滚动摘要 + 近期原文——平衡连续性与预算;
- Token Buffer Memory:按 token 预算动态截断——比"按轮数"更精确对齐窗口约束;
- Entity/Vector Memory:抽取实体记忆 / 历史向量化检索——长期记忆形态;
- 组合式:Summary + Buffer 混合(远期摘要 + 近期原文)是生产常用配方。
架构师要说的重点(版本演进):LangChain 0.2+ 后传统 Memory 类已被标记为遗留方案,1.0 时代记忆管理收敛到 LangGraph 的持久化模型——checkpointer(每步状态快照存 Postgres/Redis)+ 显式消息状态管理 + thread_id 会话隔离。这与 Agent 系统的记忆架构统一了:短期记忆 = 图状态中的 messages,长期记忆 = store 跨 thread 的向量/结构化存储。
生产选型:新项目直接 LangGraph 持久化(Postgres checkpointer,支持断点恢复与时间旅行);存量简单对话用 Window/Summary Memory 足够。核心权衡始终是:信息完整性 × token 成本 × 检索延迟。
💻 全栈开发专家
Memory 组件负责管理对话状态——把历史消息以某种策略喂回模型,让「无状态的 LLM」表现得有记性。
注意版本分水岭:0.3 之后传统 Memory 类(ConversationBufferMemory 等)已被废弃,新方案是 RunnableWithMessageHistory(显式历史管理)+ LangGraph 的 checkpointer(状态持久化)。但类型学上这些策略仍然成立:
常见类型(按策略演进):
- Buffer(全量缓存):所有消息原样保留——信息最全,token 线性爆炸,短对话可用;
- Window(滑动窗口):只留最近 K 轮——省 token,早期信息丢失;
- Summary(摘要):旧对话压成摘要——省空间保要点,摘要有损+每轮摘要有 LLM 开销;
- Buffer + Summary(混合,生产常用):最近几轮保原文 + 更早的滚动摘要,兼顾连贯与预算;
- Entity Memory(实体记忆):跟踪提到的实体(人名、订单)及其属性,适合客服场景;
- Vector Memory(向量检索记忆):历史入库按相关召回——长对话/跨会话的方案,现在基本由外置向量库 + LangGraph Store 实现。
python
# 新版做法:显式历史 + 裁剪
from langchain_core.messages import trim_messages
history = trim_messages(msgs, strategy="last", max_tokens=4000,
token_counter=llm) # 超预算时旧轮次折叠选型经验:短对话(<10 轮)直接全量;多轮任务用 buffer+summary;跨会话记忆别塞 Memory,用外置存储(向量+KV)自己管读写门槛——会话记忆和长期记忆是两个问题,别混在一个组件里解决。