011.LangChain 记忆类型解析:5 种方案对比与选型指南
该教程旨在带大家从 0 起步,掌握用 Python 开发大模型应用的技能。若当前内容让你感到晦涩,可回溯本合集的前期文章,降低学习难度。
1. 为什么会出现多种记忆?
-
基础
ConversationBufferMemory会原样保存所有消息
→ 轮数越多 token 越长,容易挤爆上下文窗口 -
需求分化
-
想硬控长度 → 窗口 / token 上限型
-
想不丢信息又省 token → 总结型
-
想近详远略 → 混合总结 + 原始型
2. 5 种记忆速览表
|
类型 |
存储内容 |
触发截断/压缩条件 |
优点 |
缺点 |
适用场景 |
|---|---|---|---|---|---|
| ConversationBufferMemory |
全部原始消息 |
无(手动截断) |
零信息丢失 |
token 线性增长,易爆窗口 |
短对话、调试阶段 |
| ConversationBufferWindowMemory |
最近 K 轮(来回算 1 轮) |
固定轮数 K |
长度可控,永不过载 |
超 K 轮直接丢弃早期信息 |
聊天室、客服轮次有限 |
| ConversationSummaryMemory |
全程总结字符串 |
每轮结束后重新总结 |
远早于 Buffer 达到上限 |
总结耗 token,可能丢细节 |
长会话、会议纪要 |
| ConversationSummaryBufferMemory |
近期原始 + 远期总结 |
Max token 上限
到达后,从最旧消息开始总结 |
近详远略,不丢早期主旨 |
总结仍耗 token |
大多数生产场景首选 |
| ConversationTokenBufferMemory |
全部原始消息 |
Max token 数
超了则丢弃最旧 |
直观对齐模型窗口单位 |
早期信息被硬截断 |
实时聊天、快速原型 |
轮 vs token 区别:
-
Window 数“来回对话”数量
-
Token 数真实 token 长度,与模型窗口一致
3. 快速体验代码(同一链,换 memory 即可)
from langchain.chains import ConversationChain
from langchain.memory import (
ConversationBufferMemory,
ConversationBufferWindowMemory,
ConversationSummaryMemory,
ConversationSummaryBufferMemory,
ConversationTokenBufferMemory,
)
from langchain_deepseek import ChatDeepSeek
llm = ChatDeepSeek(model="deepseek-chat", temperature=0)
# ① 想测哪种,就换哪种 memory,因大模型不同,可支持的类型有所差异
memory = ConversationBufferWindowMemory(
k=3, # 只保留最近3轮对话
return_messages=True
)
chain = ConversationChain(llm=llm, memory=memory, verbose=True)
# ② 连续对话
print("=== 手动输入模式,q 退出 ===")
while True:
q = input("\n你:").strip()
if q.lower() == "q":
break
ans = chain.invoke({"input": q})["response"]
print("助手:", ans)
观察 verbose 输出:
-
Buffer:历史越来越长
-
Window:只保留最近 K 轮
-
Summary:history 变成“总结字符串”
-
SummaryBuffer:先原始,达上限后旧消息被总结
-
TokenBuffer:达 token 上限直接丢弃最旧消息
4. 选型口诀
-
短 & 全量 → Buffer
-
轮数固定 → Window
-
长会话 & 要压缩 → Summary
-
近详远略 & 可控长度 → SummaryBuffer
-
快速对齐窗口上限 → TokenBuffer
更多推荐



所有评论(0)