乐于分享
好东西不私藏

LangChain文档加载|实现本地文档问答(PDF/Word/TXT) Day4

LangChain文档加载|实现本地文档问答(PDF/Word/TXT) Day4

【开篇前言】

    大家好,我是胖哥,前面3天咱们学会了LangChain的基础组件(提示词模板、链、记忆),能实现简单的AI交互和多轮对话,但这些都是基于“大模型自带知识”的交互——如果我们想让AI基于「自己的本地文档」(比如PDF、Word、TXT)回答问题,该怎么做?

这就是今天的核心内容:LangChain文档加载与处理,也是实战开发中最常用的功能之一(比如企业文档查询、论文解读、个人笔记问答等)。

今天咱们全程实战,手把手教你加载本地文档(以PDF为例,Word/TXT同理),搭建一个“本地文档问答机器人”,代码可直接复制运行,新手也能轻松上手,学会就能直接落地实用需求!

## 一、核心知识点:文档加载的核心逻辑

让AI基于本地文档回答问题,核心分为3步,这也是LangChain处理文档的标准流程:

1. 加载文档(Load):用LangChain的文档加载器,读取本地PDF/Word/TXT等文件,将其转化为LangChain可处理的格式

2. 分割文档(Split):将加载的文档分割成小块(因为大模型有上下文长度限制,无法处理过长文本)

3. 问答交互(Query):结合大模型和文档内容,让AI基于分割后的文档片段,回答用户的问题

【配图提示】:LangChain文档处理流程图,展示“加载文档 → 分割文档 → 问答交互”的完整流程,标注每个步骤的核心组件,配图放入C:\WorkBuddy\公众号,命名为Day4-1-文档处理流程图.png

## 二、实战准备:安装文档加载依赖

处理不同类型的文档,需要安装对应的依赖包,今天以最常用的PDF为例,安装相关依赖,复制代码即可完成安装。

【代码片段】(公众号排版用代码块,标注Python语言)

“`python

# 安装PDF加载依赖(核心依赖)pip install pypdf==4.2.0# 安装文档分割依赖(LangChain内置,需单独安装)pip install langchain-text-splitters==0.0.1# 安装可选依赖(处理Word/TXT文档,按需安装)# pip install python-docx  # 处理Word文档# pip install python-multipart  # 处理TXT文档```## 三、实战1:加载本地PDF文档并分割先实现“加载PDF文档 → 分割文档”的核心步骤,这里以本地一个PDF文件(比如“LangChain官方文档摘要.pdf”)为例,代码可直接复制,只需修改PDF文件路径。【代码片段】(公众号排版用代码块,标注Python语言)```pythonfrom langchain.document_loaders import PyPDFLoader  # PDF加载器from langchain.text_splitter import RecursiveCharacterTextSplitter  # 文档分割器# 1. 加载本地PDF文档(修改为你的PDF文件路径)pdf_path = "C:\\WorkBuddy\\公众号\\LangChain官方文档摘要.pdf"# 示例路径loader = PyPDFLoader(pdf_path)documents = loader.load()  # 加载文档,返回文档列表(每一页为一个文档对象)print(f"PDF总页数:{len(documents)}")print(f"第一页内容预览:{documents[0].page_content[:200]}...")  # 预览第一页前200字# 2. 分割文档(解决大模型上下文长度限制)text_splitter = RecursiveCharacterTextSplitter(    chunk_size=500,  # 每个文档片段的长度(500字符)    chunk_overlap=50,  # 片段之间的重叠长度(50字符),避免分割丢失上下文    length_function=len  # 长度计算方式(按字符数))# 执行分割,得到分割后的文档片段列表split_documents = text_splitter.split_documents(documents)print(f"分割后的文档片段数量:{len(split_documents)}")print(f"第一个片段内容:{split_documents[0].page_content}")

“`

【代码说明】:

 PyPDFLoader:LangChain专门用于加载PDF文档的加载器,支持多页PDF,每一页会被视为一个独立的文档对象

 RecursiveCharacterTextSplitter:最常用的文档分割器,按字符数分割,chunk_size控制每个片段的长度,chunk_overlap控制片段重叠度(避免分割后上下文断裂)

 文档路径:需修改为你本地PDF的实际路径,注意路径中的反斜杠用双反斜杠(\\)或单斜杠(/)

## 四、实战2:搭建本地PDF问答机器人

加载并分割文档后,结合大模型,实现“用户提问 → AI基于PDF内容回答”的功能,这是最核心的实战环节,代码可直接复制运行。

【代码片段】(公众号排版用代码块,标注Python语言)

“`python

