作者没有四次元口袋的蓝胖日期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检索外部知识理解它们各自解决什么问题才能灵活组合。
