跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

LLM 存储记忆功能:BaseChatMemory 详解与子类实战

介绍 LangChain 中 BaseChatMemory 基类及其核心作用,包括标准化接口(save_context、load_memory_variables、clear)和状态管理。详细解析三个常用子类:ConversationBufferMemory(存储完整对话)、ConversationBufferWindowMemory(滑动窗口保留最近 k 轮)、ConversationSummaryMemory(用摘要压缩对话)。通过代码案例展示如何初始化、保存上下文及加载记忆,帮助开发者根据场景选择合适的记忆模块以优化 LLM 对话体验。

雪落无声发布于 2026/4/6更新于 2026/9/1176 浏览
LLM 存储记忆功能:BaseChatMemory 详解与子类实战

LLM 存储记忆功能:BaseChatMemory 详解与子类实战

BaseChatMemory 是 LangChain 中所有聊天型记忆模块的基类,简单说就是'所有聊天记忆的模板'——它定义了记忆存储和检索的通用规则。无论使用 ConversationBufferMemory 还是自定义记忆,都需遵循其规范。

# 核心导入方式
from langchain.memory.chat_memory import BaseChatMemory 

它的核心价值在于'标准化':不管你是想存原始对话,还是存对话摘要,甚至想加密存储、过滤敏感信息,都能通过继承它来实现,不用从零造轮子。

一、什么是 BaseChatMemory?

在这里插入图片描述

BaseChatMemory 作为基类,主要干三件大事,撑起所有聊天记忆的基础功能:

1. 标准化接口:统一'存'和'取'的方法

不管什么聊天记忆,都得实现两个核心方法,这是 BaseChatMemory 定好的规矩:

  • save_context():存上下文——把用户输入和模型输出保存到记忆里;
  • load_memory_variables():取记忆——把保存的对话历史加载出来,供大模型使用。

有了统一接口,我们切换不同记忆模块时,代码不用大改,兼容性拉满!

2. 状态管理:维护对话历史

BaseChatMemory 会通过内部属性,帮我们管好对话消息的增删改查,不用自己手动维护列表。不管是加一条用户消息,还是清空所有记忆,都有现成的方法可用。

3. 高扩展性:支持自定义逻辑

这是最实用的点!我们可以继承 BaseChatMemory,重写它的方法,实现自己的需求:比如保存时过滤'密码'等敏感词,加载时只取最近 3 天的对话,甚至把记忆加密存储。

二、BaseChatMemory 的关键属性和核心方法

要用好 BaseChatMemory,先搞懂它的'核心装备'——属性和方法。

1. 关键属性:chat_memory

这是存储对话消息的'容器',类型是 ChatMessageHistory,里面有个 messages 列表,所有对话消息都存在这里。

每条消息都是 BaseMessage 的子类,常见的有两种:

  • HumanMessage:用户发送的消息;
  • AIMessage:模型回复的消息。

简单说,chat_memory 就像一个'聊天笔记本',每一页就是一条 HumanMessage 或 AIMessage。

2. 核心方法:3 个常用技能
(1)save_context():保存对话上下文

作用:把用户输入和模型输出成对保存到 chat_memory 里。 用法有两种,效果完全一样:

# 方法 1:直接调用 save_context(推荐,简洁)
memory.save_context({:},{:})


memory.chat_memory.add_user_message()
memory.chat_memory.add_ai_message()
"input"
"你好"
"output"
"你好!有什么可以帮您?"
# 方法 2:手动添加消息到 chat_memory
"你好"
"你好!有什么可以帮您?"
(2)load_memory_variables():加载记忆

作用:把保存的对话历史取出来,默认返回一个字典,key 是'history',value 是对话字符串。 示例:

# 加载记忆
variables = memory.load_memory_variables({})
# 打印对话历史
print(variables["history"])
# 输出结果:
# Human: 你好
# AI: 你好!有什么可以帮您?
(3)clear():清空记忆

作用:一键清空 chat_memory 里的所有对话消息,相当于'格式化笔记本'。 示例:

# 清空所有记忆
memory.clear()
# 再加载就是空的了
print(memory.load_memory_variables({}))
# 输出:{"history": ""}

三、BaseChatMemory 的常用子类:不用自己写,直接用!

