Skip to main content

1. Memory记忆存储

Written: 2026.06

2. 记忆存储

2.1 为什么需要记忆存储

当我们使用 langchain 和大语言模型聊天时,会出现如下的情况:
调用本地部署qwen3:14b
执行结果如下
我们刚刚在前一轮对话告诉大语言模型的信息,下一轮就被“遗忘了”。但如果我们使用使用 ChatGPT 聊天时,它能记住多轮对话中的内容,这ChatGPT网页版实现了历史记忆功能

2.2 实现原理

实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次请求时,把 所有的历史信息都输入给模型,让模型输出最终结果。一个记忆组件要实现的三个最基本功能:
  • Read: 读取记忆组件保存的历史对话信息
  • Write: 写入历史对话信息到记忆组件
  • Store: 存储历史对话消息
在LangChain中,提供这个功能的模块就称为 **Memory(记忆) **,用于存储用户和模型交互的历史信息。给大语言模型添加记忆功能的方法如下:
  • 在链执行前,将历史消息从记忆组件读取出来,和用户输入一起添加到提示词中,传递给大语言模型
  • 在链执行完毕后,将用户的输入和大语言模型输出,一起写入到记忆组件中
  • 下一次调用大语言模型时,重复这个过程
实现原理

实现原理

更多 langchain 记忆存储相关内容,可参考文档:https://docs.langchain.com/oss/python/langchain/short-term-memory

2.3 实现类介绍

ConversationChain 是 LangChain 早期用于简化对话管理的类,内部集成了内存(如 ConversationBufferMemory)和提示模板,适合快速构建简单对话应用。然而,它存在以下问题:
  1. 灵活性不足:提示模板和内存管理逻辑较为固定,难以支持复杂对话流程。
  2. 与新 API 不兼容:未针对现代聊天模型(如支持工具调用的模型)优化。
  3. 架构过时:LangChain 0.3.x 开始推崇基于 LangChain Expression Language(LCEL)和 Runnable 的模块化设计,ConversationChain 不符合这一理念。
RunnableWithMessageHistory 是 LangChain 推荐的替代方案,优势包括:
  1. 模块化:允许自由组合提示模板、模型和内存管理逻辑。
  2. 灵活性:支持自定义对话历史存储(如内存、数据库)和复杂对话流程。
  3. 兼容性:与 LCEL 和现代聊天模型无缝集成。
  4. 长期支持:在 LangChain 0.3.x 中稳定,且不会在 1.0 中移除。
官方建议:
  • 简单聊天:用 BaseChatMessageHistory + RunnableWithMessageHistory
  • 复杂场景:用 LangGraph persistence(Checkpointer + Content Blocks + 记忆中间件)

3. BaseChatMessageHistory简介

BaseChatMessageHistory是用来保存聊天消息历史的抽象基类,下面对其核心属性与方法进行分析:

3.1 属性

messages: List[BaseMessage]:用来接收和读取历史消息的只读属性

3.2 方法

add_messages:批量添加消息,默认实现是每个消息都去调用一次 add_message add_message:单独添加消息,实现类必须重写这个方法,否则会抛出异常 clear():清空所有消息,实现类必须重写这个方法

3.3 常见实现类

分析LangChain源码可知,在 LangChain 的类结构中,顶层基类是 BaseChatMemory,用于 控制“什么时候加载记忆、什么时候写入”等核心功能, 是所有“聊天记忆类”的抽象基类,定义了统一接口。其职责不是存储数据,而是 协调数据读写 而 InMemoryChatMessageHistory 是具体实现,定义了 “记忆存在哪、怎么存”
常见实现类

常见实现类

下面是LangChain中常用的消息历史组件以及它们的特性,其中InMemoryChatMessageHistoryBaseChatMemory默认使用的聊天消息历史组件

4. 实践使用

4.1 快速体验

InMemoryChatMessageHistory 是 LangChain 中的一个内存型消息历史记录器,用于在对话过程中临时存储 AI 和用户之间的消息记录。接下来通过一个简单的示例演示如果使用:
InMemoryChatMessageHistory示例
执行结果如下

4.2 LCEL调用

通过 RunnableWithMessageHistory 我们可以把任意 Runnable包装起来,并结合 InMemoryChatMessageHistory 来实现多轮对话。
RunnableWithMessageHistory示例
执行结果如下

4.3 记忆窗口裁剪

记忆裁剪是指在长时间对话中,有选择地保留、压缩或丢弃部分历史消息,以保证模型的推理性能和成本可控。trim_messages 是 LangChain 中提供的一个工具函数,用于从消息列表中裁剪出“最近 N 条”消息。它常用于控制记忆窗口(window memory),比如在你使用 InMemoryChatMessageHistory 时,想要只保留最近几条历史记录,示例代码如下:
记忆窗口裁剪
运行结果如下,可以看到因为我们设置了记住最近 4 条历史消息,因此 AI 无法回答出我喜欢唱和跳的内容了:
主循环

4.4 Redis存储

使用内存管理消息记录的方式只是临时使用,在实际生产环境都需要持久化的存储数据库。langchain 提供了很多基于其他存储系统的扩展依赖,例如 redis、kafka、MongoDB 等,具体参考官网:https://python.langchain.ac.cn/docs/integrations/memory/。接下来以 redis 为例演示如何持久化存储历史消息
部署 redis、安装 pip 包
使用Redis存储历史信息
主循环
查看 redis 数据库信息,发现他只会记住最近 4 条聊天记录。

查看 redis 数据库信息,发现他只会记住最近 4 条聊天记录。

Redis存储

Redis存储

5. 项目实践:聊天机器人开发

5.1 项目描述

基于 LangChain 1.0 和 Gradio 构建的多角色聊天机器人,支持流式输出、多角色切换、上下文记忆等功能,用户可选择不同的 AI 角色与之对话,体验风格各异的智能响应 我们主要理解 LangChain 相关代码即可,在实际工作中 Gradio 代码通常都是 AI 生成,我们无需花费太多精力研究

5.2 实现功能

  • 多角色支持(如通用助手、英语老师、段子手等)
  • 每个角色拥有独立对话上下文(Memory 隔离)
  • 支持流式输出回答,提高响应体验
  • 用户界面美观简洁(Gradio 实现)
  • 支持提示词模板自定义(PromptTemplate)
  • 会话历史记忆与追溯(使用 Memory 模块)

5.3 项目效果

项目效果

5.4 代码实现

代码实现
redis 查看会话历史记录,可以看到与各个不同角色的 AI 对话的详细聊天记录内容。

redis 查看会话历史记录,可以看到与各个不同角色的 AI 对话的详细聊天记录内容。