011.LangChain 记忆类型解析:5 种方案对比与选型指南

33 阅读2分钟

该教程旨在带大家从 0 起步,掌握用 Python 开发大模型应用的技能。若当前内容让你感到晦涩,可回溯本合集的前期文章,降低学习难度。

1. 为什么会出现多种记忆?

  1. 基础 ConversationBufferMemory 会原样保存所有消息
    → 轮数越多 token 越长,容易挤爆上下文窗口
  2. 需求分化
    • 硬控长度 → 窗口 / 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. 选型口诀

  1. 短 & 全量 → Buffer
  2. 轮数固定 → Window
  3. 长会话 & 要压缩 → Summary
  4. 近详远略 & 可控长度 → SummaryBuffer
  5. 快速对齐窗口上限 → TokenBuffer