
文章介绍了如何基于LangGraph框架为AI助手添加知识库(RAG)和长期记忆两大核心能力。通过检索增强生成技术AI能从特定文档中查找答案通过长期记忆系统AI能记住跨会话的对话历史。文章详细提供了实现步骤、代码示例和最佳实践帮助开发者构建真正智能的文档助手解决AI一问三不知和金鱼记忆的问题。你的AI助手总是“一问三不知”今天我们要给它装上知识库和长期记忆让它真正成为你的得力伙伴你是否遇到过这样的尴尬场景向AI询问公司内部文档的内容它却回答“我不知道”与AI进行多轮对话后重启程序之前的对话历史全部丢失每次都要向AI重复背景信息感觉像是在跟金鱼聊天如果你也有这些烦恼那么今天这篇文章就是为你准备的我们将基于LangGraph为智能体添加两大核心能力**检索增强生成RAG**和长期记忆。学完本文你的AI助手将能够从指定文档中查找答案不再局限于预训练知识记住跨会话的对话历史实现真正的连续对话一、什么是RAG与长期记忆在深入代码之前让我们快速理解这两个核心概念RAG检索增强生成想象一下你有一个超级聪明的助手但它的知识只停留在某个时间点。RAG就像给了它一个智能书架当用户提问时助手先快速浏览书架上的相关书籍检索然后结合自己的知识回答问题生成。传统AI的局限性# 传统方式只依赖预训练知识 user_question 我们公司最新的报销政策是什么 # AI: 抱歉我不知道你们公司的具体政策...RAG的优势# RAG方式结合文档知识 user_question 我们公司最新的报销政策是什么 # 1. 从公司文档库中检索相关政策文档 # 2. 基于检索到的文档生成答案 # AI: 根据2024年3月发布的《费用报销管理办法》第5条...长期记忆如果说短期记忆是对话中记住上下文那么长期记忆就是记住不同会话间的对话历史。这就像给AI装了一个“记忆宫殿”让它能记住昨天、上周甚至上个月的对话内容。二、为LangGraph智能体添加RAG能力让我们一步步构建一个能理解特定文档的智能助手。我们将以React Native ExecuTorch文档为例让AI学会回答相关技术问题。步骤1加载和分割文档首先我们需要获取文档内容并将其分割成适合处理的“知识块”from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # 1. 加载文档 - 这里以React Native ExecuTorch文档为例 loader WebBaseLoader(https://docs.swmansion.com/react-native-executorch/) docs loader.load() print(f加载了 {len(docs)} 个文档总字符数{len(docs[0].page_content)}) # 2. 分割文档 - 就像把长文章切成便于查找的小卡片 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块约1000字符 chunk_overlap200# 块之间重叠200字符避免信息割裂 ) all_splits text_splitter.split_documents(docs) print(f分割成 {len(all_splits)} 个文本块)关键点解释chunk_size1000每个文本块约1000字符既不会太碎片化也不会太冗长chunk_overlap200相邻块重叠200字符确保相关信息不会因为恰好跨块而被割裂步骤2创建向量数据库现在我们需要一个能快速查找相关文本的“书架”from langchain_core.vectorstores import InMemoryVectorStore from langchain_huggingface import HuggingFaceEmbeddings # 1. 选择嵌入模型 - 这相当于文档的指纹生成器 # all-MiniLM-L6-v2是一个轻量级但效果不错的模型 embeddings HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2 ) # 2. 创建向量存储 - 我们的智能书架 vector_store InMemoryVectorStore(embeddings) # 3. 将文本块添加到书架 _ vector_store.add_documents(documentsall_splits) print(向量数据库准备就绪)什么是嵌入Embedding简单来说嵌入就是将文本转换成数学向量的过程。相似的文本会有相似的向量表示这样我们就能通过数学计算找到语义上相关的文档。步骤3改造提问函数集成RAG现在让我们的智能体学会先查资料再回答from langchain_core.messages import HumanMessage, AIMessage def ask_llm_with_rag(state): 增强版提问函数先检索后生成 user_query input(请输入您的问题: ) # 1. 检索相关文档 - 从书架上找到最相关的卡片 retrieved_docs vector_store.similarity_search(user_query, k3) print(f检索到 {len(retrieved_docs)} 个相关文档片段) # 2. 构建上下文 context \n\n---\n\n.join([doc.page_content for doc in retrieved_docs]) # 3. 构建增强提示 user_message HumanMessage( f请基于以下上下文回答问题。如果上下文不包含相关信息请诚实地说不知道。 上下文 {context} 用户问题 {user_query} 请提供准确、有用的回答 ) # 4. 调用模型生成回答 answer_message model.invoke( state[messages] [user_message] ) # 5. 打印并保存结果 print(f\n AI回答: {answer_message.content}\n) return { messages: [user_message, answer_message], } # 小练习尝试添加一个中间步骤让AI先根据查询和上下文生成优化的提示再回答步骤4完整代码示例让我们看看完整的RAG集成代码# 完整代码带RAG的LangGraph智能体 from typing import TypedDict, List from langchain_core.messages import BaseMessage from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI import os # 设置OpenAI API密钥请替换为你的密钥 os.environ[OPENAI_API_KEY] your-api-key-here # 定义状态结构 class State(TypedDict): messages: List[BaseMessage] iteration: int # 初始化模型 model ChatOpenAI(modelgpt-3.5-turbo) # 构建图 graph_builder StateGraph(State) # 添加节点 graph_builder.add_node(ask, ask_llm_with_rag) # 设置入口点 graph_builder.set_entry_point(ask) graph_builder.add_edge(ask, END) # 编译图 graph graph_builder.compile() # 测试RAG功能 initial_state {messages: [], iteration: 0} result graph.invoke(initial_state) print( * 50) print(测试问题1: React Native ExecuTorch是什么) print( * 50)实际运行效果请输入您的问题: React Native ExecuTorch是什么 检索到 3 个相关文档片段 AI回答: React Native ExecuTorch是一个为React Native生态系统量身定制的设备端AI和大语言模型工具包。它基于Meta的ExecuTorch AI框架允许开发者在移动设备上本地运行AI模型和LLM。主要特点包括 1. 设备端模型执行AI模型直接在设备上运行保护用户隐私无需外部API调用 2. 成本效益减少对云基础设施的依赖降低服务器成本和延迟 3. 隐私优先数据完全保留在设备上 4. 开发者友好提供声明式API无需深厚的AI专业知识 5. 属于PyTorch Edge生态系统三、为智能体添加长期记忆现在让我们解决第二个痛点如何让AI记住跨会话的对话步骤1设置记忆存储系统from langgraph.checkpoint.memory import InMemorySaver from langgraph.store.memory import InMemoryStore # 1. 创建检查点保存器 - 保存单个对话状态 checkpointer InMemorySaver() # 2. 创建存储 - 跨线程/会话存储状态 store InMemoryStore() # 3. 编译时集成记忆系统 workflow graph.compile( checkpointercheckpointer, # 记住每次对话的状态 storestore # 跨会话记忆 )步骤2使用会话ID管理对话# 为每个对话会话设置唯一ID config { recursion_limit: 100, configurable: { thread_id: user_123_session_1# 实际中可以使用用户ID时间戳 } } # 第一次对话 print( 第一次对话 ) workflow.invoke( {messages: [], iteration: 0}, configconfig, ) # 获取当前对话状态 current_state workflow.get_state(config) print(f当前对话轮次: {current_state.values[iteration]}) # 第二次对话延续上次 print(\n 第二次对话延续上次) workflow.invoke( current_state, configconfig, # 相同的thread_idAI会记得上次对话 )步骤3实现真正的长期记忆在实际应用中我们通常需要更复杂的记忆管理。这里是一个增强版示例import json from datetime import datetime class LongTermMemoryManager: 长期记忆管理器 def __init__(self, storage_pathmemory_storage.json): self.storage_path storage_path self.memories self.load_memories() def load_memories(self): 加载历史记忆 try: with open(self.storage_path, r, encodingutf-8) as f: return json.load(f) except FileNotFoundError: return {} def save_memory(self, user_id, conversation_summary, key_points): 保存重要对话记忆 if user_id notin self.memories: self.memories[user_id] [] memory_entry { timestamp: datetime.now().isoformat(), summary: conversation_summary, key_points: key_points } self.memories[user_id].append(memory_entry) # 保持最近50条记忆 if len(self.memories[user_id]) 50: self.memories[user_id] self.memories[user_id][-50:] self.save_to_disk() def save_to_disk(self): 保存到文件 with open(self.storage_path, w, encodingutf-8) as f: json.dump(self.memories, f, ensure_asciiFalse, indent2) def get_user_memories(self, user_id, limit5): 获取用户最近记忆 return self.memories.get(user_id, [])[-limit:] # 使用示例 memory_manager LongTermMemoryManager() # 对话结束时保存记忆 def end_conversation_and_save(user_id, messages): 结束对话并保存重要信息 # 让AI总结对话要点 summary_prompt f请总结以下对话的要点 对话记录 {messages} 请提取 1. 讨论的核心话题 2. 重要的决策或结论 3. 需要后续跟进的事项 总结 # 调用AI生成总结 summary model.invoke(summary_prompt) # 保存到长期记忆 memory_manager.save_memory( user_iduser_id, conversation_summarysummary.content, key_points[技术讨论, React Native ExecuTorch] # 实际中可以让AI提取 ) return summary.content四、完整项目智能文档助手让我们把RAG和长期记忆结合起来创建一个真正的智能文档助手class SmartDocumentAssistant: 智能文档助手RAG 长期记忆 def __init__(self, document_url): # 初始化组件 self.vector_store self.setup_rag(document_url) self.memory_manager LongTermMemoryManager() self.model ChatOpenAI(modelgpt-3.5-turbo) # 构建对话图 self.workflow self.build_workflow() def setup_rag(self, document_url): 设置RAG系统 # 加载和分割文档 loader WebBaseLoader(document_url) docs loader.load() text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) all_splits text_splitter.split_documents(docs) # 创建向量存储 embeddings HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2 ) vector_store InMemoryVectorStore(embeddings) vector_store.add_documents(documentsall_splits) return vector_store def build_workflow(self): 构建工作流 graph_builder StateGraph(State) # 添加增强的提问节点 graph_builder.add_node(smart_ask, self.smart_ask_with_memory) graph_builder.set_entry_point(smart_ask) graph_builder.add_edge(smart_ask, END) # 编译带记忆的工作流 return graph_builder.compile( checkpointerInMemorySaver(), storeInMemoryStore() ) def smart_ask_with_memory(self, state: State) - State: 智能提问RAG 记忆 user_id current_user# 实际中从用户登录获取 # 1. 获取用户历史记忆 past_memories self.memory_manager.get_user_memories(user_id) memory_context if past_memories: memory_context \n\n之前的对话要点\n for mem in past_memories: memory_context f- {mem[summary][:100]}...\n # 2. 获取用户问题 user_query input(\n 你的问题: ) # 3. RAG检索 retrieved_docs self.vector_store.similarity_search(user_query, k3) rag_context \n\n.join([doc.page_content for doc in retrieved_docs]) # 4. 构建综合提示 prompt f{memory_context} 相关文档内容 {rag_context} 用户当前问题 {user_query} 请基于以上信息回答问题。如果文档中没有相关信息请说明。 # 5. 调用AI response self.model.invoke(prompt) print(f\n 助手: {response.content}) # 6. 检查是否需要保存到长期记忆 if 重要in user_query or 记住 in user_query: print((已将此对话标记为重要会长期记住)) # 实际中可以让AI判断重要性 return {messages: [{role: user, content: user_query}, {role: assistant, content: response.content}]} def chat(self, user_iddefault_user): 启动对话 config { recursion_limit: 50, configurable: {thread_id: user_id} } print( * 60) print(智能文档助手已启动) print(我可以1. 回答文档相关问题 2. 记住我们的重要对话) print(输入 退出 结束对话) print( * 60) # 开始对话 self.workflow.invoke( {messages: [], iteration: 0}, configconfig ) # 使用示例 if __name__ __main__: # 创建助手基于React Native ExecuTorch文档 assistant SmartDocumentAssistant( https://docs.swmansion.com/react-native-execuTorch/ ) # 开始对话 assistant.chat(user_001)五、避坑指南与最佳实践在实现RAG和长期记忆时注意以下常见问题RAG常见问题检索不准确❌ 问题返回无关文档片段✅ 解决调整chunk_size优化嵌入模型添加元数据过滤上下文过长❌ 问题提示超过token限制✅ 解决使用摘要、选择性检索或分页检索长期记忆最佳实践记忆总结策略定期总结对话而不是存储所有消息按话题分类存储记忆隐私考虑明确告知用户什么信息会被记住提供清除记忆的选项写在最后通过今天的学习我们已经成功为LangGraph智能体装上了两大超能力RAG让它能够从特定文档中查找答案长期记忆让它能够记住跨会话的对话历史。关键收获RAG不是替换而是增强它让AI在自身知识基础上增加了查阅外部文档的能力记忆需要管理不是所有对话都值得记住智能的记忆总结比存储原始对话更重要LangGraph提供了优雅的架构通过状态图和检查点机制我们能轻松实现复杂的多轮对话管理动手挑战尝试为你的AI添加多个文档来源的RAG支持实现一个记忆重要性评分系统让AI自动判断哪些对话值得长期记忆探索将记忆存储到数据库中实现真正的持久化你在实际项目中是如何处理AI的记忆和知识库问题的有没有遇到什么有趣的挑战或独特的解决方案欢迎在评论区分享你的经验如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】