from langchain.document_loaders import PyPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.llms import OpenAIfrom langchain.chains import RetrievalQA  # 检索式问答链from langchain.vectorstores import FAISS  # 本地向量存储(用于存储文档片段)from langchain.embeddings import OpenAIEmbeddings  # 嵌入模型(用于将文本转化为向量)import os# 1. 配置API密钥os.environ["OPENAI_API_KEY"] = "你的API密钥"# 2. 加载并分割PDF文档(复用上面的代码)pdf_path = "C:\\WorkBuddy\\公众号\\LangChain官方文档摘要.pdf"loader = PyPDFLoader(pdf_path)documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(    chunk_size=500,    chunk_overlap=50)split_documents = text_splitter.split_documents(documents)# 3. 将文档片段转化为向量,存储到本地FAISS向量库embeddings = OpenAIEmbeddings()  # 嵌入模型,将文本转化为可检索的向量vector_store = FAISS.from_documents(split_documents, embeddings)  # 构建向量库# 4. 初始化检索式问答链(串联向量库、大模型,实现问答)qa_chain = RetrievalQA.from_chain_type(    llm=OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.7),    chain_type="stuff",  # 最简单的问答类型,将相关文档片段传入大模型    retriever=vector_store.as_retriever(k=2),  # 检索最近的2个相关文档片段    return_source_documents=True# 返回回答的来源文档(方便验证答案准确性))# 5. 问答测试(基于PDF内容回答问题)print("PDF问答机器人(输入'退出'结束):")whileTrue:    user_question = input("你:")if user_question == "退出":        print("AI:再见!有任何问题随时来问~")break# 调用问答链,获取回答和来源文档    result = qa_chain({"query": user_question})    print(f"AI:{result['result']}")# 打印回答的来源文档(可选,方便验证)    print("\n回答来源:")for doc in result["source_documents"]:        print(f"- 第{doc.metadata['page']+1}页:{doc.page_content[:100]}...")    print("-" * 50)```

【代码说明】:

 FAISS:Facebook开源的本地向量存储库,用于存储文档片段的向量,支持快速检索相关文档,无需联网,本地即可运行

 OpenAIEmbeddings:将文本转化为向量的嵌入模型,只有将文本转化为向量,才能实现“检索相关文档”的功能

 RetrievalQA:检索式问答链,核心逻辑是“用户提问 → 检索向量库中最相关的文档片段 → 传入大模型 → 生成回答”

 return_source_documents=True:开启后,会返回回答对应的来源文档(页码、内容),方便验证答案是否来自PDF

【测试示例】:

你:LangChain的核心组件有哪些?

AI:LangChain的核心组件包括提示词模板(PromptTemplate)、链(Chain)、记忆(Memory)、代理(Agent)、文档加载器(Document Loader)等,这些组件可以灵活组合,实现复杂的AI应用…

回答来源:

 第2页:LangChain的核心组件包括提示词模板、链、记忆、代理、文档加载器等,每个组件都有其独特的作用,共同构成了LangChain的完整生态…

 第3页:提示词模板用于标准化输入,链用于串联逻辑,记忆用于存储对话上下文,代理用于实现复杂的决策逻辑…

## 五、胖哥专属:实战技巧与避坑指南

1. 文档路径问题:务必确保PDF路径正确,Windows系统路径用双反斜杠(\\),Mac/Linux用单斜杠(/),避免路径错误导致加载失败

2. chunk_size调整:根据大模型的上下文长度调整,比如gpt-3.5-turbo-instruct的上下文长度是4096字符,chunk_size建议设为500-1000

3. 多文档支持:如果需要加载多个PDF/Word,可使用PyPDFDirectoryLoader(加载文件夹下所有PDF)、DocxLoader(加载Word),用法和PyPDFLoader类似

4. 国内模型适配:后续会讲用文心一言、通义千问替代OpenAI,无需科学上网,同样能实现文档问答

【结尾互动】

今天咱们实现了本地PDF问答机器人,这是LangChain实战开发中非常实用的功能,学会后可以直接用于处理自己的文档、论文、笔记等!

大家可以动手测试,替换成自己的PDF文件,提问相关问题,看看AI能否准确回答,有任何问题(比如路径错误、依赖安装失败),评论区留言,胖哥帮你排查!

明天咱们学习Day5:LangChain代理(Agent),让AI拥有“自主决策能力”,能自动调用工具、解决复杂问题,离独立开发完整AI应用又近一步!