LangChain 经典回顾:ConversationBufferMemory 与 ConversationChain 📅 发布时间:2026/7/11 3:52:37 👁️ 浏览次数: 随着 LangChain 的快速迭代LCEL (LangChain Expression Language) 逐渐成为主流。然而在很多现有的生产系统和教程中我们依然频繁看到经典Legacy组件的身影。本文将带你深入了解 LangChain 最经典的对话组合ConversationBufferMemory与ConversationChain。1. ConversationBufferMemory最纯粹的记忆1.1 什么是 ConversationBufferMemoryConversationBufferMemory是 LangChain 中最基础的记忆组件。它的逻辑非常简单粗暴它把你说过的每一句话、AI 回复的每一句话都原封不动地塞进一个变量里。1.2 工作原理想象一个无限长的记事本用户说“Hi” - 记事本写“Human: Hi”AI 回复“Hello” - 记事本写“AI: Hello”下次对话时LangChain 会把记事本里的所有内容复制粘贴到 Prompt 的{history}位置。1.3 优缺点分析优点无损完全保留了对话的所有细节。简单易于理解和调试。缺点Token 爆炸随着对话变长历史记录会越来越长最终超出 LLM 的 Context Window上下文窗口限制导致报错或费用激增。2. ConversationChain开箱即用的对话链2.1 什么是 ConversationChainConversationChain是一个预封装好的 Chain。它帮你把以下三样东西组装在了一起LLM(大语言模型)Memory(记忆组件)Prompt(提示词模板)你不需要自己写 Prompt Template不需要自己处理history变量注入。它内置了一个默认的 Prompt通常是“The following is a friendly conversation…”。2.2 代码实战让我们通过一个简单的 Python 脚本 (src/examples/memory/demo_conversation_buffer_memory.py) 来演示它们的配合。fromlangchain_classic.memoryimportConversationBufferMemoryfromlangchain_classic.chainsimportConversationChainfromsrc.llm.gemini_chat_modelimportget_gemini_llm# 1. 初始化 Memory# 它负责在内存中维护一个不断增长的字符串memoryConversationBufferMemory()# 2. 初始化 Chain# 自动将 Memory 挂载到 LLM 上conversationConversationChain(llmget_gemini_llm(),memorymemory,verboseTrue# 开启 verbose 可以看到它到底发给了 LLM 什么)# 3. 第一轮对话conversation.predict(inputHi, my name is Alice.)# Memory 更新: Human: Hi, my name is Alice.\nAI: Hello Alice!# 4. 第二轮对话conversation.predict(inputWhat is my name?)# Memory 再次更新...2.3 运行结果解析当我们运行上述代码时ConversationChain会自动构建如下 Prompt 发送给 LLMThe following is a friendly conversation between a human and an AI... Current conversation: Human: Hi, my name is Alice. AI: Hello Alice! Human: What is my name? AI:这就是为什么 AI 能够回答 “Your name is Alice”因为它在 Prompt 里“看到”了之前的对话记录。3. 进阶如何查看记忆内容你可以随时调用load_memory_variables来查看当前 Buffer 里存了什么print(memory.load_memory_variables({}))# 输出:# {history: Human: Hi...\nAI: Hello...}4. 进阶如何限制历史消息上限用户提问ConversationBufferMemory可以限制历史消息的上限吗回答不可以它默认保存所有历史。如果你需要限制历史记录为了节省 Token 或防止 Context Window 溢出你需要切换到它的兄弟组件ConversationBufferWindowMemory: 按轮数限制如只保留最近 5 轮。ConversationTokenBufferMemory: 按 Token 数限制如只保留最近 2000 token。ConversationSummaryMemory: 自动调用 LLM 对旧历史进行摘要总结。5. 进阶如何持久化到数据库用户提问ConversationBufferMemory只能把消息保存到内存吗数据库是否可以回答它可以支持数据库但需要配合chat_memory参数。默认情况下ConversationBufferMemory在内部创建了一个临时的内存列表 (ChatMessageHistory)。一旦程序重启数据就丢失了。如果你想把它保存到数据库如 Redis, Postgres你需要替换掉这个临时的内存列表换成一个连接数据库的 History 对象。代码示例 (伪代码)fromlangchain_community.chat_message_historiesimportRedisChatMessageHistoryfromlangchain_classic.memoryimportConversationBufferMemory# 1. 创建一个连接 Redis 的 History 对象# 这不是普通的 list而是一个读写 Redis 的代理message_historyRedisChatMessageHistory(urlredis://localhost:6379/0,session_idmy-session)# 2. 将这个 History 对象传给 BufferMemory# 此时 Memory 不再把数据存在 RAM 里而是直接读写 RedismemoryConversationBufferMemory(chat_memorymessage_history)# 后续用法完全一样但数据会自动持久化到 RedisconversationConversationChain(llmllm,memorymemory)原理ConversationBufferMemory是一个逻辑层负责把消息格式化为 Prompt而chat_memory是存储层负责物理存取。将存储层替换为数据库实现即可。6. 新旧对比本质区别是什么除了使用方式的不同两者在架构设计上有着本质的区别1. 架构模式实例绑定 (Stateful) vs 动态注入 (Stateless)用户提问ConversationChain不是也可以传入不同的 Memory 吗为什么说它是耦合的回答这里的耦合是指运行时的实例级绑定。ConversationChain (旧)当你初始化chain ConversationChain(memorymem)时这个chain对象就和特定的那份mem对象绑定死了。后果这个chain实例变成了“有状态”的对象。它里面存着“用户A”的聊天记录。你不能把这个chain实例拿去服务“用户B”否则用户B会看到用户A的记录。并发问题在 Web 服务中你必须为每个用户new一个新的 Chain 实例无法通过全局单例复用。RunnableWithMessageHistory (新)它本身不持有任何具体的 Memory 对象。它持有的只是一个工厂函数get_session_history。后果这个 Wrapper 对象是“无状态”的。它不知道也不关心当前在服务谁。动态性每次调用invoke时它才根据传入的config{session_id: B}动态地去工厂里找“用户B”的记录。并发优势你可以创建一个全局单例的runnable让它同时并发服务成千上万个用户完全线程安全。2. 逻辑灵活性硬编码 vs 组合ConversationChain (旧)它的内部逻辑Load - Prompt - LLM - Save是硬编码在 Python 类里的。如果你想在“保存历史”之前加一个“敏感词过滤”步骤你必须继承并重写这个类。RunnableWithMessageHistory (新)它遵循 LCEL 组合原则。内部的 Chain 可以是任意复杂的 DAG有向无环图。你可以在任何环节插入自定义逻辑Wrapper 只负责最外层的历史管理。RunnableWithMessageHistory (新)Chain 对象本身是无状态的。状态记忆并不存在 Chain 对象里而是根据config{session_id: ...}动态加载的。这意味着同一个 Chain 实例可以并发服务成千上万个用户只要 session_id 不同。这是生产环境的高并发神器。对比总结表特性ConversationChain (Legacy)RunnableWithMessageHistory (LCEL)架构模式强耦合单体解耦包装器并发模型有状态(Stateful) - 难以并发无状态(Stateless) - 天然并发灵活性低 (Prompt 固定)高 (Prompt/逻辑完全自定义)流式支持较弱原生支持推荐场景快速原型、本地单人脚本生产级 Web 服务、高并发系统结论如果你正在构建一个多用户的 Web 应用请务必使用RunnableWithMessageHistory。
大数据预处理:自动化数据增强技术解析 大数据预处理进阶:自动化数据增强技术的全解析与实践指南 一、引言:为什么自动化数据增强是大数据时代的「预处理革命」? 清晨9点,数据工程师小张盯着屏幕上的用户行为数据集发呆——这是电商平台上周的1000万条日志,… 2026/7/11 3:51:19
颠覆传统编程:MonkeyCode AI 让 AI 成为工程级研发的核心角色 一、先破认知:它不是 “AI 代码插件”,是研发模式的重构者 市面上多数 AI 编程工具(如 Copilot、Cursor)仅停留在 “代码补全” 层面,而 MonkeyCode AI 的核心定位是企业级 AI 开发基础设施—— 它不做 IDE 里的 “副… 2026/5/17 1:32:19
【课程设计/毕业设计】基于Web的自驾游旅游攻略网站设计与实现基于Java的自驾游攻略查询系统的设计与实现【附源码、数据库、万字文档】 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/8 4:28:13
Unity 2023.2打包PICO4 APK:三大高频错误解析与实战解决方案 1. 项目概述:PICO4开发与Unity打包的“最后一公里”如果你正在为PICO4开发VR应用,那么从Unity编辑器里那个运行流畅的场景,到最终能在头显里安装运行的APK文件,中间往往横亘着一道名为“打包”的鸿沟。这感觉就像精心组装了一台精… 2026/7/11 3:49:59
Re-TRAC框架:用结构化状态表示重塑LLM搜索智能 1. 这不是又一个“更大即更好”的故事,而是对搜索智能本质的重新定义你有没有试过让一个大模型帮你查点东西?比如“2024年诺贝尔物理学奖得主在获奖前最被引用的三篇论文是什么?”——问题一抛出去,模型立刻开始调用搜索工具&… 2026/7/11 3:47:58
一文读懂MFi认证完整申请流程、周期与核心难点 对于苹果配件生产企业而言,MFi认证是产品上市、出海、渠道入驻的必备资质。但很多企业对认证流程一无所知,容易出现申报报错、测试驳回、周期延误、资质失效等问题。 MFi认证不同于普通检测认证,包含会员准入、芯片采购、产品测试、官方审核… 2026/7/11 3:47:58
LV3296与STM32F031C6硬件设计及通信优化实践 1. LV3296与STM32F031C6的硬件架构解析LV3296作为一款工业级二维条码扫描模块,其核心优势在于集成了光学传感器、图像处理芯片和条码解码算法于一体。模块采用3.3V供电,工作电流典型值为120mA,通过8引脚排针引出UART和GPIO接口。在实际项目中… 2026/7/11 3:45:57
8086+8253+8255 Proteus 8.6 电子秒表:0.1秒精度与3按键中断控制实现 808682538255 Proteus 8.6 电子秒表:0.1秒精度与3按键中断控制实现在微机原理与接口技术的学习中,电子秒表是一个经典的综合实验项目。本文将详细介绍如何在Proteus 8.6仿真环境中,使用8086微处理器配合8253定时器和8255并行接口芯片… 2026/7/11 3:45:57
R语言 3种饼图方案对比:基础pie、ggplot2与ggforce的性能与适用场景 R语言三大饼图方案深度评测:从基础pie到ggforce的实战指南引言:为什么需要多种饼图方案?在数据可视化领域,饼图(Pie Chart)始终是一个充满争议但又不可或缺的存在。作为比例展示的经典形式,饼图… 2026/7/11 3:39:55
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08