当前位置: 首页 > article >正文

LangChain Memory 最佳实践:别再用错记忆模块了

上一篇我们把 Memory 的三种策略——截断、总结、检索——从原理到选型梳理了一遍。这篇直接进实战你现在用的 Memory 写法可能已经被官方标注为过时了而且坑还不少。作为开发者最怕的不是不会用而是用错了还不知道——跑起来没报错上线了才发现对话记忆时好时坏Token 开销莫名爆表多用户串话。这篇把最常踩的坑一一拆开附上可运行的正确写法。01 你真的了解 Memory 在 LangChain 里的位置吗很多人把 Memory 当成一个独立的记忆插件插上去就能用。实际上Memory 只做一件事在每次调用时往 Prompt 里塞历史消息。用户输入 ↓ Memory.load_memory_variables() ← 读历史注入 Prompt ↓ LLM 推理 ↓ Memory.save_context() ← 写历史 ↓ 返回输出┌─────────────────────────────────────────────────┐ │ 一次完整对话轮次 │ │ │ │ [用户输入] ──► [Memory读取] ──► [Prompt组装] │ │ │ │ │ ▼ │ │ 历史消息注入模板 │ │ │ │ │ ▼ │ │ [LLM推理] ──► [输出] │ │ │ │ │ ▼ │ │ [Memory写入] ← save_context() │ └─────────────────────────────────────────────────┘理解这个流程很多坑就自然明白了。02 最高频的坑Memory 没有被调用先看一个典型的错误写法importConversationBufferMemoryfromlangchain/memoryimportChatOpenAIfromlangchain/openaiimportLLMChainfromlangchain/chainsimportChatPromptTemplatefromlangchain/core/promptsconstnewConversationBufferMemoryconstnewChatOpenAImodelNamegpt-3.5-turboconstChatPromptTemplatefromMessagessystem你是一个助手。human{input}// ❌ 错误Memory 传了但 Prompt 里没有 {history} 占位符constnewLLMChainawaitcallinput我叫张三awaitcallinput我叫什么名字// 它不记得问题在哪Prompt 里没有{history}占位符历史消息根本没被注入。正确写法importConversationBufferMemoryfromlangchain/memoryimportChatOpenAIfromlangchain/openaiimportLLMChainfromlangchain/chainsimportChatPromptTemplateMessagesPlaceholderfromlangchain/core/promptsconstnewConversationBufferMemoryreturnMessagestrue// 返回消息对象而非字符串memoryKeyhistory// 与 Prompt 占位符名称一致constnewChatOpenAImodelNamegpt-3.5-turbo// ✅ 正确Prompt 里有 MessagesPlaceholderconstChatPromptTemplatefromMessagessystem你是一个助手。newMessagesPlaceholderhistory// ← 必须有这行human{input}constnewLLMChainawaitcallinput我叫张三constawaitcallinput我叫什么名字consolelogtext// 输出你叫张三03 五种 Memory 类型选错了比没有还糟LangChain 提供了 5 种内置 Memory 类型每种定位不同Memory 类型选型图 短对话20轮 ──► ConversationBufferMemory 完整存储所有历史 中等长度对话 ──► ConversationBufferWindowMemory 只保留最近 K 轮 长对话Token受限 ──► ConversationTokenBufferMemory 按 Token 数裁剪 超长对话精度要求高 ──► ConversationSummaryBufferMemory 近期原文 早期摘要 需要语义检索历史 ──► VectorStoreRetrieverMemory 相似度召回历史片段对比一张表类型Token消耗信息损失适合场景BufferMemory随轮次线性增长无短对话 / 原型验证BufferWindowMemory(K10)稳定在~10轮10轮前全丢客服/问答TokenBufferMemory稳定在Token上限按Token裁剪资源敏感场景SummaryBufferMemory中等摘要压缩细节轻微损失长会话助手VectorStoreMemory低按需检索依赖召回精度知识密集型Agent生产环境里90% 的场景用ConversationSummaryBufferMemory就够了。04 ConversationSummaryBufferMemory最被低估的 Memory很多人没用过这个觉得配起来复杂。实际上它才是最接近人类记忆工作方式的设计。原理时间线 ────────────────────────────────────────────► 早期对话 [已压缩为摘要] 近期对话 [保留原文] ┌──────────────────────┐ ┌────────────────────────┐ │ SummaryLLM生成 │ │ Recent Messages Buffer │ │ 用户是张三工程师 │ │ 轮次N-5 到 轮次N │ │ 正在开发RAG系统... │ │ 完整消息对象 │ └──────────────────────┘ └────────────────────────┘ │ │ └──────────── 合并注入 Prompt ──────────────►代码示例importConversationSummaryBufferMemoryfromlangchain/memoryimportChatOpenAIfromlangchain/openaiconstnewChatOpenAImodelNamegpt-3.5-turboconstnewConversationSummaryBufferMemory// ← 用来生成摘要的模型maxTokenLimit2000// ← Token 超过 2000 时开始摘要returnMessagestruememoryKeyhistory// 随着对话增长早期轮次自动被压缩为摘要// Token 始终控制在 maxTokenLimit 附近一个关键细节maxTokenLimit是触发压缩的阈值不是硬上限。实际注入 Prompt 的 Token 可能略超这个值因为摘要本身也有长度。生产里建议设为上下文窗口的30%给用户输入和输出各留足空间。05 多用户场景的致命坑Memory 实例共享这个坑在测试环境不会出现生产一上就串话。// ❌ 危险全局单例 Memory所有用户共用同一个历史constnewConversationBufferMemorypost/chatasyncconstnewLLMChainmemoryconstawaitcallinputbodymessagejsonreplytext// 用户A的历史混入了用户B的对话正确做法每个 session 对应独立的 Memory 实例。importConversationSummaryBufferMemoryfromlangchain/memoryimportChatOpenAIfromlangchain/openai// ✅ 用 Map 按 sessionId 隔离 MemoryconstnewMapstringConversationSummaryBufferMemoryfunctiongetMemorysessionId: stringConversationSummaryBufferMemoryifhassetnewConversationSummaryBufferMemoryllmnewChatOpenAImodelNamegpt-3.5-turbomaxTokenLimit2000returnMessagestruememoryKeyhistoryreturngetpost/chatasyncconstbodyconstgetMemory// ← 按用户隔离constnewLLMChainconstawaitcallinputjsonreplytext生产里还要加过期清理否则memoryStore会无限增长// 简单 TTL 清理30分钟无活动则释放constnewMapstringnumbersetInterval() constDatenowforconstofif30601000deletedelete5601000// 每5分钟扫一次06 新版写法RunnableWithMessageHistoryLCEL 推荐方式LangChain v0.3 之后官方推荐用RunnableWithMessageHistory替代旧的 Memory Chain 写法。区别在哪旧方式Memory LLMChain Memory 对象内嵌到 Chain 中耦合紧难复用 新方式RunnableWithMessageHistory LCEL 历史管理与 Chain 逻辑分离sessionId 驱动更清晰新写法示例importChatOpenAIfromlangchain/openaiimportChatPromptTemplateMessagesPlaceholderfromlangchain/core/promptsimportRunnableWithMessageHistoryfromlangchain/core/runnablesimportInMemoryChatMessageHistoryfromlangchain/core/chat_historyconstnewChatOpenAImodelNamegpt-3.5-turboconstChatPromptTemplatefromMessagessystem你是一个助手。newMessagesPlaceholderhistoryhuman{input}constpipe// 历史存储按 sessionId 隔离conststoreRecordstringInMemoryChatMessageHistoryfunctiongetHistorysessionId: stringifnewInMemoryChatMessageHistoryreturn// ✅ 用 RunnableWithMessageHistory 包装constnewRunnableWithMessageHistoryrunnablegetMessageHistoryinputMessagesKeyinputhistoryMessagesKeyhistory// 调用时传入 sessionIdconstawaitinvokeinput我叫张三configurablesessionIduser-123// ← 关键这套写法和 LangGraph 的 Checkpoint 机制无缝衔接如果你在用 LangGraph直接用它的持久化方案就好不需要额外引 Memory 模块。07 生产环境自查清单上线前对照这份清单检查一遍Memory 生产上线自查 □ Prompt 里有 MessagesPlaceholder / {history} 占位符 □ Memory 实例按 sessionId 隔离没有全局单例 □ 设置了 maxTokenLimit建议上下文窗口的 30% □ SummaryBufferMemory 的 llm 参数已指定 □ 多进程/多实例部署时Memory 用了外部存储Redis/DB □ 有 TTL 清理机制防止 Map/内存无限增长 □ 测试过 20 轮对话摘要压缩后语义未丢失 □ 多用户并发测试确认不串话一个容易忽视的点在多进程/K8s 部署时内存里的 Map 各进程不共享。这时候需要用外部存储importRedisChatMessageHistoryfromlangchain/redis// ✅ 生产多实例部署用 Redis 存历史functiongetHistorysessionId: stringreturnnewRedisChatMessageHistoryclientttl1800// 30 分钟过期学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关文章:

