内存(Memory)基础:ConversationBuffer、Summary Memory 等

引言:为什么很多 Agent 聊几轮就"失忆"了?

很多人第一次做 Agent 时,都会遇到一个问题:

第一轮:

text 复制代码
用户:我叫张三。
Agent:好的,我记住了。

第二轮:

text 复制代码
用户:我叫什么?
Agent:抱歉,我不知道。

或者:

text 复制代码
用户:帮我安排下周去东京出差。

过了几轮以后:

text 复制代码
Agent:请问你要去哪里?

明明刚刚说过,它却忘了。

很多人会以为:

是模型太笨。

但实际上,大模型默认是"没有记忆"的。

每一次调用,它都只会看到:

当前传给它的那段 Prompt。

如果你没有把之前的对话一起传进去,那么模型根本不知道发生过什么。

所以,真正决定 Agent 能不能"记住你",靠的不是模型本身,而是 Memory(内存 / 记忆)。

一句话理解:

Memory 的作用,就是把"过去发生的事"重新放回模型上下文里。

这篇文章,我们重点讲最常见的几种 Memory:

  • ConversationBufferMemory
  • ConversationBufferWindowMemory
  • ConversationSummaryMemory
  • 什么时候该用哪一种

一、为什么大模型默认没有记忆?

很多人会下意识觉得:

我刚刚都已经说过了,模型为什么会忘?

因为对于大模型来说,每一次调用其实都是一次全新的请求。

例如:

第一次:

text 复制代码
用户:我叫张三。

第二次:

text 复制代码
用户:我叫什么?

如果第二次调用时,你只发送:

text 复制代码
我叫什么?

模型当然不知道。

真正要做的,其实是:

text 复制代码
用户:我叫张三。
用户:我叫什么?

然后一起发给模型。

也就是说,所谓 Memory,本质上只是:

帮你自动保存历史对话,并在下一次调用时重新拼回 Prompt。


二、最基础的 Memory:ConversationBufferMemory

最简单、最常见的 Memory,就是:

text 复制代码
ConversationBufferMemory

它的逻辑非常直接:

把所有历史对话,原样保存下来。

例如:

text 复制代码
用户:我叫张三。
助手:好的。
用户:我住在北京。
助手:好的。
用户:我叫什么?

下一次调用时,模型看到的 Prompt 就会变成:

text 复制代码
用户:我叫张三。
助手:好的。
用户:我住在北京。
助手:好的。
用户:我叫什么?

于是模型就能回答:

text 复制代码
你叫张三。

LangChain 示例

python 复制代码
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()

memory.save_context(
    {"input": "我叫张三"},
    {"output": "好的,我记住了"}
)

print(memory.load_memory_variables({}))

输出类似:

python 复制代码
{
    "history": "Human: 我叫张三\nAI: 好的,我记住了"
}

它适合什么场景?

适合:

  • 简单聊天
  • 短对话
  • Demo
  • 测试

它的问题

最大的缺点是:

对话越长,Prompt 越来越大。

例如聊了几十轮以后:

  • Token 消耗暴涨
  • 调用越来越慢
  • 成本越来越高
  • 最后甚至超出模型上下文限制

所以,ConversationBuffer 更适合短对话。


三、ConversationBufferWindowMemory:只保留最近几轮

如果你不希望历史无限增长,一个更常见的方法是:

只保留最近 N 轮对话。

这就是:

text 复制代码
ConversationBufferWindowMemory

例如:

python 复制代码
from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(k=3)

这里的 k=3 表示:

只保留最近 3 轮。

例如,如果历史已经很多:

text 复制代码
第1轮:我叫张三
第2轮:我住在北京
第3轮:我喜欢咖啡
第4轮:我喜欢旅游

k=3 时,最早那一轮就会被丢掉。

模型看到的只会是:

text 复制代码
我住在北京
我喜欢咖啡
我喜欢旅游

它适合什么场景?

特别适合:

  • 长对话
  • 客服
  • 聊天机器人
  • 只需要最近上下文的场景

它的问题

如果用户前面提到的重要信息太早,就会被忘掉。

例如:

text 复制代码
第一轮:我叫张三
第十轮:我叫什么?

如果前面的名字已经被窗口挤掉,模型就又会"失忆"。

所以:

Window Memory 更适合"只关心最近几轮"的场景。


四、ConversationSummaryMemory:让模型自己"总结过去"

很多时候,我们既希望:

  • 不要保存全部历史
  • 又不要彻底忘掉过去

这时候,就需要 Summary Memory。

它的核心思想是:

不保存所有原文,而是把过去的对话压缩成一段摘要。

例如:

原始对话:

text 复制代码
用户:我叫张三。
用户:我住在北京。
用户:我准备下周去东京出差。

Summary Memory 最后可能保存成:

text 复制代码
用户叫张三,住在北京,下周计划去东京出差。

下一次调用时,再把这段摘要放进 Prompt。

LangChain 示例

python 复制代码
from langchain.memory import ConversationSummaryMemory
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4.1-mini")

memory = ConversationSummaryMemory(
    llm=llm
)

这里的关键是:

Summary Memory 自己也需要一个模型,来负责"总结过去"。

它适合什么场景?

特别适合:

  • 长期对话
  • Agent
  • 客服
  • 办公助手
  • 多轮复杂任务

因为它能做到:

历史不会无限增长,但重要信息还能保留下来。

它的问题

Summary 也不是万能的。

因为:

  • 总结可能不准确
  • 有些细节可能被遗漏
  • 总结越多,越容易失真

例如:

text 复制代码
"用户不喜欢咖啡"

如果总结错成:

text 复制代码
"用户喜欢咖啡"

后面整个 Agent 都会出错。

所以 Summary Memory 更适合:

