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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