引言:为什么很多 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 可能会经历:
- 查航班
- 查酒店
- 比预算
- 重新改酒店
- 发邮件
如果没有 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 的意义。