# LangChain + RAG + 对话记忆实战
LangChain RAG 对话记忆实战前言在大模型应用中RAG检索增强生成已经成为企业级知识库、智能文档问答的标配。它能让大模型读取你的私有文件txt、docx、pdf并基于文件内容精准回答问题不会编造答案。而对话记忆能让 AI 记住历史对话实现连贯的多轮问答。今天我用LangChain搭建一套支持本地私有文档TXT/DOCX/PDF支持 RAG 知识库检索支持对话历史记忆可直接运行、无环境报错的完整智能问答系统。一、核心功能读取本地文档TXT、DOCX 等RAG 检索从文档中精准找答案对话记忆记住你之前说过的话多轮问答上下文连贯兼容在线大模型通义千问/Qwen二、技术原理1. RAG 原理加载文档 → 切分文本 → 向量化 → 构建检索库用户提问 → 检索相关文档片段 → 交给大模型回答2. 对话记忆原理大模型本身无记忆LangChain 通过存储历史对话每次提问自动拼接历史让模型理解上下文实现“记住对话”的效果。三、环境安装pipinstalllangchain langchain-community langchain_openai pipinstalldocx2txt python-docx pypdf sentence-transformers四、完整实战代码# 配置 MODELqwen3-max#######BASE_URLhttps://aiapi.#######.com/qwen/v1API_KEY##########DOCX_FILEtest.txt# 你的文档我是小明今年25岁喜欢打篮球和编程。我最喜欢的编程语言是Python。# fromlangchain_openaiimportChatOpenAIfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.embeddingsimportFakeEmbeddingsfromlangchain_community.vectorstoresimportDocArrayInMemorySearchfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain.chainsimportcreate_history_aware_retriever,create_retrieval_chainfromlangchain.chains.combine_documentsimportcreate_stuff_documents_chainimportwarningsfromlangchain_community.document_loadersimportTextLoader warnings.filterwarnings(ignore)# 加载文档 print(正在加载文档...)loaderTextLoader(DOCX_FILE,encodingutf-8)documentsloader.load()# 文档切分text_splitterRecursiveCharacterTextSplitter(chunk_size800,chunk_overlap100)textstext_splitter.split_documents(documents)# 构建轻量级向量库embeddingsFakeEmbeddings(size100)dbDocArrayInMemorySearch.from_documents(texts,embeddings)retrieverdb.as_retriever(search_kwargs{k:2})# 模型初始化 llmChatOpenAI(modelMODEL,base_urlBASE_URL,api_keyAPI_KEY,temperature0.1,)# 对话记忆模板 # 历史对话理解prompt1ChatPromptTemplate.from_messages([(system,根据对话历史理解用户问题不要忽略用户刚说过的内容),MessagesPlaceholder(chat_history),(human,{input}),])retriever_chaincreate_history_aware_retriever(llm,retriever,prompt1)# 优先遵守用户指令 参考文档prompt2ChatPromptTemplate.from_messages([(system,请遵守用户最新指令如果用户修改信息优先使用最新内容文档仅做参考。文档内容\n\n{context}),MessagesPlaceholder(chat_history),(human,{input}),])doc_chaincreate_stuff_documents_chain(llm,prompt2)rag_chaincreate_retrieval_chain(retriever_chain,doc_chain)# 记忆存储 fromlangchain_community.chat_message_historiesimportChatMessageHistoryfromlangchain_core.runnables.historyimportRunnableWithMessageHistory store{}defget_history(session_id):ifsession_idnotinstore:store[session_id]ChatMessageHistory()returnstore[session_id]# 最终带记忆的RAG链chainRunnableWithMessageHistory(rag_chain,get_history,input_messages_keyinput,history_messages_keychat_history,output_messages_keyanswer,)# 启动对话 print(\n✅ 带记忆的文档问答已启动输入 exit 退出)print(*60)whileTrue:qinput(\n你)ifq.lower()in[exit,q]:print(AI结束)breakreschain.invoke({input:q},config{configurable:{session_id:test1}})print(\nAI,res[answer])五、运行效果展示正在加载文档... ✅ 带记忆的文档问答已启动 你你是谁 AI 我是小明今年25岁喜欢打篮球和编程。我最喜欢的编程语言是Python。 你你现在叫做小红今年30岁喜欢java AI 我是小红今年30岁喜欢打篮球、编程最喜欢的编程语言是Java。 你你现在是谁 AI 我是小红今年30岁喜欢打篮球和编程最喜欢的编程语言是Java。 你你现在不喜欢篮球和编程了你喜欢play piano AI 我是小红今年30岁喜欢弹钢琴最喜欢的编程语言是Java。 你告诉我你是谁 AI 我是小红今年30岁喜欢弹钢琴最喜欢的编程语言是Java。 你那小明是谁呢 AI 小明是你最初设定的角色25岁喜欢打篮球和编程最喜欢的编程语言是Python。 但现在你已经将我的身份更新为小红所以我以小红的身份和你对话。如果你希望切换回小明也可以告诉我哦六、适用场景私有文档智能问答学习资料智能答疑企业知识库报告/论文内容检索带记忆的智能助手