49-LangChain搭RAG问答机器人-从文档上传到智能回答全流程
文章目录【49.PythonAI】用LangChain搭一个RAG问答机器人从文档上传到智能回答全流程导入语1 ~ 用LangChain搭RAG四步走2 ~ 完整代码实现2.1 环境准备2.2 完整RAG流水线2.3 关键参数调优3 ~ Document Loader支持的文件格式思考 总结结尾【49.PythonAI】用LangChain搭一个RAG问答机器人从文档上传到智能回答全流程文章简介本文手把手教你用LangChain框架从零搭建一个完整的RAG问答机器人。内容覆盖Document Loader加载多格式文档、Text Splitter进行语义化分块、Vector Store向量化存储、Retrieval Chain检索链的组装与调优全流程逐行代码讲解。文中配以Mermaid流程图展示RAG的数据管道包含一个可直接运行的完整Demo——上传PDFAI基于文档内容回答问题并附带引用来源适合想快速落地第一个RAG应用的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语前面你选好了向量数据库、搞懂了Embedding模型。但真正上手搭RAG时你会面对一长串问题PDF怎么加载怎么切成合适的块块存在哪检索怎么和LLM串起来用户问的问题怎么在检索之后喂给模型LangChain就是来解决这些组装问题的。它把RAG的每个环节抽象为标准组件你可以像搭乐高一样把它们拼起来。这篇文章的目标用一个完整的Python脚本从PDF加载到智能问答每一步都有代码、每一行都有注释。看完你就能在自己的文档上跑起来。1 ~ 用LangChain搭RAG四步走 PDF文档Document Loader加载并解析Text Splitter语义分块Embeddings向量化Vector Store存储索引❓ 用户问题Retriever检索相关块Prompt模板拼接上下文问题LLM生成回答2 ~ 完整代码实现2.1 环境准备pipinstalllangchain langchain-openai chromadb pypdf tiktoken2.2 完整RAG流水线# rag_bot.py —— 从PDF到智能问答一个文件搞定fromlangchain_openaiimportChatOpenAI,OpenAIEmbeddingsfromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_chromaimportChromafromlangchain.chainsimportcreate_retrieval_chainfromlangchain.chains.combine_documentsimportcreate_stuff_documents_chainfromlangchain_core.promptsimportChatPromptTemplate# Step 1加载PDF loaderPyPDFLoader(公司规章制度.pdf)documentsloader.load()print(f加载了{len(documents)}页文档)# 每一页是一个Document对象包含page_content和metadata(页码等)# Step 2文本分块 text_splitterRecursiveCharacterTextSplitter(chunk_size500,# 每块500字符chunk_overlap100,# 块之间重叠100字符保持语义连续性separators[\n\n,\n,。,, ,]# 优先按段落→句子→词分割)chunkstext_splitter.split_documents(documents)print(f分割为{len(chunks)}个文本块)# Step 3向量化并存储 embeddingsOpenAIEmbeddings(modeltext-embedding-3-small)vector_storeChroma.from_documents(documentschunks,embeddingembeddings,collection_namecompany_rules,persist_directory./chroma_db# 持久化下次不用重新向量化)# Step 4构建检索生成链 llmChatOpenAI(modelgpt-3.5-turbo,temperature0.2)# 定义Prompt模板告诉模型如何使用检索到的上下文system_prompt(你是一个企业知识库助手。根据以下检索到的文档片段回答问题。如果文档中没有相关信息就说文档中未提及不要编造。回答时注明引用的来源。\n\n检索到的文档片段\n{context})promptChatPromptTemplate.from_messages([(system,system_prompt),(human,{input}),])# 组装文档填充链 检索链document_chaincreate_stuff_documents_chain(llm,prompt)retrievervector_store.as_retriever(search_typesimilarity,# 相似度检索search_kwargs{k:4}# 每次检索4个最相关块)rag_chaincreate_retrieval_chain(retriever,document_chain)# 开始问答 if__name____main__:print( RAG问答机器人已就绪输入 quit 退出\n)whileTrue:questioninput(你的问题)ifquestion.lower()quit:breakresponserag_chain.invoke({input:question})print(f\n回答{response[answer]}\n)# 显示引用来源print(引用来源)fori,docinenumerate(response[context],1):print(f [{i}] 第{doc.metadata.get(page,?)}页:{doc.page_content[:100]}...)print(-*50)2.3 关键参数调优参数默认值调优建议chunk_size500短文本200300长文档8001000chunk_overlap100通常设为chunk_size的20%保持语义连续性search_kwargs[k]4简单问题23个复杂推理问题68个temperature0.2RAG场景保持低值0~0.3足够separators见上文中文文档优先用。和做分隔符3 ~ Document Loader支持的文件格式# PDFfromlangchain_community.document_loadersimportPyPDFLoader# Word文档fromlangchain_community.document_loadersimportDocx2txtLoader# 纯文本fromlangchain_community.document_loadersimportTextLoader# CSV每行作为一条记录fromlangchain_community.document_loadersimportCSVLoader# 网页fromlangchain_community.document_loadersimportWebBaseLoader# 整个目录fromlangchain_community.document_loadersimportDirectoryLoader思考 总结LangChain把RAG拆成四个标准步骤Load → Split → Embed Store → Retrieve Generate。每步都有几行代码的模板组合起来就是一个完整应用。RecursiveCharacterTextSplitter是中文文档最好的分块器按段落→句子→词的顺序递进分割比固定长度切分保持语义完整性更好。create_retrieval_chain一行封装了整个检索生成链背后是Retriever查向量库 → 拼接Prompt → 喂给LLM的完整流水线。chunk_overlap是防止关键信息被切断的保险100字符重叠意味着同一句话可能在相邻两个块中都完整出现。温度设低是RAG的铁律你的答案应该来自检索到的文档不是模型的自由发挥。30行核心代码就能搭一个可用的RAG问答系统——这就是LangChain的抽象能力。但理解每个组件在做什么比会用API更重要。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士 — Android Framework 全栈开发关注| ❤️点赞| ⭐收藏把完整脚本存好下个项目直接改 | 评论| 一键四连️寄语最好的学习方式就是用自己的文档跑一遍——找一份PDF让AI基于它回答你的问题。结语找一份你熟悉的PDF文档把上面的脚本拷过去改一下文件路径。跑起来问它一个问题——看到AI基于你的文档给出准确回答的那一刻你就真正理解了RAG。不要忘记给博主一键四连哦