LangChain Memory 最佳实践:别再用错记忆模块了

上一篇我们把 Memory 的三种策略——截断、总结、检索——从原理到选型梳理了一遍。这篇直接进实战:你现在用的 Memory 写法,可能已经被官方标注为"过时"了,而且坑还不少。 作为开发者,最怕的不是不会用,而…...

《Windows Internals》10.2.20 学习笔记:触发启动服务——为什么有些服务不是“开机就启动”,而是“等条件到了再启动”?

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

《Windows Internals》10.2.17 学习笔记:服务启动流程(Service start)——为什么“启动一个服务”看起来只是一瞬间,背后却是一整条从 SCM 到 Running 的完

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

Foundation Sites无障碍访问支持:构建符合WCAG标准的现代网站终极指南

Foundation Sites无障碍访问支持:构建符合WCAG标准的现代网站终极指南 【免费下载链接】foundation-sites The most advanced responsive front-end framework in the world. Quickly create prototypes and production code for sites that work on any kind of de…...

从Hugging Face到本地:一份给open_clip新手的模型下载与加载完整指南

从Hugging Face到本地:open_clip模型下载与加载实战手册 第一次接触open_clip时,面对Hugging Face上琳琅满目的模型文件和晦涩的报错信息,我完全迷失了方向。经过多次尝试和失败,终于摸索出一套可靠的模型获取与加载方法。本文将分…...