重要的是大方向,而不是精确细节。


五、ConversationSummaryBufferMemory:最常见、最平衡

在真实项目里,很多人最后会发现:

  • Buffer 太长
  • Window 容易忘
  • Summary 又容易丢细节

所以,LangChain 后来又提供了一种更常见的组合方式:

text 复制代码
ConversationSummaryBufferMemory

它的逻辑是:

最近几轮保留原文 + 更早的历史压缩成摘要。

例如:

text 复制代码
摘要:用户叫张三,住在北京。
最近对话:
用户:我下周去东京。
用户:预算 15000。

这样模型既不会忘掉关键背景,也能保留最近的精确信息。

很多真正的 Agent,最后都会使用这种混合模式。


六、Memory 在 Agent 里到底有什么用?

很多人以为 Memory 只是为了:

记住用户名字。

其实真正的 Agent 更需要 Memory。

例如:

text 复制代码
用户:帮我安排下周去东京出差。

Agent 可能会经历:

  1. 查航班
  2. 查酒店
  3. 比预算
  4. 重新改酒店
  5. 发邮件

如果没有 Memory,Agent 每一步都可能忘记:

  • 用户目的地
  • 用户预算
  • 上一步结果
  • 当前任务进度

于是整个 Agent 就没法持续工作。

所以对于 Agent 来说,Memory 不只是"聊天记录"。

它更像:

当前任务状态。

例如:

text 复制代码
目标:东京出差
预算:15000
当前已选机票:7200
当前酒店:7600

这其实也是一种 Memory。


七、短期记忆 vs 长期记忆

2026 年的 Agent,一般会把 Memory 分成两类。

1. 短期记忆(Short-Term Memory)

也就是:

  • 最近几轮对话
  • 当前任务状态
  • 临时上下文

通常用:

  • Buffer
  • Window
  • Summary

2. 长期记忆(Long-Term Memory)

也就是:

  • 用户偏好
  • 历史任务
  • 长期知识
  • 用户档案

例如:

text 复制代码
用户喜欢咖啡
用户长期住在北京
用户经常出差东京

这类信息,通常不会只存在 Prompt 里,而会存到:

  • 数据库
  • 向量库
  • Redis
  • 用户 Profile

然后下次再取回来。

也就是说:

Memory 不一定都在模型里。

真正企业级 Agent,往往是:

text 复制代码
短期 Memory + 长期 Profile + 外部数据库

八、到底该选哪一种 Memory?

Memory 类型 做法 优点 缺点 适合
ConversationBufferMemory 保存全部历史 最简单、最准确 越来越长 短对话、Demo
ConversationBufferWindowMemory 只保留最近几轮 节省 Token 容易忘掉旧信息 聊天、客服
ConversationSummaryMemory 历史自动总结 更适合长对话 可能丢细节 长期对话
ConversationSummaryBufferMemory 最近保留原文 + 历史摘要 最平衡 实现更复杂 Agent、真实项目

如果你不知道怎么选,一个最简单的建议是:

text 复制代码
Demo → Buffer
聊天机器人 → Window
真正 Agent → SummaryBuffer

九、为什么很多 Agent 的 Memory 最后会失败?

很多项目做到后面,都会发现:

Agent 记忆越来越乱。

常见问题包括:

  • 记住了太多没用信息
  • 把旧信息当成新信息
  • Summary 越来越不准确
  • 长期记忆和当前任务冲突

所以,真正成熟的 Agent 往往不会:

什么都记。

而是会有选择地保存:

  • 哪些信息值得记
  • 记多久
  • 放到哪里
  • 什么时候删掉

这其实已经不仅仅是 Memory,而是:

Memory 管理。


十、下一步:Memory + Tool + ReAct,才是真正的 Agent

如果你已经掌握了:

  • Prompt
  • Tool Calling
  • Memory

那么你就已经有了 Agent 最核心的三个组件。

接下来,真正的 Agent 会变成:

text 复制代码
思考
→ 调工具
→ 观察结果
→ 更新 Memory
→ 再思考

这也就是下一步要进入的:

ReAct Agent


结语

一句话总结:

Memory 的作用,不是让模型"变聪明",而是让模型"不忘记"。

  • Buffer:保存全部历史
  • Window:只保留最近几轮
  • Summary:自动总结过去
  • SummaryBuffer:最适合真实 Agent

真正的 Agent,不只是会说话。

它还必须记得:

  • 你是谁
  • 你刚才说了什么
  • 当前任务做到哪里
  • 下一步应该做什么

而这,正是 Memory 的意义。

相关推荐
猿来如此呀5 小时前
DeepAgent 完全教程:从零到精通构建智能体
agent·deepagent
秋知叶i7 小时前
【Agent 】--- 全局 Skills 实战:OpenCode 使用全局技能统一配置保姆级教程
agent·skills·opencode
是小蟹呀^9 小时前
【总结】LangChain中的中间件Middleware
python·中间件·langchain·agent
去伪存真9 小时前
Superpowers 从“调教提示词”转向“构建工程规范”
前端·agent
王解10 小时前
第5篇:ReMe——文件即记忆,让用户可读、可改、可迁移
人工智能·ai agent·记忆管理·认知进化
loong_XL10 小时前
2026智能体爆发现象级产品:OpenClaw、Hermes Agent、Claude Cowork
大模型·agent·智能体·claw·龙虾
FrontAI10 小时前
深入浅出 LangChain —— 第三章:模型抽象层
前端·人工智能·typescript·langchain·ai agent
一个处女座的程序猿11 小时前
Agent之Memory:EverOS的简介、安装和使用方法、案例应用之详细攻略
agent·memory·everos
fundroid12 小时前
Google 发布 Android Skill & Android CLI:大幅提升 Android Agent 能力
android·agent·cli·skill