BaseChatMemory 是基类,不能直接用,LangChain 已经帮我们实现了几个常用子类,覆盖大部分场景,直接拿来用就行~

子类名称核心特点适用场景
ConversationBufferMemory存储完整原始对话历史短对话、需要保留全部对话细节
ConversationBufferWindowMemory只保留最近 k 轮对话(滑动窗口)长对话、避免 token 占用过多
ConversationSummaryMemory存储对话摘要(用大模型总结历史)超长对话、需要压缩对话内容

四、子类实战:3 个案例

案例 1:ConversationBufferMemory——存储完整对话

适合短对话,需要保留每一句聊天内容的场景。

# 1. 导入需要的包
from langchain.memory import ConversationBufferMemory 

# 2. 初始化记忆(return_messages=True:返回消息对象列表,False 返回字符串)
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 3. 保存对话上下文
memory.save_context({"input":"你的名字是什么?"},{"output":"我叫工藤助手"})
memory.save_context({"input":"我叫张三"},{"output":"你好张三!很高兴认识你"})

# 4. 加载并查看记忆
chat_history = memory.load_memory_variables({})["chat_history"]
print("对话记忆:")
for msg in chat_history:
    print(f"类型:{type(msg).__name__},内容:{msg.content}")

# 5. 清空记忆
memory.clear()
print("\n清空后记忆:", memory.load_memory_variables({}))
案例 2:ConversationBufferWindowMemory——只记最近 k 轮对话

适合长对话,比如聊了 100 轮,只想让模型记住最后 3 轮,避免 token 不够用。

# 1. 导入需要的包
from langchain.memory import ConversationBufferWindowMemory 

# 2. 初始化记忆:k=2 表示只保留最近 2 轮对话(一轮用户 + 一轮 AI 为一轮)
memory = ConversationBufferWindowMemory(
    k=2,
    memory_key="chat_history",
    return_messages=False
)

# 3. 保存 3 轮对话(会自动只留最后 2 轮)
# 第 1 轮
memory.save_context({"input":"今天天气怎么样?"},{"output":"今天晴天,适合出游"})
# 第 2 轮
memory.save_context({"input":"适合去公园吗?"},{"output":"适合,公园花开了"})
# 第 3 轮
memory.save_context({"input":"公园要门票吗?"},{"output":"不需要,免费开放"})

# 4. 加载记忆:只保留最后 2 轮(第 2、3 轮)
chat_history = memory.load_memory_variables({})["chat_history"]
print("窗口内对话记忆:")
print(chat_history)
案例 3:ConversationSummaryMemory——用摘要压缩对话

在这里插入图片描述

适合超长对话,比如聊了 100 轮,用大模型把历史对话总结成一段话,既省 token 又能保留关键信息。

# 1. 导入需要的包
from langchain.memory import ConversationSummaryMemory 
from langchain.chat_models import ChatOpenAI 

# 2. 初始化大模型(也可以用开源模型,如通义千问、智谱清言)
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

# 3. 初始化记忆:传入大模型用于生成摘要
memory = ConversationSummaryMemory(
    llm=llm,
    memory_key="chat_history",
    return_messages=False
)

# 4. 保存多轮对话
memory.save_context({"input":"我叫张三,想学习微积分"},{"output":"好的,我会帮你规划学习路径"})
memory.save_context({"input":"微积分先学什么?"},{"output":"先学极限,这是微积分的基础"})
memory.save_context({"input":"极限怎么学容易?"},{"output":"多练例题,理解无穷小和无穷大的概念"})

# 5. 加载记忆:返回的是对话摘要,不是原始对话
summary = memory.load_memory_variables({})["chat_history"]
print("对话摘要:")
print(summary)

五、怎么选 BaseChatMemory 子类?一张表搞定!

不知道用哪个子类?看场景选就行,一目了然:

场景需求推荐子类关键参数
短对话、需要完整保留所有对话细节ConversationBufferMemoryreturn_messages
长对话、只想记最近几轮ConversationBufferWindowMemoryk(窗口大小)
超长对话、想压缩对话省 tokenConversationSummaryMemoryllm(摘要用的大模型)
要自定义逻辑(过滤敏感词、加密)继承 BaseChatMemory 重写方法-

六、总结