双机械臂视觉规划与协同控制关键技术解析

1. 双机械臂操作的核心挑战与视觉规划价值在工业自动化和服务机器人领域,双机械臂系统正逐渐成为复杂操作任务的首选方案。与单臂系统相比,双臂协同能够模拟人类双手协作的能力,完成诸如物体搬运、精密装配、柔性物料处理等任务。然而&#x…...

AI Agent可观测性实战:agentlytics框架集成与生产部署指南

1. 项目概述:一个面向AI Agent的轻量级可观测性框架最近在折腾AI Agent应用开发的朋友,估计都遇到过类似的困扰:Agent的执行链路像个黑盒,一个请求进去,半天没反应,你根本不知道它卡在哪个环节了&#xff0…...

强化学习合成环境验证方法与工程实践

1. 项目背景与核心挑战在强化学习领域,训练环境的真实性直接决定了智能体的最终表现。传统方法通常依赖真实环境或高保真模拟器,但这往往面临成本高、迭代慢的瓶颈。合成环境(Synthetic Environment)通过算法生成具有关键特征的人…...

从Word模板到动态报表:手把手教你用poi-tl搞定Java后端Word导出(含多表格循环与合并)

从Word模板到动态报表:手把手教你用poi-tl搞定Java后端Word导出(含多表格循环与合并) 在企业管理系统中,自动生成标准化文档一直是开发中的痛点。想象一下人力资源部门每月需要手动处理上百份员工绩效报告,财务团队反…...

