该教程旨在带大家从 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