BaseChatMemory 作为 LangChain 聊天记忆的基类,核心是定了'存(save_context)、取(load_memory_variables)、清(clear)'的标准接口,让各种记忆模块有章可循。它的子类不用我们自己写,直接根据场景选:短对话用 ConversationBufferMemory,长对话用窗口记忆,超长对话用摘要记忆。

目录

  1. LLM 存储记忆功能:BaseChatMemory 详解与子类实战
  2. 核心导入方式
  3. 一、什么是 BaseChatMemory?
  4. 1. 标准化接口:统一“存”和“取”的方法
  5. 2. 状态管理:维护对话历史
  6. 3. 高扩展性:支持自定义逻辑
  7. 二、BaseChatMemory 的关键属性和核心方法
  8. 1. 关键属性:chat_memory
  9. 2. 核心方法:3 个常用技能
  10. (1)save_context():保存对话上下文
  11. 方法 1:直接调用 save_context(推荐,简洁)
  12. 方法 2:手动添加消息到 chat_memory
  13. (2)loadmemoryvariables():加载记忆
  14. 加载记忆
  15. 打印对话历史
  16. 输出结果:
  17. Human: 你好
  18. AI: 你好!有什么可以帮您?
  19. (3)clear():清空记忆
  20. 清空所有记忆
  21. 再加载就是空的了
  22. 输出:{"history": ""}
  23. 三、BaseChatMemory 的常用子类:不用自己写,直接用!
  24. 四、子类实战:3 个案例
  25. 案例 1:ConversationBufferMemory——存储完整对话
  26. 1. 导入需要的包
  27. 2. 初始化记忆(return_messages=True:返回消息对象列表,False 返回字符串)
  28. 3. 保存对话上下文
  29. 4. 加载并查看记忆
  30. 5. 清空记忆
  31. 案例 2:ConversationBufferWindowMemory——只记最近 k 轮对话
  32. 1. 导入需要的包
  33. 2. 初始化记忆:k=2 表示只保留最近 2 轮对话(一轮用户 + 一轮 AI 为一轮)
  34. 3. 保存 3 轮对话(会自动只留最后 2 轮)
  35. 第 1 轮
  36. 第 2 轮
  37. 第 3 轮
  38. 4. 加载记忆:只保留最后 2 轮(第 2、3 轮)
  39. 案例 3:ConversationSummaryMemory——用摘要压缩对话
  40. 1. 导入需要的包
  41. 2. 初始化大模型(也可以用开源模型,如通义千问、智谱清言)
  42. 3. 初始化记忆:传入大模型用于生成摘要
  43. 4. 保存多轮对话
  44. 5. 加载记忆:返回的是对话摘要,不是原始对话
  45. 五、怎么选 BaseChatMemory 子类?一张表搞定!
  46. 六、总结

更多推荐文章

查看全部
  • 智元机器人三大产线及量产里程碑解析
  • 基于 YOLOv8/v11 与 LLM 的 Web 视觉检测系统 (Django+Vue3)
  • C++ 类和对象:拷贝构造与赋值运算符重载详解
  • GitHub Copilot 实战:Python 开发中的 AI 辅助技巧
  • 基于 Python 的极简 OpenClaw Agent 实现:openclaw-mini
  • 富文本编辑集成指南:5 阶段实现低代码高效开发
  • ArduPilot RemoteID Transmitter 实现无人机远程识别合规方案
  • 实战:手写通用 Web 层鉴权注解,解决水平权限漏洞
  • Spring AI MCP Server 集成与示例
  • Python 操作 PDF 页面详解:删除指定页的完整方案
  • MacOS 多合一启动盘制作与系统降版本指南
  • Dev-C++ 下载与安装指南
  • Spring AI MCP Server 集成与源码解析
  • 基于 FPGA 的 CARRY4 抽头延迟链 TDC 延时仿真
  • Rust 异步编程实战:构建高性能网络服务
  • Flutter 高性能原理浅析
  • IDEA 集成通义千问插件的 Java 开发实战
  • 基于 OpenClaw 搭建 QQ AI 办公机器人:关键词触发与邮件发送
  • 消息队列选型:Kafka、RabbitMQ 与 Redis 对比分析
  • Spring AI MCP Server 集成与使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online