Rswag高级测试技巧:如何验证复杂响应模式和oneOf/anyOf/allOf架构

Rswag高级测试技巧:如何验证复杂响应模式和oneOf/anyOf/allOf架构 【免费下载链接】rswag Seamlessly adds a Swagger to Rails-based APIs 项目地址: https://gitcode.com/gh_mirrors/rs/rswag Rswag是一个为Rails API无缝添加Swagger文档的强大工具&#x…...

技能探针:自动化代码分析工具的设计、实现与应用

1. 项目概述:技能探针的诞生与核心价值在技术团队协作与个人能力成长的日常中,我们常常面临一个看似简单却异常棘手的问题:如何快速、准确地评估一个项目或一个开发者所具备的技术栈深度与广度?传统的简历筛选、面试问答&#xff…...

如何用DeepFilterNet实现专业级语音降噪:从入门到实战的完整指南

如何用DeepFilterNet实现专业级语音降噪:从入门到实战的完整指南 【免费下载链接】DeepFilterNet Noise supression using deep filtering 项目地址: https://gitcode.com/GitHub_Trending/de/DeepFilterNet 在远程会议、在线教学、内容创作等场景中&#xf…...

GESP学习考试必读((二)、《专治粗心的10道训练题》)

&#x1f31f;《专治粗心的10道训练题》&#x1f9e9; 第1关&#xff1a;数组下标陷阱1、&#x1f3af; 题目输入 n 个数&#xff0c;求它们的和2、❌ 常见错误代码int sum 0; for(int i 1; i < n; i) {sum a[i]; }3、&#x1f4a5; 问题在哪&#xff1f;&#x1f449; 数…...

抖音内容高效管理方案:去水印批量下载与数据分析实战指南

抖音内容高效管理方案&#xff1a;去水印批量下载与数据分析实战指南 【免费下载链接】TikTokDownload 抖音去水印批量下载用户主页作品、喜欢、收藏、图文、音频 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokDownload 面对海量抖音优质内容&#xff0c;你是否曾…...

如何快速制作启动盘:Rufus文件系统遍历技术解析与实战指南

如何快速制作启动盘&#xff1a;Rufus文件系统遍历技术解析与实战指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus Rufus是一款功能强大的开源USB格式化工具&#xff08;The Reliable USB For…...

题解:洛谷 B2111 基因相关性

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

GameClaw:开源游戏服务器自动化部署与运维实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫oratis/gameclaw。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你是一个游戏开发者&#xff0c;或者对游戏服务器管理、自动化运维有需求&#xff0c;那这个工具很可能就是你一直在找…...

代码碳问责:软件测试从业者的专业视角

在数字经济浪潮席卷全球的当下&#xff0c;软件已渗透至社会运转的每个角落。然而&#xff0c;伴随着每一次代码提交、每一次服务调用、每一次测试运行&#xff0c;无形的碳足迹也在悄然累积。过去&#xff0c;软件行业的焦点往往局限于功能、性能与安全&#xff0c;而环境影响…...

【国家高层次人才报告、ACM出版、湖北工业大学主办】2026年人工智能与生成式设计国际学术会议(ICAIGD 2026)

2026年人工智能与生成式设计国际学术会议&#xff08;ICAIGD 2026&#xff09;将于2026年5月15日至17日在中国武汉举行。本次会议是2026年智能设计与计算国际学术会议&#xff08;IC-IDC 2026&#xff09;下属分会&#xff0c;由湖北科技大学主办&#xff0c;旨在为全球人工智能…...

从崩溃到修复:深入解析egui在iOS平台的Color32颜色转换堆栈溢出问题

