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

LangChain BaseChatMemory 详解与子类实战

介绍 LangChain 中的 BaseChatMemory 基类及其核心作用,包括标准化接口、状态管理和扩展性。详细讲解了关键属性 chat_memory 和核心方法 save_context、load_memory_variables、clear。通过三个案例演示了 ConversationBufferMemory、ConversationBufferWindowMemory 和 ConversationSummaryMemory 的子类实战应用,并提供选型建议,帮助开发者根据场景选择合适的记忆模块。

字节跳动发布于 2026/4/6更新于 2026/10/17112 浏览
LangChain BaseChatMemory 详解与子类实战

LangChain BaseChatMemory 详解与子类实战

一、什么是 BaseChatMemory?

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(
    {"input": "你好"},       # 用户输入
    {"output": "你好!有什么可以帮您?"} # 模型输出
)
# 方法 2:手动添加消息到 chat_memory
memory.chat_memory.add_user_message("你好")      # 添加用户消息
memory.chat_memory.add_ai_message("你好!有什么可以帮您?") # 添加 AI 消息
(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",  # 加载记忆时的 key(默认就是"history")
    return_messages=True         # 这里设为 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}")
# 输出结果:
# 对话记忆:
# 类型:HumanMessage,内容:你的名字是什么?
# 类型:AIMessage,内容:我叫工藤助手
# 类型:HumanMessage,内容:我叫张三
# 类型:AIMessage,内容:你好张三!很高兴认识你

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

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

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

# 2. 初始化记忆:k=2 表示只保留最近 2 轮对话(一轮用户 + 一轮 AI 为一轮)
memory = ConversationBufferWindowMemory(
    k=2,                      # 窗口大小:最近 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)
# 输出结果:
# 窗口内对话记忆:
# Human: 适合去公园吗?
# AI: 适合,公园花开了
# Human: 公园要门票吗?
# AI: 不需要,免费开放
案例 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. LangChain BaseChatMemory 详解与子类实战
  2. 一、什么是 BaseChatMemory?
  3. 核心导入方式
  4. 二、BaseChatMemory 的核心作用
  5. 1. 标准化接口:统一“存”和“取”的方法
  6. 2. 状态管理:维护对话历史
  7. 3. 高扩展性:支持自定义逻辑
  8. 三、BaseChatMemory 的关键属性和核心方法
  9. 1. 关键属性:chat_memory
  10. 2. 核心方法:3 个常用技能
  11. (1)save_context():保存对话上下文
  12. 方法 1:直接调用 save_context(推荐,简洁)
  13. 方法 2:手动添加消息到 chat_memory
  14. (2)loadmemoryvariables():加载记忆
  15. 加载记忆
  16. 打印对话历史
  17. 输出结果:
  18. Human: 你好
  19. AI: 你好!有什么可以帮您?
  20. (3)clear():清空记忆
  21. 清空所有记忆
  22. 再加载就是空的了
  23. 输出:{"history": ""}
  24. 四、BaseChatMemory 的常用子类:不用自己写,直接用!
  25. 五、子类实战:3 个案例
  26. 案例 1:ConversationBufferMemory——存储完整对话
  27. 1. 导入需要的包
  28. 2. 初始化记忆(return_messages=True:返回消息对象列表,False 返回字符串)
  29. 3. 保存对话上下文
  30. 4. 加载并查看记忆
  31. 输出结果:
  32. 对话记忆:
  33. 类型:HumanMessage,内容:你的名字是什么?
  34. 类型:AIMessage,内容:我叫工藤助手
  35. 类型:HumanMessage,内容:我叫张三
  36. 类型:AIMessage,内容:你好张三!很高兴认识你
  37. 5. 清空记忆
  38. 输出:清空后记忆: {'chat_history': []}
  39. 案例 2:ConversationBufferWindowMemory——只记最近 k 轮对话
  40. 1. 导入需要的包
  41. 2. 初始化记忆:k=2 表示只保留最近 2 轮对话(一轮用户 + 一轮 AI 为一轮)
  42. 3. 保存 3 轮对话(会自动只留最后 2 轮)
  43. 第 1 轮
  44. 第 2 轮
  45. 第 3 轮
  46. 4. 加载记忆:只保留最后 2 轮(第 2、3 轮)
  47. 输出结果:
  48. 窗口内对话记忆:
  49. Human: 适合去公园吗?
  50. AI: 适合,公园花开了
  51. Human: 公园要门票吗?
  52. AI: 不需要,免费开放
  53. 案例 3:ConversationSummaryMemory——用摘要压缩对话
  54. 1. 导入需要的包
  55. 2. 初始化大模型(也可以用开源模型,如通义千问、智谱清言)
  56. 3. 初始化记忆:传入大模型用于生成摘要
  57. 4. 保存多轮对话
  58. 5. 加载记忆:返回的是对话摘要,不是原始对话
  59. 输出结果(大模型生成,简洁保留关键信息):
  60. 用户张三表示想学习微积分,助手表示会帮他规划学习路径。用户询问微积分先学什么,助手建议先学极限,因为极限是微积分的基础。用户又问极限怎么学容易,助手建议多练例题,理解无穷小和无穷大的概念。
  61. 六、怎么选 BaseChatMemory 子类?一张表搞定!
  62. 总结

更多推荐文章

查看全部
  • 反无人机技术原理与反制手段详解
  • Pix4Dmapper 大疆无人机影像数据处理流程
  • VS Code 中 GitHub Copilot 安装后无法使用的问题排查与解决
  • 飞算 JavaAI 辅助 Java 项目开发全流程解析
  • Wan2.2-T2V-A14B 模型下载与部署指南
  • 2025 年 18 款主流 AI 助手推荐
  • Java 集合框架核心组件与使用场景
  • Seedance 2.0 多模态视频创作完整操作指南
  • Spring Boot + Kotlin + Gradle 构建现代化后端应用
  • 使用 Trae AI 将设计稿自动生成前端代码指南
  • Leaflet 结合 SpringBoot 实现地图点击获取当地时间
  • 算法的“预谋”:前缀和如何改变游戏规则
  • 制造业软件企业模式重构与 AI 赋能路径
  • VS Code 中 GitHub Copilot 安装后无法使用?关键步骤补全
  • SQL 防火墙体系化实践:构建数据库内生安全防线
  • 基于 DeepSeek 与 Cursor 构建智能代码审查工具实战
  • GitHub Copilot 在 VS Code 中无法使用的关键解决步骤
  • 企业级 Web 药店管理系统:SpringBoot+Vue+MyBatis+MySQL 架构设计
  • Ubuntu 20.04/22.04 使用 NVM 安装 Node.js 22 LTS 版本
  • HarmonyOS 6.0 Camera Kit 微距状态监听能力详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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