作者没有四次元口袋的蓝胖日期2026-09-26标签LangChain, Memory, RAG, AI应用开发LangChain知识梳理(3)前面两篇我们搞定了模型调用、Prompt模板、输出解析、LCEL链式调用这些原子组件。这篇我们聚焦两个让 LangChain 从工具变成应用的关键模块Memory记忆模块和RAG检索增强生成。Memory 解决的是模型记不住之前聊了什么的问题RAG 解决的是模型不知道外部知识的问题。这两个模块是当前 AI 应用开发中最核心的架构组件也是面试的高频考点。一、Memory记忆模块1.1 为什么需要Memory大模型本身是无状态的——每次调用都是独立的模型不记得之前聊了什么。但实际对话应用需要上下文记忆。Memory 模块就是用来给 Chain 加上记忆能力的。# 没有Memory的情况每次都是独立对话chainprompt|chat|output_parser result1chain.invoke({input:我叫蓝胖})result2chain.invoke({input:我叫什么名字})# 模型不知道因为没有上下文1.2 ConversationBufferMemory最基础的记忆方式——把所有历史消息原封不动地存下来fromlangchain.memoryimportConversationBufferMemory# 创建MemorymemoryConversationBufferMemory(memory_keychat_history,# 在模板中引用的变量名return_messagesTrue# 返回Message对象用于ChatModel)# 手动添加对话记录memory.save_context({input:我叫蓝胖是一名Java应届生},{output:你好蓝胖很高兴认识你有什么可以帮你的})memory.save_context({input:帮我解释一下Spring的IoC},{output:IoC控制反转是Spring的核心思想...})# 查看记忆中的内容print(memory.load_memory_variables({}))# {chat_history: [HumanMessage(content我叫蓝胖...), AIMessage(content你好蓝胖...), ...]}# 配合Chain使用fromlangchain.chainsimportConversationChain conversationConversationChain(llmChatOpenAI(modelgpt-4),memoryConversationBufferMemory(return_messagesTrue),verboseTrue# 打印中间过程)# 多轮对话模型能记住之前的内容conversation.predict(input我叫蓝胖正在准备Java秋招)conversation.predict(input你还记得我叫什么吗)# 记得你叫蓝胖conversation.predict(input我的目标是什么)# 准备Java秋招1.3 ConversationBufferWindowMemoryBufferMemory 的问题是对话越来越长Token越来越多。WindowMemory 只保留最近 K 轮对话fromlangchain.memoryimportConversationBufferWindowMemory# 只保留最近2轮对话1轮1次userassistantmemoryConversationBufferWindowMemory(k2,return_messagesTrue)memory.save_context({input:第1轮问题},{output:第1轮回答})memory.save_context({input:第2轮问题},{output:第2轮回答})memory.save_context({input:第3轮问题},{output:第3轮回答})# 此时只有第2轮和第3轮的消息第1轮已被丢弃chat_historymemory.load_memory_variables({})[chat_history]print(len(chat_history))# 4条消息2轮 × 2条1.4 ConversationSummaryMemory对话太长时另一种策略是让模型把历史对话压缩成摘要fromlangchain.memoryimportConversationSummaryMemory# 用模型来生成对话摘要memoryConversationSummaryMemory(llmChatOpenAI(modelgpt-4,temperature0),return_messagesTrue)# 添加大量对话后Memory中存储的不是原始对话而是摘要# 优点Token消耗可控# 缺点摘要过程消耗额外Token可能丢失细节1.5 各种Memory对比Memory类型策略优点缺点Buffer全量保存不丢失信息Token无限增长BufferWindow保留最近K轮Token可控丢失早期上下文Summary摘要压缩Token可控保留全局信息丢失细节额外消耗Combined组合策略兼顾各方复杂度高1.6 面试要点Memory 的核心问题是如何在有限的Token窗口内保留有用的上下文。面试时能说清 Buffer/Window/Summary 三种策略的优缺点和适用场景就够了。实际生产中长对话场景通常用 Summary 或 Window 外部存储的组合方案。二、RAG流程原理2.1 为什么需要RAG大模型有两个核心问题知识截止训练数据有时间截止点不知道最新信息幻觉问题会编造看起来合理但实际错误的内容RAGRetrieval-Augmented Generation检索增强生成的核心思路先检索再回答——从外部知识库中检索相关文档把检索到的内容塞进Prompt里让模型基于真实资料回答。用户提问 ↓ ┌──────────────┐ │ 检索知识库 │ ← 从文档/数据库中找相关内容 └──────────────┘ ↓ 检索到的相关文档片段 ┌──────────────┐ │ 拼接Prompt │ ← 问题 参考资料 → 送入大模型 └──────────────┘ ↓ ┌──────────────┐ │ LLM生成回答 │ ← 基于检索到的资料回答而非凭空编造 └──────────────┘ ↓ 最终回答有据可查2.2 RAG的完整流程阶段一离线索引做一次就行 ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 加载文档 │ → │ 文本切分 │ → │ 向量化 │ → │ 存入向量库 │ │ (PDF/网页)│ │(Splitter) │ │(Embedding)│ │ (FAISS等) │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ 阶段二在线问答每次用户提问时执行 ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 用户提问 │ → │ 问题向量化 │ → │ 相似度检索 │ → │ 拼接Prompt│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ↓ ┌──────────┐ │ LLM回答 │ └──────────┘2.3 用LangChain实现RAG的核心代码概要# 下面只展示核心流程具体细节在下一篇RAG实战中展开# 阶段一离线索引 fromlangchain.document_loadersimportTextLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.vectorstoresimportFAISS# 1. 加载文档loaderTextLoader(java_interview.md)docsloader.load()# 2. 切分文档splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)chunkssplitter.split_documents(docs)# 3. 向量化并存入数据库embeddingsOpenAIEmbeddings()vectorstoreFAISS.from_documents(chunks,embeddings)# 阶段二在线问答 # 4. 检索相关文档queryHashMap和ConcurrentHashMap的区别relevant_docsvectorstore.similarity_search(query,k3)# 5. 拼接Promptcontext\n.join([doc.page_contentfordocinrelevant_docs])promptf基于以下资料回答问题如果资料中没有相关信息请说明。 资料{context}问题{query}回答# 6. 调用LLM回答resultchat.invoke(prompt)print(result.content)2.4 RAG的核心价值问题传统LLMRAG知识时效性受限于训练数据随时更新知识库幻觉问题容易编造基于真实文档可溯源领域知识泛化知识可接入私有文档成本需要微调只需检索无需训练2.5 面试要点RAG 是当前面试中最热门的 AI 应用架构之一。重点理解为什么需要 RAG知识截止 幻觉两阶段流程离线索引 在线问答核心组件文档切分 → Embedding → 向量数据库 → 检索 → Prompt拼接 → LLM具体的代码实现和优化策略在下一篇 RAG 实战中详细展开。️ 思维导图速览LangChain 进阶 ├── Memory记忆模块 │ ├── 核心问题模型无状态需要上下文记忆 │ ├── BufferMemory全量保存信息完整但Token爆炸 │ ├── BufferWindowMemory保留最近K轮Token可控但丢早期 │ ├── SummaryMemory摘要压缩Token可控但丢细节 │ └── 实际生产Summary 或 Window 外部存储组合 └── RAG原理 ├── 动机知识截止 幻觉问题 ├── 离线索引加载 → 切分 → 向量化 → 存入向量库 ├── 在线问答检索 → 拼接Prompt → LLM回答 └── 核心价值知识可更新、可溯源、低成本、支持私有数据 写在最后学习建议Memory 重在理解三种策略的取舍实际开发中不需要记住每种 Memory 的 API但需要知道对话变长了怎么办以及不同方案的优劣。RAG 是面试重灾区原理部分要能脱口而出——为什么需要、两阶段流程、核心组件。面试官很可能追问如果检索效果不好怎么办这时可以从切分策略、Embedding模型选择、重排序等角度回答。Memory RAG 可以结合使用一个完整的 AI 应用通常同时需要 Memory记住对话上下文和 RAG检索外部知识理解它们各自解决什么问题才能灵活组合。
企业数字化 ERP 产品动态
相关推荐
TensorRT、.pth/.pt 与 ONNX 模型格式区别与联系:从训练权重到推理引擎的完整链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:57:51
mini-swe-agent 实战指南:在 SWE-bench 基准上批量运行与单实例调试 人工智能大模型AI Agent代码智能体 【免费下载链接】mini-swe-agent The 100 line AI agent that solves GitHub issues or helps you in your command line. Radically simple, no huge configs, no giant monorepo—but scores >74% on SWE-bench verified! 项目地址&… · 2026/9/27 21:57:51
一物一码系统能不能自动判断质保状态和维修历史? 一物一码系统能不能自动判断质保状态和维修历史?
太长不看版
一物一码系统可以支持质保状态判断和维修历史查询,但不是“贴上二维码就自动完成”。它需要同时具备四类数据:单品身份码、质保规则、销售或激活时间、售后工单记录。
如果这些数据… · 2026/9/27 21:57:45
wordpressgoogle360完整流程:拒绝拖延,7天上线实战 wordpressgoogle360完整流程:拒绝拖延,7天上线实战 改个需求建站公司拖一周,这种憋屈事你是不是也干过?别急着骂人,很多时候不是他们懒,而是沟通链路太长,技术债务太高,导致一个简单的修改变成了“牵一发动全身”的灾难。… · 2026/9/27 22:37:16
Python变量基础知识 1.究竟什么是变量这个东西呢。所谓的变量, 是指在程序运行的期间, 它所对应的数值是可以发生改变的, 这种量就叫作变量。举个例子来说, 在数学的领域里面, x和y这两个东西本身就是被称为变量的存在的。但是中间存在着不同的是, 变量它可不仅仅是仅仅用来进行存储数字的这种简单… · 2026/9/27 22:37:16
万字详解让大模型写出好代码:上下文窗口的工程化实践与 TaoToken 配置骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:37:04
什么网站做私人空间好免费工具一文搞懂建站避坑 什么网站做私人空间好免费工具一文搞懂建站避坑 网站做好了没人访问,这种憋屈感谁做站谁懂。你熬夜调像素、改代码,结果上线一周后台访客只有你自己和几个蜘蛛。别急着骂平台算法,很多时候问题出在你压根没搞懂 什么网站做私人空间好… · 2026/9/27 22:37:04
前端重构总怕“改了这里乱了那里”?用 TaoToken 统一 Key 把 AI 工具串起来稳住阵脚 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:37:04
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01