从崩溃到修复&#xff1a;深入解析egui在iOS平台的Color32颜色转换堆栈溢出问题 【免费下载链接】egui egui: an easy-to-use immediate mode GUI in Rust that runs on both web and native 项目地址: https://gitcode.com/GitHub_Trending/eg/egui egui是一款用Rust编…...

FlicFlac音频转换工具深度解析:轻量级架构与企业级应用实践

FlicFlac音频转换工具深度解析&#xff1a;轻量级架构与企业级应用实践 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac FlicFlac作为一款轻量级便携式Wi…...

用echo和》、》》重定向操作快速创建或追加文件内容

在Linux和Unix系统中&#xff0c;命令行操作的高效性一直是开发者喜爱的特点之一。其中&#xff0c;echo命令结合重定向操作符>和>>&#xff0c;能够快速创建或追加文件内容&#xff0c;无需打开文本编辑器即可完成简单任务。无论是编写脚本、记录日志&#xff0c;还是…...

华为交换机实战:用MSTP+VRRP+DHCP+Eth-Trunk+BFD搭建一个高可用企业网(附配置清单)

华为交换机高可用企业网实战&#xff1a;MSTPVRRPDHCPEth-TrunkBFD全栈部署指南 当财务部的报销系统突然无法访问&#xff0c;而市场部的视频会议却流畅如常时&#xff0c;网络工程师才真正体会到分层冗余设计的价值。本文将以某科技园区网络改造项目为蓝本&#xff0c;详解如何…...

AI图像理解的自我调用机制与思维链技术

1. 项目概述这个项目探索了一种让AI系统通过自我调用机制来处理和理解图像的新方法。不同于传统的图像识别流程&#xff0c;我们尝试构建一个能够主动"思考"图像内容的AI框架&#xff0c;通过递归式的自我调用不断深化对图像的理解。我在计算机视觉领域工作多年&…...

Windows触控板驱动终极指南:让苹果触控板在Windows上完美运行

Windows触控板驱动终极指南&#xff1a;让苹果触控板在Windows上完美运行 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touc…...

别光调Nginx超时!一次由域名解析端口错误引发的Java应用504 Gateway Timeout排查实录

从域名解析到防火墙&#xff1a;一次Java应用504错误的深度排查之旅 当你的Java应用在生产环境突然开始报504 Gateway Timeout错误&#xff0c;而测试环境一切正常时&#xff0c;大多数开发者会本能地检查Nginx超时配置。但今天我要分享的这个案例&#xff0c;将带你跳出常规思…...

sofa-pbrpc流量控制与超时管理:构建稳定分布式系统的10个技巧

sofa-pbrpc流量控制与超时管理&#xff1a;构建稳定分布式系统的10个技巧 【免费下载链接】sofa-pbrpc A light-weight RPC implement of google protobuf RPC framework. 项目地址: https://gitcode.com/gh_mirrors/so/sofa-pbrpc sofa-pbrpc是一个轻量级的Google Prot…...

Scouter与第三方UI集成:Scouter Paper展示与分析

Scouter与第三方UI集成&#xff1a;Scouter Paper展示与分析 【免费下载链接】scouter Scouter is an open source APM (Application Performance Management) tool. 项目地址: https://gitcode.com/gh_mirrors/sc/scouter Scouter是一款开源的应用性能管理&#xff08;…...

C语言核心知识完全回顾:从数据类型到动态内存管理

引言 C语言是一门古老而强大的编程语言&#xff0c;它诞生于1972年&#xff0c;至今仍是计算机科学教育的重要基石。无论是操作系统、嵌入式系统&#xff0c;还是游戏开发&#xff0c;C语言都扮演着不可或缺的角色。 在学习C语言的过程中&#xff0c;最深的体会是&#xff1a…...

终极突破:howler.js空间音频完全指南

终极突破&#xff1a;howler.js空间音频完全指南 【免费下载链接】howler.js Javascript audio library for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ho/howler.js howler.js是一款专为现代Web设计的JavaScript音频库&#xff0c;其空间音频功能为开…...