1. Memory记忆存储
2. 记忆存储
2.1 为什么需要记忆存储
Written: 2026.06 大语言模型本质上是经过大量数据训练出来的自然语言模型,用户给出输入信息,大语言模型会根据训练的数据进行预测给出指定的结果,大语言模型本身是“无状态的”,模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出 当我们使用 langchain 和大语言模型聊天时,会出现如下的情况:调用本地部署qwen3:14b
执行结果如下
2.2 实现原理
实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次请求时,把 所有的历史信息都输入给模型,让模型输出最终结果。一个记忆组件要实现的三个最基本功能:- Read: 读取记忆组件保存的历史对话信息
- Write: 写入历史对话信息到记忆组件
- Store: 存储历史对话消息
- 在链执行前,将历史消息从记忆组件读取出来,和用户输入一起添加到提示词中,传递给大语言模型
- 在链执行完毕后,将用户的输入和大语言模型输出,一起写入到记忆组件中
- 下一次调用大语言模型时,重复这个过程

2.3 实现类介绍
ConversationChain 是 LangChain 早期用于简化对话管理的类,内部集成了内存(如 ConversationBufferMemory)和提示模板,适合快速构建简单对话应用。然而,它存在以下问题:
- 灵活性不足:提示模板和内存管理逻辑较为固定,难以支持复杂对话流程。
- 与新 API 不兼容:未针对现代聊天模型(如支持工具调用的模型)优化。
-
架构过时:LangChain 0.3.x 开始推崇基于 LangChain Expression Language(LCEL)和
Runnable的模块化设计,ConversationChain不符合这一理念。
RunnableWithMessageHistory 是 LangChain 推荐的替代方案,优势包括:
- 模块化:允许自由组合提示模板、模型和内存管理逻辑。
- 灵活性:支持自定义对话历史存储(如内存、数据库)和复杂对话流程。
- 兼容性:与 LCEL 和现代聊天模型无缝集成。
- 长期支持:在 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 是具体实现,定义了 “记忆存在哪、怎么存”

InMemoryChatMessageHistory是BaseChatMemory默认使用的聊天消息历史组件
| 组件名称 | 特性 |
|---|---|
InMemoryChatMessageHistory | 基于内存存储的聊天消息历史组件 |
FileChatMessageHistory | 基于文件存储的聊天消息历史组件 |
RedisChatMessageHistory | 基于Redis存储的聊天消息历史组件 |
ElasticsearchChatMessageHistory | 基于ES存储的聊天消息历史组件 |
4. 实践使用
4.1 快速体验
InMemoryChatMessageHistory 是 LangChain 中的一个内存型消息历史记录器,用于在对话过程中临时存储 AI 和用户之间的消息记录。接下来通过一个简单的示例演示如果使用:
InMemoryChatMessageHistory示例
执行结果如下
4.2 LCEL调用
通过RunnableWithMessageHistory 我们可以把任意 Runnable包装起来,并结合 InMemoryChatMessageHistory 来实现多轮对话。
RunnableWithMessageHistory示例
执行结果如下
4.3 记忆窗口裁剪
记忆裁剪是指在长时间对话中,有选择地保留、压缩或丢弃部分历史消息,以保证模型的推理性能和成本可控。trim_messages 是 LangChain 中提供的一个工具函数,用于从消息列表中裁剪出“最近 N 条”消息。它常用于控制记忆窗口(window memory),比如在你使用 InMemoryChatMessageHistory 时,想要只保留最近几条历史记录,示例代码如下:
记忆窗口裁剪
主循环
4.4 Redis存储
使用内存管理消息记录的方式只是临时使用,在实际生产环境都需要持久化的存储数据库。langchain 提供了很多基于其他存储系统的扩展依赖,例如 redis、kafka、MongoDB 等,具体参考官网:https://python.langchain.ac.cn/docs/integrations/memory/。接下来以 redis 为例演示如何持久化存储历史消息部署 redis、安装 pip 包
使用Redis存储历史信息
主循环


5. 项目实践:聊天机器人开发
5.1 项目描述
基于 LangChain 1.0 和 Gradio 构建的多角色聊天机器人,支持流式输出、多角色切换、上下文记忆等功能,用户可选择不同的 AI 角色与之对话,体验风格各异的智能响应 我们主要理解 LangChain 相关代码即可,在实际工作中 Gradio 代码通常都是 AI 生成,我们无需花费太多精力研究5.2 实现功能
- 多角色支持(如通用助手、英语老师、段子手等)
- 每个角色拥有独立对话上下文(Memory 隔离)
- 支持流式输出回答,提高响应体验
- 用户界面美观简洁(Gradio 实现)
- 支持提示词模板自定义(PromptTemplate)
- 会话历史记忆与追溯(使用 Memory 模块)
5.3 项目效果

5.4 代码实现
代码实现


