一、LangChain 文档加载器与文本分割器核心概念这两个模块是RAG检索增强生成的基石解决了「如何把非结构化文档PDF、Word、网页变成大模型能处理的文本块」的问题核心目标是保留语义完整性不能把一句话、一个段落切得支离破碎。1. 文档加载器Document Loaders核心定义文档加载器是 LangChain 中负责把各种格式的非结构化文档PDF、TXT、Word、PPT、网页、Markdown 等加载成标准化Document对象的模块。标准化Document对象每个加载后的文档都会变成一个Document对象包含两个核心属性属性说明示例page_content文档的文本内容这是 PDF 第一页的内容...metadata文档的元数据来源、页码、作者等{source: test.pdf, page: 1}常用文档加载器加载器名称适用格式说明PyPDFLoaderPDF最常用的 PDF 加载器能提取文本和页码TextLoaderTXT纯文本文件加载器Docx2txtLoaderWord (.docx)Word 文档加载器WebBaseLoader网页网页内容加载器DirectoryLoader文件夹批量加载文件夹里的所有文档2. 文本分割器Text Splitters核心定义因为大模型有上下文窗口限制比如doubao-pro-32k是 32k token不能直接把整个几万字的文档放进去所以需要用文本分割器把文档分割成小的、语义完整的文本块Chunks。核心目标保留语义完整性这是文本分割最重要的原则 ——绝对不能把一句话、一个段落、一个主题切在中间否则大模型检索到的是残缺的内容无法正确回答问题。最常用的文本分割器RecursiveCharacterTextSplitter这是 LangChain 官方最推荐、最通用、最能保留语义完整性的分割器它的核心逻辑是递归按优先级分割优先按\n\n段落分隔符分割如果块还是太大按\n换行符分割如果还是太大按。句子结束符分割最后按 空格分割这种设计能最大程度保留段落、句子的完整性不会把语义切散。文本分割的两个关键参数参数作用推荐值说明chunk_size单个文本块的最大大小字符数或 token 数1000-2000 字符 / 500-1000 token根据大模型的上下文窗口调整窗口大可以设大一点chunk_overlap相邻文本块的重叠大小字符数或 token 数200-400 字符 / 100-200 token让相邻块有重叠保留上下文连续性避免语义断裂二、实战加载 PDF 并进行语义完整的文本分割下面是一份完全兼容 LangChain 1.0 最新版本的代码实现了加载本地 PDF 文档用RecursiveCharacterTextSplitter进行语义完整的分割输出分割结果验证语义完整性1. 准备工作1安装依赖pip install -U langchain langchain-community pypdf python-dotenv tiktokenpypdf用于加载 PDF 文档tiktoken用于按 token 数分割更准确控制上下文窗口2. 完整可运行代码import os from dotenv import load_dotenv # LangChain 1.0 最新导入 from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 加载环境变量可选 load_dotenv() # 2. 核心配置 # PDF 文件路径 PDF_PATH test.pdf # 替换成你的 PDF 文件路径 # 文本分割参数语义完整的关键 CHUNK_SIZE 1000 # 单个块的最大字符数推荐 1000-2000 CHUNK_OVERLAP 200 # 相邻块的重叠字符数推荐 200-400保留上下文 # 3. 第一步加载 PDF 文档 def load_pdf(pdf_path: str): 加载本地 PDF 文档 :param pdf_path: PDF 文件路径 :return: Document 对象列表每个元素是 PDF 的一页 print(f 正在加载 PDF{pdf_path}...) # 初始化 PDF 加载器 loader PyPDFLoader(pdf_path) # 加载文档返回 Document 对象列表每个元素对应 PDF 的一页 documents loader.load() print(f✅ PDF 加载完成共 {len(documents)} 页\n) return documents # 4. 第二步语义完整的文本分割 def split_documents(documents): 用 RecursiveCharacterTextSplitter 进行语义完整的文本分割 :param documents: 加载后的 Document 对象列表 :return: 分割后的文本块列表 print(✂️ 正在进行语义完整的文本分割...) # ✅ 核心初始化 RecursiveCharacterTextSplitter最推荐的分割器 text_splitter RecursiveCharacterTextSplitter( chunk_sizeCHUNK_SIZE, chunk_overlapCHUNK_OVERLAP, # 分割优先级按顺序优先保留段落、句子 separators[\n\n, \n, 。, , , , ], # 可选按 token 数分割更准确控制大模型上下文窗口 # length_functionlen, # 默认按字符数 # length_functionlambda text: len(tiktoken.encoding_for_model(gpt-3.5-turbo).encode(text)), # 按 token 数 ) # 执行分割 split_chunks text_splitter.split_documents(documents) print(f✅ 文本分割完成共生成 {len(split_chunks)} 个文本块\n) return split_chunks # 5. 第三步输出分割结果验证语义完整性 def print_split_results(split_chunks, num_to_print3): 打印分割结果验证语义完整性 :param split_chunks: 分割后的文本块列表 :param num_to_print: 打印前几个块 print(f 分割结果预览前 {num_to_print} 个块 ) for i, chunk in enumerate(split_chunks[:num_to_print]): print(f\n【第 {i1} 个文本块】) print(f 来源{chunk.metadata[source]}第 {chunk.metadata.get(page, 未知)} 页) print(f 字符数{len(chunk.page_content)}) print(f 内容\n{chunk.page_content}) print(- * 80) # 6. 主程序 def main(): print( LangChain PDF 加载与语义分割 ) # 1. 加载 PDF documents load_pdf(PDF_PATH) # 2. 语义分割 split_chunks split_documents(documents) # 3. 输出结果验证语义完整性 print_split_results(split_chunks) print(\n 所有步骤完成) print( 提示分割后的 split_chunks 可以直接用于下一步的向量化和 RAG 检索) if __name__ __main__: main()三、代码核心部分详解1. PDF 加载PyPDFLoaderloader PyPDFLoader(pdf_path) documents loader.load()PyPDFLoader会自动提取 PDF 的文本内容和页码返回的documents是一个列表每个元素对应 PDF 的一页是一个Document对象2. 语义分割RecursiveCharacterTextSplitter核心text_splitter RecursiveCharacterTextSplitter( chunk_sizeCHUNK_SIZE, chunk_overlapCHUNK_OVERLAP, # 分割优先级先按段落再按换行再按句子最后按空格 separators[\n\n, \n, 。, , , , ], ) split_chunks text_splitter.split_documents(documents)separators参数是保留语义完整性的关键它定义了分割的优先级优先按段落、句子分割最大程度保留语义chunk_overlap让相邻块有重叠避免上下文断裂四、运行效果演示plaintext LangChain PDF 加载与语义分割 正在加载 PDFtest.pdf... ✅ PDF 加载完成共 5 页 ✂️ 正在进行语义完整的文本分割... ✅ 文本分割完成共生成 12 个文本块 分割结果预览前 3 个块 【第 1 个文本块】 来源test.pdf第 1 页 字符数987 内容 这是一份关于人工智能的测试文档。 人工智能AI是计算机科学的一个分支它企图了解智能的实质并生产出一种新的能以人类智能相似的方式做出反应的智能机器。 该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。 人工智能从诞生以来理论和技术日益成熟应用领域也不断扩大可以设想未来人工智能带来的科技产品将会是人类智慧的“容器”。 -------------------------------------------------------------------------------- 【第 2 个文本块】 来源test.pdf第 1 页 字符数956 内容 人工智能从诞生以来理论和技术日益成熟应用领域也不断扩大可以设想未来人工智能带来的科技产品将会是人类智慧的“容器”。 人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能但能像人那样思考、也可能超过人的智能。 1956年在达特茅斯会议上“人工智能”这一概念被正式提出。 --------------------------------------------------------------------------------你可以看到第 1 个块和第 2 个块有重叠的内容人工智能从诞生以来...这就是chunk_overlap的作用保留了上下文连续性同时每个块都是完整的段落和句子语义完整。五、保留语义完整性的 3 个技巧必须用RecursiveCharacterTextSplitter它是最通用、最能保留语义的分割器不要用简单的CharacterTextSplitter设置合适的chunk_overlap推荐设为chunk_size的 10%-20%让相邻块有重叠保留上下文优先按 token 数分割用tiktoken库按 token 数分割而不是字符数能更准确地控制在大模型的上下文窗口内避免浪费或溢出 根本原因PDF 文本提取失败看你打印出来的结果每个Document的page_content都是空的大概率是这两种情况PDF 是扫描件 / 图片版不是可复制的文本而是图片PyPDFLoader无法直接提取图片里的文字。PDF 有特殊加密 / 字体问题PyPDFLoader对部分字体或加密 PDF 的兼容性差导致提取文本失败。